LifecycleOwner 与 Observer · AndroidX 源码指南
AAndroidX 源码指南
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
CREATEDON_CREATE 之后
STARTEDON_START 之后
RESUMEDON_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 后访问 lifecyclecurrentState 已是 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;“发生了什么”监听事件。

相关页面