初識 ActivityLifecycleCallbacks

看了 stay 的視頻瞭解到判斷 app 是否在後臺運行除了使人蛋疼的判斷當前 runningProcess 或者 runningTasks 方法, 還有一種更爲簡便的方法, 那就是 ActivityLifecycleCallbacks.html

###官方文檔 官方文檔居然連介紹都沒有, 官方文檔android

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 從建立到銷燬的回調方法.app

咱們使用的時候實現這個接口, 而後在咱們自定義的 Application 調用初始化. 全部 Activity 的生命週期都會回調上面的方法.
初始化的時候須要註冊它 application.registerActivityLifecycleCallbacks(this);ide

那咱們判斷 app 在不在前臺的依據是什麼呢?ui

首先來看一張 Activity 的生命週期圖:
this

activityLife

它每一個方法的說明: spa

activityVoid

官方文檔 Activity 連接code

能夠看到, onStart() 是即將對用戶可見時調用, 也就是即將在前臺的時候, 對應的就是 onStop() , 對用戶再也不可見時調用. 因此在這 2 個方法來對 app 是否在前臺作出判斷.component

咱們定義一個計數器 int activeCount 來記錄 Activity 活動的個數, Activity 調用 onStart 就 +1, onStop 就 -1. 在 onResumed 的時候就是在前臺的時候. 同時也能夠定義一個 long time, 定義在 app 在前臺呆了多長時間.視頻

public class AppStatusTracker implements Application.ActivityLifecycleCallbacks {  

    private static final long MAX_INTERVAL = 5 * 60 * 1000;
    private static AppStatusTracker tracker;
    private Application application;
    private boolean isForground;
    private int activeCount;
    private long timestamp;
   

    private AppStatusTracker(Application application) {
        this.application = application;
        application.registerActivityLifecycleCallbacks(this);
    }

    public static void init(Application application) {
        tracker = new AppStatusTracker(application);
    }

    public static AppStatusTracker getInstance() {
        return tracker;
    }

   


    public boolean isForground() {
        return isForground;
    }

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

    }

    @Override
    public void onActivityStarted(Activity activity) {
        
        if (activeCount == 0){
            timestamp = System.currentTimeMillis();
        }
        activeCount++;
    }

    @Override
    public void onActivityResumed(Activity activity) {
        isForground = true;
    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

        activeCount--;
        if (activeCount == 0) {
            isForground = false;
            timestamp = System.currentTimeMillis() - timestamp;
        }
    }

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

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }
}
複製代碼

而後在本身的 application 裏面初始化就能夠了.

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AppStatusTracker.init(this
        );
    }
}
複製代碼

邏輯挺簡單的呵呵. 不過這個功能只在 4.0 之上可用, 不過如今應該基本都是 4.0 以上的手機了吧. 除了這個簡單的功能, 還能夠加入一個廣播來判斷屏幕熄滅後要作的邏輯. 後面等我摸索熟了再來實現.

相關文章
相關標籤/搜索