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)。
-
职责:
- 维护当前 状态;
- 维护每个 Observer 的目标状态,把事件“补齐”到一致(上行依次发送 CREATE→START→RESUME,下行反向发送);
- 顺序保证:上行事件按添加顺序分发;下行事件按逆序分发,避免资源先后释放的依赖问题;
- 处理可重入(分发中新增/移除观察者)与主线程校验。
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 基本就能把生命周期管理得又稳又优雅。