Android 如何知道何时由于“后退”按钮而返回到活动?

Android 如何知道何时由于“后退”按钮而返回到活动?,android,android-studio,android-activity,Android,Android Studio,Android Activity,我的主要活动导致第二个活动。如果用户按下手机的后退按钮,应用程序将返回主活动 发生这种情况时,我如何执行某些操作 (我知道我可以在SecondActivity中添加代码,将功能添加到back按钮,以便它将结果传递给MainActivity,但我不想在每个可能导致返回MainActivity的屏幕上都这样做。) 也许是另一种提问方式,我如何知道MainActivity是因为按下了后退按钮而显示的,而不是因为有意图而被正式请求的?背景 我认为以下是实现这一要求的逻辑: 当用户在当前活动上按back键

我的主要活动导致第二个活动。如果用户按下手机的后退按钮,应用程序将返回主活动

发生这种情况时,我如何执行某些操作

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


也许是另一种提问方式,我如何知道MainActivity是因为按下了后退按钮而显示的,而不是因为有意图而被正式请求的?

背景

我认为以下是实现这一要求的逻辑:

  • 当用户在当前活动上按back键时,我们将记住该操作

  • 当用户返回到上一个活动时,我们将检查是否存在按下后退键的操作退出

  • 实施

    步骤1。创建名为
    BaseActivity
    的基本活动类。应用程序中的每个活动都应该从此类扩展

    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
    的类。其目的是通过使用

    请记住将此类添加到
    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>
    
    SecondActivity.java


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

    要签入活动A,请使用:

    @Override
    protected void onResume() {
        super.onResume();
        // TODO: Work
    }
    
    如注释中所述,在以下情况下,将对活动/片段调用onResume:

  • 活动首次运行
  • 活动重新成为焦点(从另一个活动、启动器、最近的、另一个应用程序)
  • 但是,您无法跟踪是什么触发了它,或者在它之前发生了什么


    ----------过时的----------


    在活动A和活动B之间

    使用

    在活动A和活动B中,使用

        @Override
        public void onBackPressed() {
            setResult(CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS);
            finish();
        }
    
    然后在活动A中再次使用

    @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个部分,则无需检查触发了反按的活动,只需比较请求代码和结果代码即可


    我希望这有帮助

    但是如果我不知道你从哪里来呢?或者如果我无法控制它,例如如果用户点击一个通知,导致另一个应用程序,然后他们按下返回按钮,返回到我的应用程序?^这可能意味着我的问题是错误的。也许我会问,“我怎么知道我的活动何时会出现在屏幕上?然后你需要实现onResume和onStart调用。onResume会在每次活动/片段恢复时通知你。但是,onResume不会提供使它恢复的上下文。当活动开始时,onResume也会被调用一次。
    @Override
    protected void onResume() {
        super.onResume();
        // TODO: Work
    }
    
    startActivityForResult(intent, CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS);
    
        @Override
        public void onBackPressed() {
            setResult(CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS);
            finish();
        }
    
    @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
        }
    }