1. 程式人生 > >使用ActivityLifecycleCallbacks監聽前後臺,獲取當前Activity

使用ActivityLifecycleCallbacks監聽前後臺,獲取當前Activity

一、ActivityLifecycleCallbacks介面介紹

API 14之後,在Application類中,提供了一個應用生命週期回撥的註冊方法,用來對應用的生命週期進行集中管理,這個介面叫registerActivityLifecycleCallbacks,可以通過它註冊自己的ActivityLifeCycleCallback,每一個Activity的生命週期都會回撥到這裡的對應方法。

Activity生命週期圖
在這裡插入圖片描述

ActivityLifecycleCallbacks介面程式碼

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的限制還是Activity的狀態統計都是非常方便的,裡面還有一個void onActivitySaveInstanceState(Activity activity, Bundle outState) 方法,非常方便我們來儲存Activity狀態資料。

二、ActivityLifecycleCallbacks 使用

package com.sunpeng.lifecycle;

import android.app.Application;

public class MainApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // AppLifecycleCallback 實現 ActivityLifecycleCallbacks 介面方法
        this.registerActivityLifecycleCallbacks(new AppLifecycleCallback());
    }
}

三、Demo – 使用ActivityLifecycleCallbacks獲取當前Activity

自定義一個ActivityLifecycleg管理類ActivityLifecycleMonitor

  1. 定義一個集合private final Set<ActivityLifecycleCallbacks> lifecycleCallbacks = new HashSet();用於外部類呼叫新增 ActivityLifecycleCallbacks物件

  2. 定義一個弱引用private WeakReference<Activity> foregroundActivity = null;

    即當前Activity 物件

  3. new一個 ActivityLifecycleCallbacks - rootLifecycleCallback物件,在 onResume 和 onPause 裡分別對 foregroundActivity 賦值,動態獲取當前 Activity;
    在每個回撥都遍歷 lifecycleCallbacks 集合,為集合裡的每個物件設定回撥

private final ActivityLifecycleCallbacks rootLifecycleCallback = new ActivityLifecycleCallbacks() {

	public void onActivityResumed(Activity activity) {

            if (ActivityLifecycleMonitor.this.foregroundActivity != null) {
                ActivityLifecycleMonitor.this.foregroundActivity.clear();
                ActivityLifecycleMonitor.this.foregroundActivity = null;
            }

            ActivityLifecycleMonitor.this.foregroundActivity = new WeakReference(activity);

            Iterator var2 = ActivityLifecycleMonitor.this.lifecycleCallbacks.iterator();

            while (var2.hasNext()) {
                ActivityLifecycleCallbacks callback = (ActivityLifecycleCallbacks) var2.next();
                if (callback != null) {
                    try {
                        callback.onActivityResumed(activity);
                    } catch (Exception e) {
                    }
                }
            }

        }

        public void onActivityPaused(Activity activity) {

            if (ActivityLifecycleMonitor.this.foregroundActivity != null) {
                ActivityLifecycleMonitor.this.foregroundActivity.clear();
            }

            ActivityLifecycleMonitor.this.foregroundActivity = null;
            
            Iterator var2 = ActivityLifecycleMonitor.this.lifecycleCallbacks.iterator();

            while (var2.hasNext()) {
                ActivityLifecycleCallbacks callback = (ActivityLifecycleCallbacks) var2.next();
                if (callback != null) {
                    try {
                        callback.onActivityPaused(activity);
                    } catch (Exception e) {
                    }
                }
            }
        }
}
  1. 獲取當前Activity
public Activity getForegroundActivity() {
        return this.foregroundActivity == null ? null : (Activity) this.foregroundActivity.get();
    }
  1. 註冊 rootLifecycleCallback(需要在Applicition 裡呼叫此方法)
public void registerRootLifeCycle(Context context) {
        try {
            Application application = null;
            if (context instanceof Application) {
                application = (Application) context;
            } else {
                Context applicationContext = context.getApplicationContext();
                if (applicationContext instanceof Application) {
                    application = (Application) applicationContext;
                }
            }

            if (application == null) {
                return;
            }

            application.registerActivityLifecycleCallbacks(this.rootLifecycleCallback);
        } catch (Exception var4) {
            var4.printStackTrace();
        }

    }
  1. lifecycleCallbacks 集合新增/刪除物件(在其他類也想要動態監聽Activity狀態的地方呼叫新增或刪除物件)
public void subscribeLifeCycle(ActivityLifecycleCallbacks callbacks) {
        this.lifecycleCallbacks.add(callbacks);
    }

    public void unsubscribeLifeCycle(ActivityLifecycleCallbacks callbacks) {
        this.lifecycleCallbacks.remove(callbacks);
    }

參考:

優雅的使用ActivityLifecycleCallbacks管理Activity和區分App前後臺
探究 Android 中的 ActivityLifecycleCallbacks