前言
如何快速高效的掌握一门学问,建议先阅读下这篇文章关于学习的一些看法。
一、概述
Lifecycle 是一个生命周期感知型组件,它用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态。
二、设计目的
生命周期感知:Lifecycle库旨在提供一种机制,使组件(如ViewModel)能够感知并响应其宿主(如Activity)的生命周期事件,从而避免因生命周期变化引发的内存泄漏、资源浪费等问题。跨组件通信:通过Lifecycle,组件间可以安全地交换生命周期相关的状态信息,确保数据同步、任务调度等操作在合适的时机进行。
三、关键组件与接口
-
LifecycleOwner:被观察者接口,表示拥有生命周期的组件,如Activity、Fragment等。它提供了getLifecycle()方法,返回一个Lifecycle对象。 -
LifecycleObserver:观察者接口,用于监听LifecycleOwner的生命周期变化。实现此接口的类可以注册到Lifecycle上,当生命周期状态发生变化时,会收到对应的通知。 -
Lifecycle:存储有关组件生命周期状态的信息,使用两种主要枚举跟踪其关联组件的生命周期状态。Lifecycle.State:表示生命周期状态,包括INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED。Lifecycle.Event:表示生命周期状态的变化事件,如ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY等。上图构成 Android activity 生命周期的状态和事件
四、实现原理与工作机制
-
设计模式:状态机模式 + 观察者模式,注解 + 反射 进行解耦-
被观察者:LifecycleOwner (Activity/Fragment)
-
观察者:LifecycleObserver (实现该接口的类)
-
关联:getLifecycle().addObserver()
-
-
状态机模型:Lifecycle内部实现为一个状态机,维护当前生命周期状态。当宿主组件的生命周期事件发生时,Lifecycle会更新其内部状态,并触发相应的LifecycleObserver回调。 -
观察者注册与通知:addObserver(LifecycleObserver):将观察者添加到Lifecycle中。LifecycleRegistry内部使用FastSafeIterableMap存储观察者及其对应的生命周期状态。状态变化传播:当宿主组件的生命周期事件触发时,LifecycleRegistry会根据事件类型更新状态,并遍历观察者列表,调用观察者的对应方法。例如,当宿主从CREATED变为STARTED时,会调用观察者的onStart()方法。生命周期状态限制:观察者只能接收到当前及之后的生命周期事件,不会收到已经过去的状态变化。例如,当观察者在RESUMED状态下注册时,不会收到ON_CREATE和ON_START事件。
五、最佳实践与注意事项
使界面控制器(activity 和 fragment)尽可能保持精简。它们不应试图获取自己的数据,而应使用ViewModel执行此操作,同时应观测LiveData对象以在视图中体现相应变化。设法编写数据驱动型界面,在此类界面中,界面控制器负责随着数据的更改更新视图,或者向ViewModel通知用户的操作。将数据逻辑放在ViewModel类中。ViewModel应充当界面控制器与应用其余部分之间的连接器。不过要注意,ViewModel不负责提取数据(例如,从网络提取)。但是,ViewModel应调用相应的组件来提取数据,然后将结果提供给界面控制器。使用 数据绑定 在视图与界面控制器之间维持干净的接口。这样可以让视图更具声明性,并尽量减少需要在activity和fragment中编写的更新代码。如果您更愿意使用 Java 编程语言来达成此目的,请使用Butter Knife之类的库,以避免样板代码并实现更好的抽象化。- 如果界面很复杂,不妨考虑创建
presenter类来处理界面的修改。这可能是一项艰巨的任务,但这样做可使界面组件更易于测试。 - 避免在
ViewModel中引用View或Activity上下文。如果ViewModel存在的时间比 activity 更长(在配置更改的情况下),activity将泄漏并且不会获得垃圾回收器的妥善处置。 - 使用
Kotlin 协程管理长时间运行的任务和其他可以异步运行的操作。
六、扩展与高级特性
ProcessLifecycleOwner:提供对整个应用程序生命周期的感知,可用于实现如应用进入后台/前台时的全局行为控制。Lifecycle.Event.ON_ANY:监听所有生命周期事件,常用于需要对生命周期变化做出通用响应的情况。
七、调用时序
- ComponentActivity -> onCreate()
- ReportFragment -> inJectIfNeededIn() -> dispatch() -> handleLifecycleEvent()
- LifecycleRegisty->moveToState -> sync() -> forwardPass()
- ObserverWithState -> dispatchEvent()
- ReflectiveGenericLifecycleObserver -> onStateChanged()
- CallBackInfo -> invokeCallbacks()
- ClassesInfoCache -> invokeCallback() -> mMethod.invoke()
码字不易,记得关注 + 点赞 + 收藏