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

Lifecycle原理

  1. 角色定义 (抽象层):

    • LifecycleOwner (被观察者): 代表拥有生命周期的组件(如 ActivityFragment)。它持有并暴露一个 Lifecycle 对象 (getLifecycle())。

    • Lifecycle (桥梁/状态机): 抽象类。核心作用是:

      • 维护 LifecycleOwner 的当前生命周期状态 (State)

      • 管理(添加/移除)LifecycleObserver (观察者集合)。

      • 负责在宿主状态变化时,将对应的生命周期事件 (Event) 分发给所有注册的观察者。

      • 定义关键状态 State (DESTROYEDINITIALIZEDCREATEDSTARTEDRESUMED) 和事件 Event (ON_CREATEON_START, ...)。

    • LifecycleObserver (观察者基类): 一个空接口。它代表任何希望监听生命周期的对象。具体的回调机制通过其子接口(如 DefaultLifecycleObserverLifecycleEventObserver)或注解处理器(@OnLifecycleEvent)实现。这种设计提供了最大的灵活性。

  2. 具体实现 (实现层):

    • 宿主 (LifecycleOwner 实现): ComponentActivity / Fragment (androidx) 实现了 LifecycleOwner 接口。

      • 它们的 getLifecycle() 方法返回一个 LifecycleRegistry (是 Lifecycle 的具体实现) 实例 (mLifecycleRegistry)。

    • 事件捕获: ComponentActivity 在其 onCreate 中注入一个无 UI 的 ReportFragment

      • API >= 29: 直接注册 Activity 生命周期回调。

      • API < 29: ReportFragment 自身监听 Activity 的生命周期回调。

      • 在 ReportFragment 的每个生命周期方法 (onCreateonStart, ...) 中,调用 dispatch(Lifecycle.Event) 方法。

    • 事件传递到桥梁: ReportFragment.dispatch() 最终调用宿主 Activity/Fragment 持有的 LifecycleRegistry 实例的 handleLifecycleEvent(Event) 方法。

    • 状态更新与分发 (LifecycleRegistry 核心工作):

      1. handleLifecycleEvent(Event)

        • 根据传入的 Event 计算出新的目标 State (Event.getTargetState())。

        • 调用 moveToState(State)

      2. moveToState(State)

        • 更新 LifecycleRegistry 自身的当前状态 mState 为目标 State

        • 如果没有重入(当前不在处理事件或添加观察者中),则调用 sync() 进行同步。

      3. sync() (同步引擎):

        • 检查宿主是否有效(弱引用)。

        • 循环执行直到所有观察者状态与 mState 同步 (isSynced()):

          • 检查状态滞后 (需要“前进” - forwardPass): 如果 mState 大于 mObserverMap 中最新观察者的状态 (newest().mState),说明观察者整体落后于宿主状态。调用 forwardPass()

          • 检查状态超前 (需要“后退” - backwardPass): 如果 mState 小于 mObserverMap 中最旧观察者的状态 (eldest().mState),说明观察者整体超前于宿主状态(通常发生在配置更改恢复时)。调用 backwardPass()

      4. forwardPass() / backwardPass()

        • 遍历观察者集合 (mObserverMap)。

        • 对每个状态未同步的观察者 (ObserverWithState),计算它需要经历哪些 Event 才能达到 mState

        • 对每个需要分发的 Event

          • 调用 observer.dispatchEvent(owner, event)

      5. ObserverWithState.dispatchEvent(owner, event)

        • 更新该观察者自身的状态 (mState = min(mState, event.getTargetState()) -> 调用 mLifecycleObserver.onStateChanged -> mState = event.getTargetState())。

        • 调用 mLifecycleObserver.onStateChanged(owner, event)关键点: mLifecycleObserver 是在 addObserver 时通过 Lifecycling.lifecycleEventObserver(observer) 动态创建的适配器。

    • 适配到具体回调 (Lifecycling 的魔法):

      • Lifecycling.lifecycleEventObserver(Object observer) 分析传入的 observer 的实际类型:

        • 如果实现了 FullLifecycleObserver (包含所有具体回调方法如 onCreate), 则返回 FullLifecycleObserverAdapter

        • 如果实现了 LifecycleEventObserver (只有 onStateChanged 方法), 则直接返回它。

        • 如果使用了 @OnLifecycleEvent 注解, 则生成并返回一个基于反射或代码生成的适配器。

        • 其他情况可能抛出异常。

      • FullLifecycleObserverAdapter.onStateChanged(source, event) 将通用的 onStateChanged 调用适配到 FullLifecycleObserver 的具体方法 (onCreateonStart, ...)。这就是为什么 DefaultLifecycleObserver (继承自 FullLifecycleObserver) 的方法会被调用。

      • LifecycleEventObserver.onStateChanged(source, event) 直接传递给实现了该接口的观察者。

  3. 观察者注册 (addObserver 流程):

    • 创建 ObserverWithState,初始状态为 INITIALIZED (或如果宿主已 DESTROYED 则为 DESTROYED)。

    • 将 observer 和 ObserverWithState 添加到 mObserverMap

    • 计算该观察者的目标状态 (calculateTargetState()) - 通常是宿主当前的 mState

    • 通过 while 循环,使用 Event.upFrom() 计算出从当前状态到目标状态需要经历的所有中间事件 (Event)

    • 依次调用 observer.dispatchEvent(owner, event) 分发这些事件,使新观察者快速达到宿主当前状态(补偿历史事件)。

    • 最后调用 sync() 确保所有观察者状态最终一致。

相关文章:

  • Python 训练营打卡 Day 30-模块和库的导入
  • Spring MVC 框架
  • C++之string的模拟实现
  • java-文件IO
  • MySQL 的 super_read_only 和 read_only 参数
  • 深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)
  • AU6825集成音频DSP的2x32W数字型ClaSSD音频功率放大器(替代TAS5825)
  • 机器人变量类型与配置
  • 【maker-pdf 文档文字识别(包含ocr),安装使用完整教程】
  • 论文速读《UAV-Flow Colosseo: 自然语言控制无人机系统》
  • 使用 Akamai 分布式云与 CDN 保障视频供稿传输安全
  • 第二章 2.1 数据存储安全风险之数据存储风险点
  • 视频监控汇聚平台EasyCVR安防小知识:如何通过视频融合平台解决信息孤岛问题?
  • 每日c/c++题 备战蓝桥杯(Cantor 表)
  • AI生态警报:MCP协议风险与应对指南(下)——MCP Host安全
  • 【动手学深度学习】2.4. 微积分
  • AI系统提示词:DeepSeek R1(0528)
  • 基于Python的单斜式ADC建模与仿真分析
  • 【仿生机器人】极具前瞻性的架构——认知-情感-记忆“三位一体的仿生机器人系统架构
  • ubuntu系统安装Pyside6报错解决
  • 网站大小多少合适/成都公司网站seo
  • 上海亿网站建设/app推广怎么联系一手代理
  • 北京给网站做系统的公司名称/百度收录权重
  • 网站接入服务单位名称/本地免费发布信息网站
  • 全站搜索/免费关键词挖掘网站
  • 郑州信息港/下载班级优化大师