一、接口定义
两者都来自 androidx.lifecycle,用于监听 LifecycleOwner(如 Activity、Fragment)的生命周期。
| 接口 | 包路径 | 核心方法 |
|---|---|---|
| LifecycleEventObserver | androidx.lifecycle.LifecycleEventObserver | onStateChanged(owner, event),在一个方法里处理所有事件 |
| DefaultLifecycleObserver | androidx.lifecycle.DefaultLifecycleObserver | onCreate/onStart/onResume/onPause/onStop/onDestroy,每个事件一个方法(带默认空实现) |
二、LifecycleEventObserver
特点:只有一个回调,通过 Lifecycle.Event 区分事件。
// Kotlin 示例
lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> { /* 创建 */ }
Lifecycle.Event.ON_START -> { /* 启动 */ }
Lifecycle.Event.ON_RESUME -> { /* 恢复 */ }
Lifecycle.Event.ON_PAUSE -> { /* 暂停 */ }
Lifecycle.Event.ON_STOP -> { /* 停止 */ }
Lifecycle.Event.ON_DESTROY -> { /* 销毁 */ }
Lifecycle.Event.ON_ANY -> { /* 任意事件 */ }
}
}
})
● 适合:需要在一个地方统一处理多种事件、或要根据 event 做分支逻辑时使用。
● 注意:ON_ANY 会在每个事件时都触发,一般较少用。
三、DefaultLifecycleObserver
特点:每个生命周期阶段对应一个方法,只实现关心的即可,其余用默认空实现。
// Kotlin 示例
lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
// 对应 ON_CREATE
}
override fun onStart(owner: LifecycleOwner) {
// 对应 ON_START
}
override fun onResume(owner: LifecycleOwner) {
// 对应 ON_RESUME
}
override fun onPause(owner: LifecycleOwner) {
// 对应 ON_PAUSE
}
override fun onStop(owner: LifecycleOwner) {
// 对应 ON_STOP
}
override fun onDestroy(owner: LifecycleOwner) {
// 对应 ON_DESTROY
}
})
● 适合:按「阶段」写逻辑,代码更直观,也便于只实现部分回调(如只关心 onResume/onPause)。
● 官方在 Java 8+ 和 lifecycle 2.4.0+ 下更推荐用这个替代旧的 @OnLifecycleEvent 注解。
四、对比与选择
| 对比项 | LifecycleEventObserver | DefaultLifecycleObserver |
|---|---|---|
| 写法 | 一个方法 + when(event) | 多个方法,按阶段实现 |
| 可读性 | 事件集中,需自己分支 | 方法名即含义,更清晰 |
| 灵活性 | 方便统一处理、自定义分支 | 按阶段拆分,结构固定 |
| 推荐场景 | 需要根据 event 做统一分发、或逻辑集中在一处 | 常规生命周期回调、只关心部分阶段 |
简单选择建议:
● 只关心「创建、启动、恢复、暂停、停止、销毁」中的某几个阶段 → 用 DefaultLifecycleObserver。
● 需要在一个回调里根据 Lifecycle.Event 做统一处理或复杂分支 → 用 LifecycleEventObserver。
五、注册方式(两者相同)
// Activity / Fragment 中
lifecycle.addObserver(myObserver)
移除观察者(避免内存泄漏):
lifecycle.removeObserver(myObserver)