天天看點

利用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 == ;
    }

    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的生命周期

利用ActivityLifecycleCallbacks判斷APP是否在背景運作
  • 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