一、Lifecycle 解决了什么问题
在 MVP/MVVM 架构普及之前,Presenter 或业务组件需要手动感知 Activity/Fragment 的生命周期。典型场景:一个位置管理器需要在 onResume 时启动定位、onPause 时停止定位,但 Presenter 并不知道宿主的生命周期变化,于是只能在每个生命周期回调里逐一调用 Presenter 的对应方法——这就是经典的”生命周期回调地狱”。
Lifecycle 组件的核心思想是让任何对象都能成为 LifecycleObserver(生命周期观察者),由 LifecycleOwner(生命周期持有者,如 Activity/Fragment)主动分发事件。这样业务组件只需用注解或接口声明对哪些生命周期事件感兴趣,而无需让宿主 Activity/Fragment 逐一手动转发。
二、核心接口与设计
Lifecycle 库定义了两个核心枚举:Event(ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY、ON_ANY)和 State(DESTROYED、INITIALIZED、CREATED、STARTED、RESUMED)。Event 代表生命周期事件的发生,State 则代表当前状态——State 是 Event 累积的结果。
LifecycleOwner 是一个只有一个方法 getLifecycle() 的接口,AppCompatActivity 和 Fragment 都已默认实现。LifecycleObserver 是标记接口,其子接口 DefaultLifecycleObserver 提供了 default 实现的回调方法,更方便使用。
三、源码解析:事件如何传播
在 AppCompatActivity 中(AOSP 路径:/frameworks/support/compat/ 下的 SupportActivity),ReportFragment 被注入到 Activity 中,通过这个无 UI 的 Fragment 来监听宿主生命周期并分发给 LifecycleRegistry。LifecycleRegistry 是核心实现类,内部维护了一个状态机,确保 State 只能前进不能后退,且会在状态变化时遍历所有已注册的 Observer 并调用对应回调:
// 源码路径:lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleRegistry.java |
四、实践示例
class LocationManager : DefaultLifecycleObserver { |
面试常考问题
Q1: Lifecycle 如何避免内存泄漏?
A: 当 LifecycleOwner 的 State 变为 DESTROYED 时,LifecycleRegistry 会自动移除所有 Observer 的引用,Observer 持有的任何资源也会随之释放。无需像手动方案那样在 onDestroy 中调用取消订阅。源码中 LifecycleRegistry.addObserver() 方法会在添加 Observer 后检查当前 State,如果已是 DESTROYED 则立即移除新加入的 Observer。
Q2: Event 和 State 的关系是什么?
A: State 是组件当前所处的状态点(如 RESUMED),Event 是触发状态迁移的动作(如 ON_PAUSE 事件导致从 RESUMED 变为 STARTED)。LifecycleRegistry 内部维护了一个状态机,通过 getStateAfter(Event) 来计算事件发生后的新状态,同时确保状态只能沿 DESTROYED → INITIALIZED → CREATED → STARTED → RESUMED 的方向前进(不可逆)。
Q3: 如果我在 ON_STOP 事件中启动协程操作,协程未完成 Activity 就销毁了怎么办?
A: 这正是 Lifecycle 需要搭配 lifecycleScope(Lifecycle KTX 扩展)的原因。lifecycleScope 在 Lifecycle 销毁时自动取消所有启动的协程,避免了无效操作继续执行。相比之下,纯 Lifecycle Observer 只提供回调,不负责任务取消,所以更推荐在协程场景下使用 lifecycleScope.launchWhenStarted {} 或 repeatOnLifecycle。







