簡體   English   中英

如何知道您何時因為返回按鈕而返回活動?

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

我的 MainActivity 導致 SecondActivity。 如果用戶按下手機的后退按鈕,應用程序將返回 MainActivity。

發生這種情況時我該如何執行?

(我知道我可以在 SecondActivity 中添加代碼以向后退按鈕添加功能,以便將結果傳遞給 MainActivity,但我不想對可能導致返回 MainActivity 的每個可能的屏幕都這樣做。)

也許換一種方式問,我怎么知道 MainActivity 是因為按下后退按鈕而不是被正式請求而顯示的?

背景

我認為這是實現此要求的邏輯:

  1. 當用戶在當前活動上按下返回鍵時,我們會記住那個動作。

  2. 當用戶 go 回到上一個活動時,我們將檢查是否有返回鍵按下動作退出。

執行

步驟 1.創建一個名為 BaseActivity 的基礎活動BaseActivity 您應用程序中的每個活動都應該從這個 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)監聽應用程序的所有活動生命周期

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);
    }
}

編輯:檢查是否有任何活動(不知道是哪個活動)返回到所需的活動

要簽入活動 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();
    }

然后再次在活動 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

我希望這有幫助!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM