【问题标题】:How to know when you returned to an activity because of the back button?如何知道您何时因为返回按钮而返回活动?
【发布时间】:2020-12-04 00:27:59
【问题描述】:

我的 MainActivity 导致 SecondActivity。如果用户按下手机的返回按钮,应用程序会返回到 MainActivity。

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

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

也许换一种方式问,我怎么知道 MainActivity 是因为按下后退按钮而不是被正式请求而显示的?

【问题讨论】:

    标签: android android-studio android-activity


    【解决方案1】:

    背景

    我认为这是实现此要求的逻辑:

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

    2. 当用户返回到上一个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);
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      要签入活动 A,请使用:

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

      如评论中所述,onResume 将在以下情况下调用活动/片段:

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

      但是,您无法追踪是什么触发了它,或者它之前发生了什么。


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


      在活动 A 和活动 B 之间

      使用

      startActivityForResult(intent, CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS);
      

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

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

      然后在 Activity 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个部分都实现了,你不需要检查是哪个activity触发了back press,你可以简单的对比一下request和result code

      我希望这会有所帮助!

      【讨论】:

      • 但是如果我不知道你来自哪里怎么办?或者如果我无法控制它,例如如果用户点击通知会导致另一个应用程序,然后他们按下返回按钮返回到我的应用程序?
      • ^ 也许这意味着我的问题是错误的问题。也许我在问,“我怎么知道我的活动何时被带到前面并显示在屏幕上?
      • 那么你需要实现 onResume 和 onStart 调用。每次恢复活动/片段时,onResume 都会通知您。但是, onResume 不会提供关于是什么使它恢复的上下文。 onResume 也会在活动开始时被调用一次。
      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 2021-12-29
      相关资源
      最近更新 更多