Android Jetpack 之 LifeCycle 源码探究

7 阅读4分钟

Jetpack 系列文章都是在学习时候的笔记

写文章的思路是从想到什么问题,到解释这个问题来进行表述的.

不建议通篇阅读, 关心那个看对应的实现即可.

LifecycleOwner类定义:

public interface LifecycleOwner {
    public val lifecycle: Lifecycle
}
public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
    get() = lifecycle.coroutineScope

需要搞清楚的问题:

1: lifecycle 存在的意义?

总述: 为组件提供生命周期的回调函数, 当组件的生命周期发生变化的时候, 更方便通知出去, 提供统一的通知和观察的方式. LifecycleOwner 接口暴露出 lifecycle 成员变量.Lifecycle 对外提供了添加监听器的方式. Lifecycle 为抽象类, 有组件提供具体的实现, 包括 observe 的存储和通知. (1) 监听: 通过组件拿到 lifecyle, 调用 addObserves 添加监听器. (2) 通知: 由组件自己的 LifeCyle 来通知自己存在的 observes .

2: 如何通过 lifecycle 来感知 activity/fragment 的生命周期? 监听器的方式? 注解的方法?

调用接口的方法: activity/fragment: lifecycle.addObserver(observe:LifeCycleObserver)这里需要注意的是 LifeCycleObserver 是一个空的接口. 可用的有 LifeCycleEventObserver/DefaultLifeCycleObservers. 这里不同的监听器都可以通知到, 是因为内部根据类型进行了判断, 进行了转发.

注解的方法: 创建实现 LifeCycleObserver 接口的类, 然后把他的实例通过 addObserver() 添加进入到 LifeCycle 中, 对方法添加 OnLifecycleEvent 注解. 这种方式已经废弃.

3: lifecycle 是否可以感知 view 所附着的 Activity 的生命周期?

view 在 lifecycle-runtime 库中有一个扩展函数 view.findViewTreeLifecycleOwner 就可以拿到 LifecycleOwner 然后就可以观察 LifecycleOwner 的生命周期了. 具体的实现原理是在创建 View 的时候通过扩展函数 view.setViewTreeLifecycleOwner,LifeCycleOwner 通过 tag 的形式和再 view 中存储了一份.

4: lifecycle 核心实现原理?

核心: 给组件提供统一的监听和通知的方式. 监听: 通过LifecycleOwner 的子类必须实现的 Lifecycle 的实现类, 来提供监听器存放在的位置, 通知: 在组件生命周期变化的时候再通过 Lifecycle 来通知到 存储的监听器, 从而实现了生命周期的通知.

5: 自己如何给一个不具有生命周期的提供生命周期?

(1): 继承 LifeCycleOwner接口, 提供 Lifecycle 的具体实现. (2): 还是使用 LifecycleRegistry 来实现监听器的管理. (3): 在生命周期变化的时候通过 LifecycleRegistryhandleLifecycleEvent 来驱动生命周期的变化.

6: Activity/ComponentActivity/FragmentActivity/AppCompatActivity 是如何把生命周期传递出去的?

Activity/ComponentActivity 都是通过 ReportFragment 来实现的, 把自己的传过去,然后当 ReportFragment 发生变化的时候再同时, 找到 lifecycle 通知过来,区别是Activity 不继承LifecycleOwner

FragmentActivity 直接在 onXX 的生命周期中调用 LifecycleRegistry#handleLifecycleEvent 将事件传出来.

7: 存在哪些好的设计模式?

(1): 观察者模式 → 整体都是观察通知的方式

(2): 代理模式 → Activity/ComponentActivity 都是把自己传给ReportFragment 这样让自己代码没有入侵, 也解决了生命周期的转发. 这里比较有特征性, 主要是由于 ReportFragment 可以拿到 Activity 的生命周期.

(3): 代理模式 → LifecycleaddObserver 添加的是一个 LifecycleObserver 的空实现. 提供了 DefaultLifeCycleObserver/LifecycleEventObserver/OnLifecycleEvent注解的方式, 不管提供谁都可以通知出来.

8: 依附 LifeCycle 实现了哪些更高级的功能

(1): 扩展变量: lifecycleScope ,这样可以拿到 LifecycleOwner 的地方都可以轻松的拿到可用的关联生命周期的 Scope来执行协程. 这里讲一下具体的实现: 因为 LifecycleOwnerLifecycle具体的实现都在对应的 Register中, 所以为了和生命周期做关联, lifecycleScope的具体定义一定是在 Lifecycle 或者 register 中. 实现的一些重点: a: 没有深入到 register 中,而是在 Lifecycle中 b: 为了解决现场安全使用的是: AtomicReference 来进行的存储, 使用compareAndSet 的方式进行的原子设置. c: 具体的 ScopeSupervisorJobDispatchers.main.immediate d: 因为是 Lifecycle 的扩展函数, 所以可以方便的来通过 addObserver 来添加和移除监听.

(2): 感知生命周期变化能力的组件也都是通过添加监听来的. a: repeatOnLifecycle 内部也是通过addObserver来协程的挂起和唤醒. b: viewModel 的清理工作, 也是在对应的 Activity 中监听生命周期的变化, 在监听到 onDestroy 的时候通过 viewModel 的存储器 ViewModelStore 来循环清理.