Lifecycle

什么是 Lifecycle?

LifecycleJetpack 架构组件中的核心类,用于统一管理 Android 组件(Activity、Fragment 等)的生命周期,并通过观察者模式向外部暴露生命周期的变化。

传统上,我们需要在 onCreateonStartonDestroy 等方法里手动写逻辑,很容易产生内存泄漏或重复代码。而 Lifecycle 的引入,让我们可以只关心“生命周期状态的变化”,而不用和具体回调方法绑定。

Lifecycle 本质上就是一个抽象类,提供了注册和移除观察者的能力:

public abstract class Lifecycle {
    // 添加观察者
    public abstract fun addObserver(observer: LifecycleObserver)
    
    // 删除观察者
    public abstract fun removeObserver(observer: LifecycleObserver)
}

ActivityFragment 等组件则实现了 LifecycleOwner 接口,要求提供一个 lifecycle 属性:

public interface LifecycleOwner {
    /**
     * 返回该组件的 Lifecycle
     */
    public val lifecycle: Lifecycle
}

这样一来,我们就能在任意地方对生命周期进行观察,而不必耦合到 Activity/Fragment 的具体方法中。

lifecycleScope

有了生命周期的监听机制,Google 官方进一步提供了协程作用域lifecycleScope。它是 LifecycleOwner 的扩展属性,可以直接在 ActivityFragment 中使用:

lifecycleScope.launch {
    // 在生命周期结束时自动取消
}

为什么会自动取消?因为在 LifecycleOwner.kt 中,Google 用 原子引用 + CAS 的方式,确保每个生命周期只持有一个唯一的 LifecycleCoroutineScope

// LifecycleOwner.kt
public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
    get() = lifecycle.coroutineScope

// Lifecycle.kt
public val Lifecycle.coroutineScope: LifecycleCoroutineScope
    get() {
        while (true) {
            val existing = internalScopeRef.get() as LifecycleCoroutineScopeImpl?
            if (existing != null) {
                return existing
            }
            val newScope = LifecycleCoroutineScopeImpl(
                this,
                SupervisorJob() + Dispatchers.Main.immediate
            )
            if (internalScopeRef.compareAndSet(null, newScope)) {
                newScope.register() // 将协程作用域注册到 Lifecycle
                return newScope
            }
        }
    }

LifecycleCoroutineScopeImpllifecycleScope 的实际实现。它本身就是一个 LifecycleEventObserver,会随着生命周期的变化自动管理协程:

internal class LifecycleCoroutineScopeImpl(
    override val lifecycle: Lifecycle,
    override val coroutineContext: CoroutineContext
) : LifecycleCoroutineScope(), LifecycleEventObserver {
    
    init {
        // 初始化时如果 Lifecycle 已经销毁,则立即取消协程
        if (lifecycle.currentState == Lifecycle.State.DESTROYED) {
            coroutineContext.cancel()
        }
    }
    
    fun register() {
        launch(Dispatchers.Main.immediate) {
            if (lifecycle.currentState >= Lifecycle.State.INITIALIZED) {
                lifecycle.addObserver(this@LifecycleCoroutineScopeImpl)
            } else {
                coroutineContext.cancel()
            }
        }
    }

    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        if (lifecycle.currentState <= Lifecycle.State.DESTROYED) {
            lifecycle.removeObserver(this)   // 移除观察者
            coroutineContext.cancel()        // 取消协程
        }
    }
}

总结:lifecycleScope 作用域会注册为观察者,当状态变为 DESTROYED 时自动取消协程,避免内存泄漏,开发者不再需要手动 cancel() 协程。


LiveData

ViewModel

Flow

ViewBinding DataBinding

WorkManager