如何知道您何时因后退按钮返回到 activity?

How to know when you returned to an activity because of the back button?

我的 MainActivity 导致 SecondActivity。如果用户按下 phone 的后退按钮,应用程序将返回到 MainActivity。

发生这种情况时我该如何执行?

(我知道我可以在 SecondActivity 中添加代码以向后退按钮添加功能,以便将结果传递给 MainActivity,但我不想对每个可能返回 MainActivity 的屏幕都这样做。 )

也许是另一种提问方式,我怎么知道 MainActivity 正在显示是因为按下后退按钮而不是有意向地正式请求?

背景

我认为实现这个需求的逻辑是这样的:

  1. 当用户在当前 activity 上按下返回键时,我们会记住该操作。

  2. 当用户回到上一个activity,我们会检查是否有返回键按下动作退出。

实施

步骤 1. 创建一个名为 BaseActivity 的基地 activity class。您应用中的每个 activity 都应该从这个 class.

扩展
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 的 class,它从应用程序 class 扩展而来。它的目的是通过使用 registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks)

来监听应用程序的所有 activity 生命周期
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) {
        }
    }
}

记得把这个class加到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);
    }
}

编辑:检查是否有任何 activity (不知道是哪个) 返回到所需的 activity

要签入 Activity A,请使用:

@Override
protected void onResume() {
    super.onResume();
    // TODO: Work
}

如评论中所述,onResume 将在 activity/fragment 上调用,当:

  1. Activity 第一次运行
  2. Activity 重新成为焦点(来自另一个 activity、启动器、最近、另一个应用)

但是,您无法追踪是什么触发了它,也无法追踪它之前发生的事情。


------------ 已过时 ----------


在 Activity A 和 Activity B 之间

使用

startActivityForResult(intent, CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS);

在Activity A中,在Activity B中,使用

    @Override
    public void onBackPressed() {
        setResult(CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS);
        finish();
    }

然后再在ActivityA中,使用

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS && resultCode==CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS) {
        // TODO: Do your work
    }
}

如果实现了这3个部分,就不需要检查是哪个activity触发了back press,直接比较request和result code就可以了

希望对您有所帮助!!