跳到主要内容

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_CREATEON_START
  • 状态(State):当前处于的阶段,如 CREATEDSTARTEDRESUMED

事件触发状态转换,如 ON_START 事件使状态从 CREATED 变为 STARTED

Q2: Lifecycle 的实现原理?

答案

  1. ComponentActivityonCreate 中注入了一个透明的 ReportFragment
  2. ReportFragment 在自己的生命周期回调中分发事件给 LifecycleRegistry
  3. LifecycleRegistry 通知所有观察者,并保证新注册的观察者会追赶到当前状态

Q3: repeatOnLifecycle 的作用?

答案

在指定的生命周期状态期间持续收集 Flow,状态低于目标时自动取消协程:

lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state ->
// 只在 STARTED 及以上状态时收集
}
}
}

相关链接