使用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
-
定義一個集合
private final Set<ActivityLifecycleCallbacks> lifecycleCallbacks = new HashSet();
用於外部類呼叫新增 ActivityLifecycleCallbacks物件 -
定義一個弱引用
private WeakReference<Activity> foregroundActivity = null;
-
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) {
}
}
}
}
}
- 獲取當前Activity
public Activity getForegroundActivity() {
return this.foregroundActivity == null ? null : (Activity) this.foregroundActivity.get();
}
- 註冊 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();
}
}
- 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