0%

Android 架构组件之 Lifecycles

简介

Lifecycles 是 Google 推出得架构组件中的一个,架构组件又是 Android Jetpack 的一部分。Jetpack 组件是库的集合,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。

Lifecycles 的作用是什么?以传统的 MVP 模式为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyPresenter() {
fun create() //do something
fun destroy() //do something
}

class MyActivity: AppCompatActivity {
private val presenter = MyPresenter()

fun onCreate(...) {
super.onCreate(...)
presenter.create()
}

fun onDestroy() {
super.onDestroy()
presenter.destory()
}
}

我们需要在 Activity 创建和销毁的时候做一些处理,所以需要在 Activity 对应的生命周期里去手动调用 Presenter 对应的方法。如果这时候我们想在 Activity 里使用 EventBus,则需要加上类似如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyActivity: AppCompatActivity() {    
private val presenter = MyPresenter()

fun onCreate(...) {
super.onCreate(...)
presenter.create()
}

fun onStart() {
super.onStart()
EventBus.getDefault().register(this)
}

fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
presenter.destory()
}
}

如此每个和 Acitivty 生命周期相关的逻辑都集中到了 Activity 中,变得不好维护。有没有办法让外部的代码主动感知生命周期的变化呢? Lifecycle 的诞生就是为了实现这个目的。

使用

早期是在 android.arch.lifecycle 包名下,后面跟随迁移到 androidx.lifecycle 包名下了。support 库低于 26.1 得话需要单独引库,高于的已经包含在 support 包中了。对于 AndroidX 项目,需要按下面的方式引入,一般会搭配 ViewModel 和 LiveData 使用。使用和查看文档的时候需要看下版本说明,例如在 2.2.0 版本就弃用了之前提供的 lifecycle-extensions 库,被新的几个面向特定功能的库替代了。

1
2
3
4
5
6
7
8
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// 其他可选库
...

Lifecycle 采用是观察者模式,Fragment(support包或者 AndroidX 中的)和 AppCompatActivity 等(以下简称 Owner) 实现了 LifecycleOwner 接口。我们可以通过 LifecycleObserver 来观察生命周期,有两种方法可以实现:

  • 实现 DefaultLifecycleObserver,重写对应的方法
  • 实现 LifecycleObserver,通过注解的方式来接收生命周期的变化

建议使用第一种,第二种是项目没有兼容 Java8 的时候才需要使用的。

前面的例子用 Lifecycle 来实现如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyPresenter(): DefaultLifecycleObserver  {
fun onCreate(LifecycleOwner owner)
fun onDestroy(LifecycleOwner owner)
}

class MyActivity: AppCompatActivity() {
private val presenter = MyPresenter()

fun onCreate(...) {
super.onCreate(...)
getLifecycle().addObserver(presenter)
getLifecycle().addObserver(EventBusObserver())
}

}

我们在继承 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 直接的耦合。

参考: