Lifecycle 生命周期感知
问题
Jetpack Lifecycle 组件是什么?它如何解决生命周期相关的问题?
答案
核心概念
Lifecycle 组件提供了一套生命周期感知能力,让业务组件(定位、播放器等)能自动响应 Activity/Fragment 的生命周期,无需在 onStart()/onStop() 中手动管理。
三大核心接口
// 1. LifecycleOwner —— 生命周期的持有者
// Activity、Fragment 默认实现
interface LifecycleOwner {
val lifecycle: Lifecycle
}
// 2. LifecycleObserver —— 观察者(推荐用 DefaultLifecycleObserver)
class LocationTracker(private val context: Context) : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// 开始定位
}
override fun onStop(owner: LifecycleOwner) {
// 停止定位
}
}
// 3. 注册
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(LocationTracker(this))
}
}
优势对比
| 方式 | 传统写法 | Lifecycle 感知 |
|---|---|---|
| 代码位置 | 分散在 Activity 各回调中 | 集中在组件自身 |
| 维护性 | Activity 膨胀 | 高内聚、可复用 |
| 安全性 | 容易忘记取消注册 | 自动跟随生命周期 |
ProcessLifecycleOwner
监听整个应用的前后台状态:
class AppLifecycleObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// 应用进入前台
}
override fun onStop(owner: LifecycleOwner) {
// 应用进入后台
}
}
// Application 中注册
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
常见面试问题
Q1: Lifecycle 的状态和事件有什么区别?
答案:
- 事件(Event):对应 Activity/Fragment 的回调,如
ON_CREATE、ON_START - 状态(State):当前处于的阶段,如
CREATED、STARTED、RESUMED
事件触发状态转换,如 ON_START 事件使状态从 CREATED 变为 STARTED。
Q2: Lifecycle 的实现原理?
答案:
ComponentActivity在onCreate中注入了一个透明的ReportFragmentReportFragment在自己的生命周期回调中分发事件给LifecycleRegistryLifecycleRegistry通知所有观察者,并保证新注册的观察者会追赶到当前状态
Q3: repeatOnLifecycle 的作用?
答案:
在指定的生命周期状态期间持续收集 Flow,状态低于目标时自动取消协程:
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state ->
// 只在 STARTED 及以上状态时收集
}
}
}