利用ActivityLifecycleCallbacks判斷APP是否在後臺運行

Android 在SDK 14提供了一個Callback即ActivityLifecycleCallbacks,在Application中通過註冊這個Callback可拿到App所有Activity的生命週期回調。解除註冊可以調用Application中的unregisterActivityLifecycleCallbacks。

Application.java

...

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

...

Demo

CustomApplication.java

public class CustomApplication extends Application {

    private static CustomApplication instance;

    // Android 生命週期監聽
    private ActivityLifeListener activityLifeListener;

    // 可見 Activity 個數
    private int activityCount;

    // 判斷是否已經顯示對話框
    private boolean isShowDialog;

    @Override
    public void onCreate() {
        super.onCreate();
        CustomApplication.instance = this;

        activityLifeListener = new ActivityLifeListener();
        this.registerActivityLifecycleCallbacks(activityLifeListener);
    }

    public static CustomApplication getInstance() {
        return instance;
    }

    /**
     * 判斷 App 是否在前臺運行
     */
    public boolean isBackground() {
        return activityCount == 0;
    }

    private class ActivityLifeListener implements ActivityLifecycleCallbacks{

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

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

        @Override
        public void onActivityResumed(Activity activity) {
            if (!isShowDialog) {
                isShowDialog = true;
                new AlertDialog.Builder(activity)
                        .setTitle("提示")
                        .setMessage("這個對話框只有按Home鍵之後再回來才顯示")
                        .setPositiveButton("確定", null)
                        .create()
                        .show();
            }
        }

        @Override
        public void onActivityPaused(Activity activity) {}

        @Override
        public void onActivityStopped(Activity activity) {
            activityCount--;
            if (isBackground()) {
                // initialization something
                isShowDialog = false;
            }
        }

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

        @Override
        public void onActivityDestroyed(Activity activity) {}

    }

}

Activity的生命週期

Activity生命週期

  • HOME鍵的執行順序:onPause->onStop->onRestart->onStart->onResume.
  • BACK鍵的順序: onPause->onStop->onDestroy->onCreate->onStart->onResume.
  • onPause不要做太耗時的工作.
  • onCreate 與 onDestory 匹配.
  • onStart 與 onStop 匹配.
  • onResume 與 onResume 匹配.
  • onStart 與 onResume 都表示在前臺運行, 區別在於 onStart 不可見, onResume 可見.

參考資料:
1. http://blog.csdn.net/lfdfhl/article/details/51045414

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章