1. 程式人生 > >[前臺,後臺]android 如何判斷app 執行在後臺

[前臺,後臺]android 如何判斷app 執行在後臺

app 開發中,經常可能會涉及到判斷app 是否執行在後臺。比如需要在後臺啟動執行Service, 或者需要從後臺切換回前臺時,做一些update 操作的等等。這些都需要我們能夠監測到app 執行到後臺。

最開始的時候我們採用的是監聽系統的廣播來實現,主要是監聽Intent.ACTION_CLOSE_SYSTEM_DIALOGS 和 Intent.ACTION_SCREEN_OFF 這兩個系統廣播,監聽的程式碼放在我們app 的 RootActivity (啟動方式為 singleTask )裡面。
Receiver 的大概程式碼如下:

    final String SYSTEM_DIALOG_REASON_KEY = "reason"
; final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; final String SYSTEM_DIALOG_REASON_LOCK_KEY = "lock"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if
(reason != null && (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY) || reason.equals(SYSTEM_DIALOG_REASON_LOCK_KEY))) { setAppGoBackground(true); } } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { setAppGoBackground(true
); } } }

這種方式雖然能夠監聽到使用者按HOME鍵以及鎖屏使app切換到後臺的動作。但是總覺得這種方式不夠優雅。

其實 android 在從sdk14 開始為我們提供了一個新的api 用於檢測app 中activity 的生命週期,正好我們app 的minSdkVersion 已經設定為 14 了。 所以現在我們可以使用ActivityLifecycleCallbacks來 監聽app 是否執行在後臺的行為了。

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

根據 Activity 的生命週期,知道onStart() 一般表示一個Activity 處於前臺,onStop() 一般表示Activity在後臺不可見。所以我們設定一個int refCount 變數, onActivityStarted 的時候refCount++, onActivityStopped的時候refCount–。當onActivityStopped之後如果refCount == 0 了。那麼表示我們的app裡面沒有處於onStart的Activity 了,
也就相當於 app 已經處於後臺了。

 class ActivityLifecycleListener implements ActivityLifecycleCallbacks{

        private int refCount = 0;

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

        }

        @Override
        public void onActivityStarted(Activity activity) {
            refCount++;
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {
            refCount--;
            if(refCount == 0){
                setAppGoBackGround(true);
            }
        }

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

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    }

然後在app 裡面的 Application onCreate()方法註冊即可:

registerActivityLifecycleCallbacks(new ActivityLifecycleListener());

是不是超級EASY.

更多關於App執行在後臺的判斷方法,你還可以參考 這個專案。

參考: