LifeCycle
一、什么是Lifecycle
具備宿主生命周期感知能力的組件。它能持有組件(如Activity或Fragment)生命周期狀態的信息,并且允許其他觀察者監聽宿主的狀態。
二、基本原理
1、安卓10以下版本
隱形的Fragment注入在LifecycleOwner(宿主頁面)中,當Fragment感知到宿主生命周期變化時,通知LifecycleRegister進行狀態修改,然后LifecycleRegister通知LifecycleObserver進行具體的操作。
2、安卓10以上版本
不再需要隱形Fragment,直接使用系統回調(lifecyclecallback)
三、五大金剛
1、ReportFragment:隱形fragment,同步感知activity的聲明周期變化,通知給LifecycleRegister(被宿主LifecycleOwner持有)
2、LifecycleRegister:Lifecycle 的具體實現類,更新狀態并通知觀察者。
3、LifecycleObserver:觀察生命周期變化的接口
4、LifecycleOwner:生命周期的持有頁面。
5、Lifecycle:定義生命周期狀態和事件的抽象接口。
四、為什么Deportment可以感知宿主Activity的生命周期
Android 系統保證 Fragment 的生命周期方法100% 同步宿主 Activity。
public class ReportFragment extends Fragment {// ? 1. 注入到 Activitypublic static void injectIfNeededIn(Activity activity) {if (Build.VERSION.SDK_INT >= 29) {// Android 10+ 使用更高效的 APILifecycleCallbacks.registerIn(activity);}// 添加透明 Fragment(兼容舊版本)android.app.FragmentManager manager = activity.getFragmentManager();if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();manager.executePendingTransactions();}}// ? 2. 生命周期同步方法(核心)@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatch(Lifecycle.Event.ON_CREATE);}@Overridepublic void onStart() {super.onStart();dispatch(Lifecycle.Event.ON_START);}@Overridepublic void onResume() {super.onResume();dispatch(Lifecycle.Event.ON_RESUME);}@Overridepublic void onPause() {super.onPause();dispatch(Lifecycle.Event.ON_PAUSE);}@Overridepublic void onStop() {super.onStop();dispatch(Lifecycle.Event.ON_STOP);}@Overridepublic void onDestroy() {super.onDestroy();dispatch(Lifecycle.Event.ON_DESTROY);}// ? 3. 事件分發核心方法private void dispatch(Lifecycle.Event event) {if (Build.VERSION.SDK_INT < 29) {// 僅舊版本需要 ReportFragment 分發事件dispatch(getActivity(), event);}}// ? 實際分發邏輯(靜態方法可獨立調用)public static void dispatch(Activity activity, Lifecycle.Event event) {if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);}}}// ? 4. Android 10+ 的優化實現@RequiresApi(29)static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {static void registerIn(Activity activity) {activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());}@Overridepublic void onActivityCreated(@NonNull Activity activity, Bundle bundle) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_CREATE);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_START);}@Overridepublic void onActivityResumed(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_RESUME);}@Overridepublic void onActivityPaused(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_PAUSE);}@Overridepublic void onActivityStopped(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_STOP);}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {// 不處理}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_DESTROY);}}
}
參考文章:
【Android: 徹底搞懂Lifcycle——原理篇 - CSDN App】https://blog.csdn.net/sange77/article/details/125131212?sharetype=blogdetail&shareId=125131212&sharerefer=APP&sharesource=y515278178&sharefrom=link