android中的Lifecycle

65 阅读3分钟

什么是 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)。

它是如何工作的(内部机制)

  1. ComponentActivity / Fragment 在各自的 onCreate/onStart/... 中调用

    mLifecycleRegistry.handleLifecycleEvent(ON_*)。

  2. LifecycleRegistry 维护:

    • 当前状态 currentState;
    • 一个有序 Map 存放观察者及它们各自已知的状态
  3. 当事件到来时:

    • 根据目标状态决定前向或后向迭代(保证依赖顺序),逐一回调观察者;
    • 同步把观察者的“已知状态”推进/回退到与全局一致。
  4. 线程模型:分发发生在调用 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 模板,给一版改造清单。