当前位置: 首页 > news >正文

安卓JetPack篇——LifeCycle原理

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

http://www.lryc.cn/news/572288.html

相关文章:

  • flink如何基于Pekko实现RPC调用
  • 神经网络试题
  • DL___线性神经网络
  • 数据结构 二叉树理论、递归理论与快速排序理论 6.19
  • 01.线性代数是如何将复杂的数据结构转化为可计算的数学问题,这个过程是如何进行的
  • OpenAI的Prompt工程
  • 03.自动特征提取(深度学习)核心逻辑:通过多层非线性变换,让模型自动学习从原始数据到高层特征的映射。为什么多层非线性变换可以达到这样的效果?
  • 【LINUX网络】网络socet接口的基本使用以及实现简易UDP通信
  • Linux内存进阶
  • 七彩喜智慧康养平台:重构银发生活的数字守护网
  • LeetCode 2187.完成旅途的最少时间
  • 数据库连接池(Druid、HikariCP)详解
  • vector模拟实现中的迭代器失效问题
  • SQL等价改写优化
  • 算法打卡22天
  • Codeforces Round 1032 (Div. 3)
  • Excel学习01
  • Arduino入门教程:11、直流步进驱动
  • 小型语言模型(SLMs)有望重塑自主AI:效率、成本与实际部署
  • tensor向量按任意维度进行切片、拆分、组合
  • 如何将缓存存到客户端浏览器上呢
  • 计算机视觉(Computer Vision, CV)
  • 前端实现即时通讯:短轮询、长轮询、SSE 与 WebSocket 全面解析
  • MySQL层级查询实战:无函数实现部门父路径
  • MyBatis 简介
  • 《超级处理器》怎么安装到WPS/excel(最后有下载地址)
  • 基于Spring Boot+Vue的“暖寓”宿舍管理系统设计与实现(源码及文档)
  • 解锁身心密码:从“心”拥抱健康生活
  • 20250619在Ubuntu20.04.6下编译Rockchip瑞芯微原厂的RK3576的Buildroot系统
  • Zephyr boot