当前位置: 首页 > 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() 确保所有观察者状态最终一致。

http://www.xdnf.cn/news/733645.html

相关文章:

  • 低秩矩阵、奇异值矩阵和正交矩阵
  • 【FlashRAG】本地部署与demo运行(一)
  • ArcGIS应用指南:基于网格与OD成本矩阵的交通可达性分析
  • AI时代的园区网变革:“极简”行至最深处,以太彩光恰自来
  • 【C++】位图
  • 前端pointer-events属性
  • 显卡3080和4060哪个强 两款游戏性能对比
  • 重拾Scrapy框架
  • Clish中xml文件配置的使用方法
  • Spring Cloud Alibaba 学习 —— 简单了解常用技术栈
  • 【专题】神经网络期末复习资料(题库)
  • 二、Python提供了丰富的内置工具,无需额外安装即可使用
  • 6个月Python学习计划 Day 9 - 函数进阶用法
  • 【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用
  • 单卡4090部署Qwen3-32B-AWQ(4bit量化)-vllm
  • 网易 - 灵犀办公文档
  • const ‘不可变’到底是值不变还是地址不变
  • Python使用
  • C 语言中 * count++ 引发的错误与正确指针操作解析
  • Lyra学习笔记2 GFA_AddComponents与ULyraPlayerSpawningManagerComponent
  • 玛哈特校平机实战指南:选型、应用痛点
  • 【Unity】模型渐变技术 BlendShapes变形
  • 深入理解复数加法与乘法:MATLAB演示
  • 云原生微服务架构演进之路:理念、挑战与实践
  • Hive的数据倾斜是什么?
  • 杨传辉:构建 Data × AI 能力,打造 AI 时代的一体化数据底座|OceanBase 开发者大会实录
  • Armv7l或树莓派32位RPI 4B编译faiss
  • @Pushgateway自定义脚本推送数据
  • C++继承权限与访问控制详解
  • 解决win自动重启(自用,留链接)