本文由授权投稿
作者博客:https://jekton.github.io/
Lifecycle 隶属于 Android 官方架构组件,它的实现跟 ViewModel 类似,都是利用 Fragment 来实现它的功能。通过添加一个 fragment 到 activity 中,这个 fragment 便能够接收到各个生命周期回调。
以下源码使用 1.1.1 版本
使用方法简介
这里我并不打算讲太多 lifecycle 的用法,不熟悉的同学,可以
阅读这篇
[1]。
为了使用 lifecycle,首先需要获取到一个 LifecycleOwner。
使用 support 包时,AppCompatActivity 就是一个 LifecycleOwner。具体的实现是 SupportActivity:
下面,我们就从 SupportActivity 开始分析 lifecycle 组件的实现。
获取生命周期
可以看到,在上一节中我们执行 lifecycleOwner.getLifecycle() 返回的就是 mLifecycleRegistry。关于 LifecycleRegistry,我们在下一节再看,这里先看 ReportFragment。
ReportFragment 就是我们在一开始说的,用于获取生命周期的 fragment:
ReportFragment 的实现很简单,读者自己看看就好。下面我们开始看不那么好理解的 LifecycleRegistry。
生命周期事件的分发
在看代码前,我们先来了解一下 Lifecycle 的状态和事件:
Lifecycle.Event 对应 activity 的各个声明周期,State 则是 Lifecycle 的状态。在 LifecycleRegistry 中定义了状态间的转化关系:
这三个方法,可以总结为下面这样一张图:
android-arch-lifecycle-states
downEvent 在图中表示从一个状态到他下面的那个状态,upEvent 则是往上。
了解了 Lifecycle 的状态后,我们继续来看 LifecycleRegistry。上一节我们知道,activity 的生命周期发生变化后,会调用到 LifecycleRegistry 的 handleLifecycleEvent:
LifecycleRegistry 本来要做的事其实是很简单的,但由于他需要执行客户的代码,由此引入了很多额外的复杂度。原因是,客户代码并不处在我们的控制之下,他们可能做出任何可以做到的事。例如这里,在回调中又触发状态变化。类似的情况是,在持有锁的时候不调用客户代码,这个也会让实现变得比较复杂。
接下来我们看 sync():
sync() 的主要作用就是根据把 mObserverMap 里所有元素的状态都同步为 mState。我们继续看剩下的 backwardPass/forwardPass:
在看这两个方法时,可以参考上面的状态图。比方说,假设当前队列里的元素都处于 CREATED。接着收到了一个 ON_START 事件,从图里面可以看出,接下来应该是要到 STARTED 状态。由于 STARTED 大于 CREATED,所以会执行 forwardPass()。forwardPass() 里面调用 upEvent(observer.mState),返回从 CREATED 往上到 STARTED 需要发送的事件,也就是 ON_START,于是 ON_START 事件发送给了客户。
注册/注销 observer
注册 observer 由 addObserver 方法完成:
由于篇幅有限,这里的 Lifecycling.getCallback 就不看了。简单提一下,在使用 annotion 的时候,对应的 observer 会生成一个 adapter,这个 adapter 会把对应的 Lifecycle.Event 装换为方法调用:
注销 observer 的实现就比较简单了:
恭喜你,相信你现在对 lifecycle 的实现已经胸有成竹,可以愉快地装逼了。
附:
[1] https://developer.android.google.cn/topic/libraries/architecture/
— — — END — — —
领取专属 10元无门槛券
私享最新 技术干货