什么是 Lifecycle
Jetpack 的 生命周期感知框架:把 Activity/Fragment 的生命周期抽象成 状态机,并把状态变化以事件分发给观察者(组件/协程/LiveData 等),从而做到按时订阅、按时释放,避免泄漏与 ANR。
关键角色
-
LifecycleOwner:拥有生命周期的对象。ComponentActivity、Fragment 都实现了它(getLifecycle())。
-
Lifecycle:只读状态机,提供 currentState 与 add/removeObserver。
-
LifecycleRegistry:Lifecycle 的默认实现,负责推进状态并分发事件。
-
Observer 类型
- DefaultLifecycleObserver:按方法名回调(onCreate/onStart…),最易读。
- LifecycleEventObserver:收一个 onStateChanged(owner, event),更底层。
-
ProcessLifecycleOwner:把整个应用进程当成一个 Lifecycle(前后台切换监控常用)。
状态 & 事件(简表)
-
状态:INITIALIZED → CREATED → STARTED → RESUMED → DESTROYED
-
事件:ON_CREATE / ON_START / ON_RESUME / ON_PAUSE / ON_STOP / ON_DESTROY
-
关系:事件驱动状态前进/后退(如 ON_PAUSE 导致 RESUMED → STARTED)。
它是如何工作的(内部机制)
-
ComponentActivity / Fragment 在各自的 onCreate/onStart/... 中调用
mLifecycleRegistry.handleLifecycleEvent(ON_*)。
-
LifecycleRegistry 维护:
- 当前状态 currentState;
- 一个有序 Map 存放观察者及它们各自已知的状态。
-
当事件到来时:
- 根据目标状态决定前向或后向迭代(保证依赖顺序),逐一回调观察者;
- 同步把观察者的“已知状态”推进/回退到与全局一致。
-
线程模型:分发发生在调用 handleLifecycleEvent 的那个线程(正常是主线程)。
自己跨线程调用 setCurrentState/handleLifecycleEvent 是不安全的(系统已在主线程调度)。
常用写法
1) 观察者(推荐 DefaultLifecycleObserver)
class PlayerObserver(
private val start: () -> Unit,
private val stop: () -> Unit
) : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) { start() }
override fun onStop(owner: LifecycleOwner) { stop() }
}
// Activity/Fragment
lifecycle.addObserver(PlayerObserver(::play, ::pause))
2) 协程感知:lifecycleScope/repeatOnLifecycle
// 在 STARTED 及以上收集;转到 STOPPED 自动取消,重新 STARTED 自动重启
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { render(it) }
}
}
这是观察 Flow 的首选模板:避免手写 onStart/onStop 配对与泄漏。
3) LiveData 感知(老项目常见)
liveData.observe(viewLifecycleOwner) { render(it) } // 随生命周期自动订阅/反订阅
4) 进程级(前后台)
ProcessLifecycleOwner.get().lifecycle.addObserver(object: DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) { /* App 到前台 */ }
override fun onStop(owner: LifecycleOwner) { /* App 到后台 */ }
})
与 Compose 的配合(要点)
-
LaunchedEffect、DisposableEffect 自带生命周期钩子;需要与宿主生命周期对齐时仍用
repeatOnLifecycle(STARTED) + AndroidViewBinding/rememberCoroutineScope 等。
-
订阅流/回调不要放在 Composable 的 onClick 等一次性位置;放进 LaunchedEffect(key) 更安全。
和其他 Jetpack 组件的协作
-
ViewModel:独立于 Activity 生命周期(旋转不销毁),但通常在 ON_DESTROY(非配置变更)时清理。
-
SavedStateRegistry:在 CREATED 之后可读写状态,配合 ViewModel 做进程死亡恢复。
-
OnBackPressedDispatcher:也通过 Lifecycle 控制回调有效期。
最佳实践 & 常见陷阱
-
✅ 订阅/资源获取放在 STARTED/RESUMED,释放在 STOPPED/PAUSED;I/O 重活不要放主线程。
-
✅ Fragment 里观察 LiveData/Flow 用 viewLifecycleOwner,避免 View 重建导致泄漏/空指针。
-
✅ 统一用 repeatOnLifecycle 管收集周期;避免手写 onStart/onStop 漏配对。
-
❌ 不要依赖 ON_DESTROY 做关键持久化(进程被杀时不会回调);关键状态在 onStop 或后台任务里落盘。
-
❌ 不要在回调里做阻塞(sleep()/join()/get());会卡主线程触发 ANR。
迷你实现示意(简化)
class MyActivity : ComponentActivity(), LifecycleOwner {
private val registry = LifecycleRegistry(this)
override fun getLifecycle() = registry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
registry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
}
override fun onStart() { super.onStart(); registry.handleLifecycleEvent(Lifecycle.Event.ON_START) }
override fun onResume() { super.onResume(); registry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME) }
override fun onPause() { registry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); super.onPause() }
override fun onStop() { registry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); super.onStop() }
override fun onDestroy(){ registry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);super.onDestroy()}
}
一句话总结
Lifecycle = 可观察的生命周期状态机。系统在 Activity/Fragment 生命周期时机驱动 LifecycleRegistry,它再把状态变化可靠地分发给观察者、协程与数据通道,帮助你把“何时订阅/何时释放”做到正确且可维护。需要的话,我可以把你项目里的 Flow/回调订阅点逐个替换为 repeatOnLifecycle 模板,给一版改造清单。