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運行在后臺的判斷方法,你還可以參考AndroidProcess 這個項目。

參考:

https://github.com/wenmingvs/AndroidProcess
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,813評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,497評論 0 17
  • 最近剛從舊公司離職,為面試在做準備,因為平時開發CV大法用得比較多,很多基礎知識掌握得不是很牢靠以及很多工具框架只...
    黎清海閱讀 2,223評論 1 19
  • 1.什么是Activity?問的不太多,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應一個activit...
    JoonyLee閱讀 5,754評論 2 51
  • 感覺充滿了土氣。一些游樂項目非常土。 主要是去爬山,5000米上山路,走得很累,一上去沒多久又下來了,下山更累。 ...
    菠00閱讀 167評論 0 0