2、Lifecycle:Lifecycle原理、LifecycleObserver、LifecycleOwner、自定义LifecycleOwner、实战:感知生命周期

各位同学,今天我们来聊聊 Jetpack 里最基础、也最核心的一个组件——Lifecycle

说实话,我刚开始接触 Android 开发那会儿,最头疼的就是生命周期管理。Activity 和 Fragment 的生命周期回调散落在各处,稍不留神就会在 onDestroy 之后还去更新 UI,直接崩给你看。后来 Google 推出了 Lifecycle 组件,我才算真正解脱了。

说白了,Lifecycle 就是一套标准化的生命周期感知方案。它让我们的组件能够主动「知道」当前处于哪个生命周期阶段,从而做出正确的行为。

Lifecycle 的核心原理

Lifecycle 本身是一个抽象类,它维护了一个状态机。这个状态机有两个关键概念:EventState

概念 说明
Event 生命周期事件,比如 ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY
State 当前生命周期状态,比如 CREATED、STARTED、RESUMED、DESTROYED

Event 推动 State 的变化。举个例子:当 Activity 走到 onCreate,Lifecycle 会分发 ON_CREATE 事件,状态就从 INITIALIZED 变为 CREATED。当 onStart 被调用,ON_START 事件发出,状态变为 STARTED。嗯,这里要注意:状态是向上走的,不会跳级。

核心要点:Lifecycle 使用观察者模式。LifecycleOwner 是被观察者,LifecycleObserver 是观察者。当生命周期变化时,LifecycleOwner 通知所有注册的 Observer。

我画了一张图,帮你理解这个流程:

Lifecycle 状态机与观察者模式 INITIALIZED CREATED STARTED RESUMED DESTROYED ON_CREATE ON_START ON_RESUME ON_PAUSE ON_STOP ON_DESTROY LifecycleObserver 通知

LifecycleObserver:如何监听生命周期

LifecycleObserver 是一个空接口,我们通过注解或者 DefaultLifecycleObserver 来实现监听。

我个人习惯用 DefaultLifecycleObserver,因为它是 Java 8 接口,方法名清晰,不需要反射。你想想看,用注解的方式虽然也行,但反射毕竟有性能损耗,而且容易写错方法名。

class MyObserver : DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {
        // 初始化操作
    }

    override fun onStart(owner: LifecycleOwner) {
        // 开始操作
    }

    override fun onResume(owner: LifecycleOwner) {
        // 恢复操作
    }

    override fun onPause(owner: LifecycleOwner) {
        // 暂停操作
    }

    override fun onStop(owner: LifecycleOwner) {
        // 停止操作
    }

    override fun onDestroy(owner: LifecycleOwner) {
        // 清理操作
    }
}

小技巧:如果你只需要监听个别事件,用注解方式更简洁。比如只关心 onDestroy:

class MyObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun cleanUp() {
        // 清理资源
    }
}

LifecycleOwner:谁提供生命周期

LifecycleOwner 是一个接口,只有一个方法:getLifecycle()。AppCompatActivity 和 Fragment 默认实现了这个接口。所以你在 Activity 里可以直接调用 lifecycle.addObserver(observer)

我记得有一次,我在一个自定义 View 里需要感知 Activity 的生命周期。当时我直接传入了 Activity 实例,但这样耦合太强了。后来我改成传入 LifecycleOwner,代码立马清爽了很多。

class MyCustomView(context: Context, attrs: AttributeSet?) : View(context, attrs) {

    fun bindLifecycle(owner: LifecycleOwner) {
        owner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onDestroy(owner: LifecycleOwner) {
                // 释放资源
            }
        })
    }
}

自定义 LifecycleOwner

有时候我们需要自己实现 LifecycleOwner。比如你写了一个自定义的 Service,或者一个后台任务管理器,想让外部组件感知它的生命周期。

怎么做呢?核心就是使用 LifecycleRegistry。它是 Lifecycle 的具体实现类,负责管理状态和分发事件。

class MyLifecycleOwner : LifecycleOwner {
    private val lifecycleRegistry = LifecycleRegistry(this)

    override fun getLifecycle(): Lifecycle = lifecycleRegistry

    fun start() {
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
    }

    fun stop() {
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
    }

    fun destroy() {
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    }
}

注意:LifecycleRegistry 不是线程安全的。如果你在多线程环境下调用 handleLifecycleEvent,需要自己加锁。我曾经在项目里踩过这个坑,多个线程同时触发事件,导致状态错乱。后来我加了一个 synchronized 块才解决。

实战:感知生命周期

光说不练假把式。我们来看一个实际场景:定位管理器。在 Activity 可见时开始定位,不可见时停止定位,避免电量浪费。

class LocationManager(private val lifecycleOwner: LifecycleOwner) {

    init {
        lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onStart(owner: LifecycleOwner) {
                startLocationUpdates()
            }

            override fun onStop(owner: LifecycleOwner) {
                stopLocationUpdates()
            }
        })
    }

    private fun startLocationUpdates() {
        // 开始定位
    }

    private fun stopLocationUpdates() {
        // 停止定位
    }
}

在 Activity 中使用:

class MainActivity : AppCompatActivity() {
    private lateinit var locationManager: LocationManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        locationManager = LocationManager(this)
    }
}

你看,这样写的好处是:LocationManager 完全不需要知道 Activity 的存在。它只依赖 LifecycleOwner,生命周期逻辑完全由 Lifecycle 组件托管。这就是解耦的魅力。

总结一下:Lifecycle 组件让生命周期管理变得可预测、可测试、可复用。它把「什么时候该做什么事」这个逻辑从 Activity/Fragment 中抽离出来,放到了专门的 Observer 里。你想想看,如果你的项目里到处都是生命周期相关的 if-else,那代码该有多乱?

好了,这一章的内容就到这里。Lifecycle 虽然基础,但它是 LiveData、ViewModel、Room 等组件的基石。把这一章吃透,后面的学习会轻松很多。


公众号:蓝海资料掘金营,微信deep3321