Lifecycle
应用基础 · androidx.lifecycle
LifecycleOwner 与 Observer2.12.0-alpha01
Lifecycle State/Event 的区别、观察者注册、DefaultLifecycleObserver 与自定义 Owner。
最后更新 2026-08-01
三个角色
LifecycleOwner:只暴露val lifecycle: Lifecycle。Lifecycle:保存当前State,管理 observer 列表,驱动状态转换。LifecycleObserver:接收Event回调。
class CameraObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) { startPreview() }
override fun onStop(owner: LifecycleOwner) { stopPreview() }
}
lifecycle.addObserver(CameraObserver())State 与 Event 的核心区别
源码定义(lifecycle-common/.../Lifecycle.kt:138,342):
Event(发生的事):ON_CREATE → ON_START → ON_RESUME → ON_PAUSE → ON_STOP → ON_DESTROY
State(稳定状态):DESTROYED → INITIALIZED → CREATED → STARTED → RESUMED
关系:
| State | 到达该状态前发生的 Event |
|---|---|
| CREATED | ON_CREATE 之后 |
| STARTED | ON_START 之后 |
| RESUMED | ON_RESUME 之后 |
用法区别:
- “当前至少 STARTED 吗?” → 查
lifecycle.currentState >= State.STARTED - “刚刚发生了什么?” → 监听 Event 回调(
onStart等)
观察者注册的时机
class MainActivity : ComponentActivity() {
private val observer = CameraObserver()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 尽早注册,避免错过状态
lifecycle.addObserver(observer)
}
override fun onDestroy() {
super.onDestroy()
// 一般不需要手动移除:owner 销毁时自动清理
}
}addObserver 在当前状态之前的事件会立即补发(如 CREATED 状态注册时,先收到 ON_CREATE),保证初始化一致性。
用 ON_ANY 监听全部事件
class LifecycleLogger : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> Log.d(TAG, "created")
Lifecycle.Event.ON_START -> Log.d(TAG, "started")
else -> {}
}
}
}自定义 Owner
需要给自定义宿主提供生命周期时用 LifecycleRegistry:
class CustomHost : LifecycleOwner {
private val registry = LifecycleRegistry(this)
override val lifecycle: Lifecycle get() = registry
fun startHosting() {
registry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
fun stopHosting() {
registry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
}
}必须由宿主准确转发状态:漏发或乱序会让 observer 收到错误回调。普通 Activity/Fragment/Compose 页面不需要自己建 registry。
常见陷阱
- 在 onDestroy 后访问 lifecycle:
currentState已是 DESTROYED,addObserver行为未定义。 - 忘注册就等回调:observer 没 add 就永远收不到事件。
- 注册时机过晚:需要初始化数据的逻辑放 onCreate 的 observer 回调里,而不是注册后假设会触发。
- 自定义 registry 乱序:handleLifecycleEvent 必须按真实顺序调用。
复制即用
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Lifecycle
class LocationObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) { startUpdates() }
override fun onStop(owner: LifecycleOwner) { stopUpdates() }
}
// Activity 中
lifecycle.addObserver(LocationObserver())
// 组合时(Compose)
DisposableEffect(Unit) {
val observer = LocationObserver()
lifecycle.addObserver(observer)
onDispose { lifecycle.removeObserver(observer) }
}要点
- Owner 只暴露 lifecycle;State 是稳定状态,Event 是转换。
- 观察者用
DefaultLifecycleObserver按状态回调;ON_ANY监听全部。 - 尽早注册,owner 销毁自动清理;自定义 registry 要准确转发。
- “是否处于某状态”查 currentState;“发生了什么”监听事件。