Lifecycle / LifecycleOwner / LifecycleRegistry

45 阅读3分钟

1)LifecycleOwner 是什么

  • 接口:只有一个方法 getLifecycle(),暴露一个 Lifecycle 对象,便于外界“订阅”它的生命周期。

  • 常见实现者:ComponentActivity、Fragment、Fragment.viewLifecycleOwner、LifecycleService、NavBackStackEntry、ProcessLifecycleOwner 等。

重点:LifecycleOwner 自己并不管状态机,真正管状态的是 LifecycleRegistry


2)真正的“管理者”:LifecycleRegistry(状态机)

  • 状态:INITIALIZED → CREATED → STARTED → RESUMED,向下则 RESUMED → STARTED → CREATED → DESTROYED。

  • 事件:ON_CREATE/START/RESUME/PAUSE/STOP/DESTROY(以及 ON_ANY)。

  • 职责

    1. 维护当前 状态
    2. 维护每个 Observer 的目标状态,把事件“补齐”到一致(上行依次发送 CREATE→START→RESUME,下行反向发送);
    3. 顺序保证:上行事件按添加顺序分发;下行事件按逆序分发,避免资源先后释放的依赖问题;
    4. 处理可重入(分发中新增/移除观察者)与主线程校验。

3)事件从哪来?(Activity / Fragment / 进程级)

Activity(ComponentActivity)

  • 内部持有 LifecycleRegistry。

  • 在 onCreate() 里会注入一个隐形的 ReportFragment(或使用 ActivityLifecycleCallbacks),用来把系统回调转发为 Lifecycle 事件:

    • onCreate() → registry.handleLifecycleEvent(ON_CREATE)

    • onStart()  → …(ON_START)

    • onResume() → …(ON_RESUME)

    • onPause()  → …(ON_PAUSE)

    • onStop()   → …(ON_STOP)

    • onDestroy()→ …(ON_DESTROY)

Fragment

  • Fragment 自身实现 LifecycleOwner(Fragment 的生命周期)。

  • 另外还有 viewLifecycleOwner(Fragment.View 的生命周期,从 onCreateView 到 onDestroyView)。

    订阅与 View 绑定的数据(如 UI 观察)务必用 viewLifecycleOwner,避免内存泄漏/错过销毁时机。

进程级(前后台)

  • ProcessLifecycleOwner 借助 Application.ActivityLifecycleCallbacks + ReportFragment 聚合所有 Activity 的前后台信号,提供 应用级 Lifecycle(如前后台监听)。

4)观察者怎么写?

  • 推荐:DefaultLifecycleObserver(类型安全,按阶段回调:onCreate/onStart/onResume/...)。

  • 底层:LifecycleEventObserver(单方法拿到事件枚举)。

  • 协程化

    • lifecycleScope.launch { … } 与 repeatOnLifecycle(state) { … } 在指定状态开始收集、退出时自动取消(和 Flow 搭配最常见)。

示例(Fragment 中监听 UI 数据)

viewLifecycleOwner.lifecycleScope.launch {
  viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
    viewModel.state.collect { render(it) } // STARTED 及以上收集,STOP 时自动停止
  }
}

5)View 树与 Compose 的衔接

  • ViewTreeLifecycleOwner:把 LifecycleOwner 挂到根 View 上,子 View 可通过 ViewTreeLifecycleOwner.get(view) 拿到。
  • Compose:LocalLifecycleOwner.current 可直接拿到宿主 Lifecycle;DisposableEffect/LaunchedEffect 常配合 repeatOnLifecycle 使用。

6)自定义 LifecycleOwner(少数场景需要)

当你写一个非四大组件但也想“具备生命周期”的类时,手动用 LifecycleRegistry 驱动:

class MyOwner : LifecycleOwner {
  private val registry = LifecycleRegistry(this)
  override fun getLifecycle(): Lifecycle = registry

  fun onCreate()  { registry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) }
  fun onStart()   { registry.handleLifecycleEvent(Lifecycle.Event.ON_START) }
  fun onResume()  { registry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) }
  fun onPause()   { registry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE) }
  fun onStop()    { registry.handleLifecycleEvent(Lifecycle.Event.ON_STOP) }
  fun onDestroy() { registry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) }
}

在 Activity/Fragment 等标准组件中不要手动调 handleLifecycleEvent,系统已代为分发,重复调用会扰乱状态机。


7)最佳实践 & 易错点

  • Fragment 用 viewLifecycleOwner 订阅 UI 数据,而不是 this(防止 View 重建后观测错位或泄漏)。
  • Flow + repeatOnLifecycle:首选这种“可感知生命周期”的收集方式,避免手动在 onStart/onStop 里 start/stop。
  • 跨配置变更:和 ViewModel(+SavedStateHandle) 组合,让状态横跨旋转、DarkMode 等变更。
  • 进程级前后台:用 ProcessLifecycleOwner,不要自己统计可见 Activity 数。
  • 观察顺序:释放资源相关的观察者要后加先删,下行事件会逆序触达,能避免依赖项先被释放。

一句话总结

LifecycleOwner 提供入口,LifecycleRegistry 才是状态机;系统通过 ReportFragment/ActivityLifecycleCallbacks/Fragment 回调 把平台事件转成 Lifecycle 事件,再由 Registry 以有序、可补齐、可重入的方式分发到观察者;开发中用 viewLifecycleOwner + repeatOnLifecycle 基本就能把生命周期管理得又稳又优雅。