目录
  1. 1. 一、Lifecycle 解决了什么问题
  2. 2. 二、核心接口与设计
  3. 3. 三、源码解析:事件如何传播
  4. 4. 四、实践示例
  5. 5. 面试常考问题
JetPack全家桶(二)之LifeCycle生命周期感知组件

一、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 来监听宿主生命周期并分发给 LifecycleRegistryLifecycleRegistry 是核心实现类,内部维护了一个状态机,确保 State 只能前进不能后退,且会在状态变化时遍历所有已注册的 Observer 并调用对应回调:

// 源码路径:lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleRegistry.java
void moveToState(State next) {
mState = next;
sync(); // 同步状态给所有 Observer
}

四、实践示例

class LocationManager : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
startLocationUpdates()
}
override fun onPause(owner: LifecycleOwner) {
stopLocationUpdates()
}
}

// 在 Activity 中使用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(LocationManager())
// LocationManager 自动响应生命周期,无需在 Activity 中手动管理
}
}

面试常考问题

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

打赏
  • 微信
  • 支付宝

评论