首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

扒一扒 Lifecycle 的实现

本文由授权投稿

作者博客: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 — — —

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180727G0BS7Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券