Lifecycle
Jetpack LifeCycle 库
Lifecycle 是 Android Jetpack 的一部分,它提供了一种机制可以让程序可以更加方便的响应 Android 组件(如 Activity)的生命周期。
Lifecycle 解决了什么问题?
在此之前,如果一个组件需要响应 Android 组件的生命周期事件,通常可以在对应的生命周期回调里进行,例如下面的代码示例:
internal class MyLocationListener(
private val context: Context,
private val callback: (Location) -> Unit
) {
fun start() {
// connect to system location service
}
fun stop() {
// disconnect from system location service
}
}
class MyActivity : AppCompatActivity() {
private lateinit var myLocationListener: MyLocationListener
override fun onCreate(...) {
myLocationListener = MyLocationListener(this) { location ->
// update UI
}
}
public override fun onStart() {
super.onStart()
myLocationListener.start()
// manage other components that need to respond
// to the activity lifecycle
}
public override fun onStop() {
super.onStop()
myLocationListener.stop()
// manage other components that need to respond
// to the activity lifecycle
}
}但是上面的代码会导致两个问题:
代码质量问题
可能有多个组件需要响应同一个 Activity 的生命周期,这就导致了Activity 的生命周期方法里充斥着处理各个组件的代码,不易维护
可能多个Activity 需要使用同一个组件,那么就需要在每个Activity的生命周期回调中都添加处理这个组件的逻辑,产生了不必要的重复代码
内存泄漏问题
举一个官方文档中提到的例子:
在上面例子中,如果 Util.checkUserStatus 回调在 onStop 之后,就可能会导致 MyActivity 被销毁后还在内存中(非静态内部类引用),引发 Activity 泄漏。
而通过 Lifecycle 提供的机制,可以将响应生命周期的操作集中在组件内部,同时在拥有生命周期的组件销毁时自动移除监听器,提高代码的可维护性。
如何使用 LifeCycle
集成 lifecycle 库
lifecycle 有两个核心库:lifecycle-common 和 lifecycle-runtime。如果使用了AndroidX,这两个库就会被间接集成到项目中(通过 androidx.core:core或者androidx.appcompat:appcompat )。
如果项目使用 Java 8,则需要集成lifecycle-common-java8,否则可以集成lifecycle-compiler来通过注解避免反射调用(后面会详细讲解),如下面所示:
注:如果两个库都不集成,则会通过反射进行监听器方法的调用。
创建监听器
未使用Java 8
使用LifecycleObserver+注解
使用 LifecycleEventObserver
上面被OnLifeCycleEvent注解标记的方法不会被自动调用,因为在LifecycleEventObserver注释中可以看到:
If a class implements this interface and in the same time uses OnLifecycleEvent, then annotations will be ignored.
组件之间通过事件来进行通信。
带有参数的情况。 方便处理监听多个LifecycleOwener的情况,或者对Event统一处理。
使用Java8
为什么Java8之前通过注解+接口?个人理解是为了灵活性,Java8的接口可以拥有默认的实现,这样开发者只需要按需重写方法,而且不会影响继承关系;而在Java8之前,这只能通过抽象类来实现,但是抽象类会影响继承关系,完全使用接口则需要实现所有方法。
注册监听器
监听生命周期的源码
处理生命周期事件源码

关系
监听 Activity 生命周期
ReportFragment
LifecycleRegistry
监听器注解的处理时机
注解处理器生成 observe——adapter类。
如果集成了注解处理库,就会生成对应的Adapter类,就不会进行反射调用;否则会通过反射进行调用。
监听应用生命周期
集成依赖
自定义 LifeCyclerOwner
一些小问题
使用Java 8 开发时可以通过集成 common-java8 并继承 DefaultLifecycleObserver,重写对应的生命周期方法即可,从而可以避免注解处理过程。DefaultLifecycleObserver 是一个接口,为每个回调方法提供了空的实现。
相关链接
最后更新于
这有帮助吗?