1. 程式人生 > >【Android】App應用前後臺切換的一種監聽方法

【Android】App應用前後臺切換的一種監聽方法

Android本身並沒有提供監聽App的前後臺切換操作的方法。最近看到一種簡單巧妙的方法來監聽前後臺,這裡分享記錄一下。

一、Activity生命週期

我們知道在Android中,兩個Activity,分別為A和B。假設此時A在前臺,當A啟動B時,他們倆之間的生命週期關係如下,可以參考之前的這篇文章【Android】Activity與Fragment的生命週期的關係

A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()

也就是說B的onStart()方法是在A的onStop()方法之前執行的,我們可以根據這點來做文章。在所有Activity的onStart()和onStop()方法中進行計數,計數變數為count,在onStart中將變數加1,onStop中減1。

那麼這個count在整個App的生命週期裡的值就會像下面這樣:

count
2|          _     _     _     _
1|     ____| |___| |___| |___| |____
0| ___|                             |___
 ===========================================> 時間
      a     b     c                 d

橫軸表示時間,縱軸表示count的值。那麼a、b、c、d四個時間點發生的事情如下:

  1. a點就是啟動了應用;
  2. b點是Activity_A啟動了另一個Activity_B
  3. c點是Activity_B啟動了另一個Activity_C,後面以此類推;
  4. d點是應用切換到了後臺;

從上面的情況看出,可以通過對count計數為0,來判斷應用被從前臺切到了後臺。同樣的,從後臺切到前臺也是類似的道理。具體實現看後面的程式碼。

具體的實現中,我們可以實現一個BaseActivity,然後讓其他所有Activity都繼承自它,然後在生命週期函式中做相應的檢測。還有更簡單的方法,Android在API 14之後,在Application類中,提供了一個應用生命週期回撥的註冊方法,用來對應用的生命週期進行集中管理,這個介面叫registerActivityLifecycleCallbacks()

,可以通過它註冊自己的ActivityLifeCycleCallback,每一個Activity的生命週期都會回撥到這裡的對應方法。

//原始碼位於Application類中
public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

其實這個註冊方法的本質和我們實現BaseActivity是一樣的,只是將生命週期的管理移到了Activity本身的實現中。

二、實現

public class TheApplication extends Application {

    private int mFinalCount;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                mFinalCount++;
                //如果mFinalCount ==1,說明是從後臺到前臺
                if (mFinalCount == 1){
                    //說明從後臺回到了前臺
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {
            }

            @Override
            public void onActivityPaused(Activity activity) {
            }

            @Override
            public void onActivityStopped(Activity activity) {
                mFinalCount--;
                //如果mFinalCount == 0,說明是前臺到後臺
                if (mFinalCount == 0){
                    //說明從前臺回到了後臺
                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }
}

參考資料