背景
我认为这是实现此要求的逻辑:
-
当用户在当前活动上按下返回键时,我们会记住该操作。
-
当用户返回到上一个activity时,我们会检查是否有返回键按下动作退出。
实施
第 1 步。 创建一个名为 BaseActivity 的基本活动类。您应用中的每个 Activity 都应该从此类扩展而来。
class BaseActivity extends AppCompatActivity {
public static String IS_BACK_KEY_PRESSED = "IS_BACK_KEY_PRESSED";
@Override
public void onBackPressed() {
// Remember the user's press of the back key action
getIntent().putExtra(IS_BACK_KEY_PRESSED, true);
// Call the super's method
super.onBackPressed();
}
/**
* Called when the activity has been resumed from an activity
* that has been destroyed because of user's press of the back key
*/
public void onGoBackFromAnotherActivity() {
}
}
第 2 步。 创建一个名为 MyApp 的类,该类继承自 Application 类。其目的是通过registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks)监听应用程序的所有活动生命周期
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacksImpl());
}
private static final class ActivityLifecycleCallbacksImpl implements ActivityLifecycleCallbacks {
boolean isBackKeyPressed = false;
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (activity instanceof BaseActivity) {
if (isBackKeyPressed) {
((BaseActivity) activity).onGoBackFromAnotherActivity();
isBackKeyPressed = false;
}
}
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
if (activity instanceof BaseActivity) {
Bundle data = activity.getIntent().getExtras();
if (data != null) {
isBackKeyPressed = data.getBoolean(BaseActivity.IS_BACK_KEY_PRESSED);
} else {
isBackKeyPressed = false;
}
}
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
}
}
记得把这个类添加到AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.kotlinapp">
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity" />
</application>
</manifest>
用法
MainActivity.java
public class MainActivity extends BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onGoBackFromAnotherActivity() {
// Your code logic goes here.
}
}
SecondActivity.java
public class SecondActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}