简介
Lifecycles 是 Google 推出得架构组件中的一个,架构组件又是 Android Jetpack 的一部分。Jetpack 组件是库的集合,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。
Lifecycles 的作用是什么?以传统的 MVP 模式为例:
1 | class MyPresenter() { |
我们需要在 Activity 创建和销毁的时候做一些处理,所以需要在 Activity 对应的生命周期里去手动调用 Presenter 对应的方法。如果这时候我们想在 Activity 里使用 EventBus,则需要加上类似如下的代码:
1 | class MyActivity: AppCompatActivity() { |
如此每个和 Acitivty 生命周期相关的逻辑都集中到了 Activity 中,变得不好维护。有没有办法让外部的代码主动感知生命周期的变化呢? Lifecycle 的诞生就是为了实现这个目的。
使用
早期是在 android.arch.lifecycle
包名下,后面跟随迁移到 androidx.lifecycle
包名下了。support 库低于 26.1 得话需要单独引库,高于的已经包含在 support 包中了。对于 AndroidX 项目,需要按下面的方式引入,一般会搭配 ViewModel 和 LiveData 使用。使用和查看文档的时候需要看下版本说明,例如在 2.2.0 版本就弃用了之前提供的 lifecycle-extensions
库,被新的几个面向特定功能的库替代了。
1 | implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" |
Lifecycle 采用是观察者模式,Fragment(support包或者 AndroidX 中的)和 AppCompatActivity 等(以下简称 Owner) 实现了 LifecycleOwner 接口。我们可以通过 LifecycleObserver 来观察生命周期,有两种方法可以实现:
- 实现 DefaultLifecycleObserver,重写对应的方法
- 实现 LifecycleObserver,通过注解的方式来接收生命周期的变化
建议使用第一种,第二种是项目没有兼容 Java8 的时候才需要使用的。
前面的例子用 Lifecycle 来实现如下所示:
1 | class MyPresenter(): DefaultLifecycleObserver { |
我们在继承 DefaultLifecycleObserver 后,只需要在 Activity/Fragment 中注册一次,即可收到所有的生命周期事件回调。
Lifecycle 中生命回调的方法和 Owner 的生命周期关系如下图所示:
创建时是先执行 Owner 的函数,在执行 Observer 的,销毁的时候则相反。
原理
这里借用一张图描述 Lifecycle、LifecycleOwner、LifecycleObserver 等这几个核心类、接口的关系:
LifecycleOwner 接口只有一个返回 Lifecycle 对象的方法 getLifecyle()。Owner 中 getLifecycle() 方法返回的是继承了抽象类 Lifecycle 的 LifecycleRegistry。
注册的过程就是在 Owner 中通过调用 getLifecycle() 方法获得返回的 Lifecycle,再调用 Lifecycle 的 addObserver() 方法来添加不同的 LifecycleObserver。
当 Owner 自己的生命周期发生变化的时候会调用 LifecycleRegistry 的 handleLifecycleEvent() 方法,LifecycleRegistry 再调用各个 LifecycleObserver 中的生命周期方法,从而实现了生命周期的分发,降低了 Owner 和 Observers 直接的耦合。
参考: