Android Jetpack 系列(三) Lifecycle 生命周期感知组件详解

1. 简介

在开发自定义组件时,我们经常需要根据宿主组件(如 Activity 或 Fragment)的生命周期执行特定逻辑。传统做法是提供外部可调用方法,在宿主组件的生命周期回调中手动调用这些方法。这种方式虽然直接,但容易导致代码结构臃肿,逻辑分散,且随着功能复杂度提升,维护成本也会显著增加,出错的概率也更高。

为了解决这一痛点,Android Jetpack 提供了 androidx.lifecycle 软件包,引入了“生命周期感知组件(Lifecycle-aware components)”的概念。借助这些组件,我们可以让自定义组件自主感知宿主的生命周期变化,从而在组件内部完成逻辑管理,摆脱对外部回调的依赖,形成闭环。这样不仅使代码更加清晰、精简,也极大提升了可维护性和可复用性。

2. 传统实现示例

下面是一个传统实现方式的示例,用于展示如何在 Activity 中启动和停止定位服务:

class MyLocationListener(
    private val context: Context,
    private val callback: (Location) -> Unit
) {

    fun startLocationService() {
        // 连接系统定位服务
    }

    fun stopLocationService() {
        // 断开系统定位服务
    }

    fun clear() {
        // 释放资源
    }
}

class MainActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        myLocationListener = MyLocationListener(this) { location ->
            // 更新 UI
        }
    }

    override fun onStart() {
        super.onStart()
        myLocationListener.startLocationService()
    }

    override fun onStop() {
        super.onStop()
        myLocationListener.stopLocationService()
    }

    override fun onDestroy() {
        super.onDestroy()
        myLocationListener.clear()
    }
}

尽管这段代码看起来结构合理,但它暴露了一个常见问题:组件生命周期的管理依赖于外部调用。随着项目中自定义组件数量的增加,Activity 或 Fragment 的生命周期方法中将充斥着类似的调用逻辑,不仅可读性降低,也加大了出错风险,维护难度随之增加。

3. Lifecycle组件

为了让组件能够自动感知生命周期并解耦宿主逻辑,androidx.lifecycle 提供了更优雅的解决方案 —— Lifecycle 组件

androidx.lifecycle 包提供了一系列支持生命周期感知的类和接口。其核心是 Lifecycle 抽象类,用于表示和存储宿主组件(如 Activity 或 Fragment)的生命周期状态。自定义组件可以通过观察 Lifecycle 的状态变化,自动感知宿主生命周期,从而动态调整自身行为。

目前,Android Studio 新建项目默认已引入该库,如果是旧项目,需要手动添加 androidx.lifecycle 依赖,具体依赖项和版本信息请参考 Android 官网 Lifecycle 版本说明

3.1. LifecycleObserver(观察者)

Lifecycle 组件的核心是观察者模式。通过注册生命周期观察者,组件可以自动感知宿主的生命周期变化。实现 LifecycleObserver 的方式主要有三种。

3.1.1 继承 LifecycleObserver (已弃用)

最早的生命周期感知写法是实现 LifecycleObserver 接口,并使用 @OnLifecycleEvent 注解:

class MyLocationListener (
    private val context: Context,
    private val callback: (Location) -> Unit
) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun startLocationService() {
        // 连接系统定位服务
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stopLocationService() {
        // 断开系统定位服务
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun clear() {
        // 释放资源
    }
}

注意:从 lifecycle-runtime 2.4.0 开始,@OnLifecycleEvent 已被弃用。因为该方式依赖反射,存在性能和类型安全问题,不再推荐。

3.1.2.继承 LifecycleEventObserver (推荐)

推荐使用 LifecycleEventObserver,它提供统一的生命周期事件分发接口。

class MyLocationListener (
    private val context: Context,
    private val callback: (Location) -> Unit
) : LifecycleEventObserver {

    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_START -> startLocationService()
            Lifecycle.Event.ON_STOP -> stopLocationService()
            Lifecycle.Event.ON_DESTROY -> clear()
            else -> {}
        }
    }


    private fun startLocationService() {
        // 连接系统定位服务
    }

    private fun stopLocationService() {
        // 断开系统定位服务
    }

    private fun clear() {
        // 释放资源
    }
}

该接口适合:

  1. 需要监听全生命周期事件
  2. 动态注册场景

3.1.3.继承DefaultLifecycleObserver (更优推荐)

DefaultLifecycleObserver 是目前官方更推荐的写法,具备更好的语义性,且无需手动处理事件类型。

class MyLocationListener (
    private val context: Context,
    private val callback: (Location) -> Unit
) : DefaultLifecycleObserver {

    override fun onStart(owner: LifecycleOwner) {
        super.onStart(owner)
        startLocationService()
    }

    override fun onStop(owner: LifecycleOwner) {
        super.onStop(owner)
        stopLocationService()
    }

    override fun onDestroy(owner: LifecycleOwner) {
        super.onDestroy(owner)
        clear()

    }

    private fun startLocationService() {
        // 连接系统定位服务
    }

    private  fun stopLocationService() {
        // 断开系统定位服务
    }

    private  fun clear() {
        // 释放资源
    }
}

优势:

  1. 无需关心事件类型(更安全)
  2. 方法语义清晰(更易维护)

3.2. LifecycleOwner(被观察者)

LifecycleOwner 接口用于标识一个类拥有生命周期能力,所有 Activity 和 Fragment 默认都实现了 LifecycleOwner。

以 ComponentActivity 为例:

class ComponentActivity : Activity(), LifecycleOwner, KeyEventDispatcher.Component {

    private val lifecycleRegistry = LifecycleRegistry(this)

    override val lifecycle: Lifecycle
        get() = lifecycleRegistry
}

开发时,常用的 AppCompatActivity 和 Fragment 已默认实现,无需额外处理。

3.2.1.注册观测者

在宿主组件中,通过 lifecycle.addObserver() 注册观察者:

class MainActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        myLocationListener = MyLocationListener(this) { location ->
            // 更新UI
        }
        lifecycle.addObserver(myLocationListener)
    }
}

这样,自定义组件就可以自动感知宿主的生命周期变化,宿主无需手动调用组件内部方法。

3.3. Lifecycle 的事件和状态

Lifecycle 使用两种核心枚举:

3.1.1. Lifecycle.Event(生命周期事件)

生命周期事件是瞬时的动作:

  1. ON_CREATE → 组件被创建
  2. ON_START → 组件即将可见
  3. ON_RESUME → 组件获得焦点
  4. ON_PAUSE, ON_STOP, ON_DESTROY → 生命周期即将结束或中断

        事件更像是“门被打开”的瞬间。

3.1.2. Lifecycle.State(生命周期状态)

生命周期状态是持续性的:

  1. INITIALIZED →对象已构造但还没调用 onCreate
  2. CREATED →调用了 onCreate,但未可见
  3. STARTED →调用了 onStart,用户可见但不可交互
  4. RESUMED →调用了 onResume,用户可交互
  5. DESTROYED →被销毁

        状态更像是“门当前是开着的”。

3.1.3. Event 和 State 的关系

下面这图是 Android activity 生命周期的状态和事件:

事件和状态的对应关系:

生命周期事件(Lifecycle.Event)

触发后对应的状态(Lifecycle.State)

ON_CREATE

CREATED

ON_START

STARTED

ON_RESUME

RESUMD

ON_PAUSE

STARTED

ON_STOP

CREATED

ON_DESTROY

DESTROYED

🔍 为什么没有 PAUSED 或 STOPPED 状态?

因为它们并不是持久状态,系统只将 STARTED、CREATED、RESUMED 等视为稳定状态。PAUSED 和 STOPPED 更像是过渡阶段。

3.4. 自定义 LifecycleOwner —— LifecycleRegistry

如果需要让自定义类(如 自定义View、任意组件)也具备生命周期能力,使其成为被观察者,可以使用 LifecycleRegistry。示例:

自定义被观察者 LifecycleOwner

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

    override val lifecycle: Lifecycle
        get() = lifecycleRegistry

    fun onCreate() {
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
    }

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

    fun onResume() {
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
    }

    fun onPause() {
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    }

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

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

观察者

class MyLifecycleObserver : DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {
        println("Observer: onCreate, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onStart(owner: LifecycleOwner) {
        println("Observer: onStart, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onResume(owner: LifecycleOwner) {
        println("Observer: onResume, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onPause(owner: LifecycleOwner) {
        println("Observer: onPause, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onStop(owner: LifecycleOwner) {
        println("Observer: onStop, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        println("Observer: onDestroy, 当前状态=${owner.lifecycle.currentState}")
    }
}

注册与模拟生命周期

val myLifecycleObserver = MyLifecycleObserver()
val myLifecycleOwner = MyLifecycleOwner()

myLifecycleOwner.lifecycle.addObserver(myLifecycleObserver)

// 模拟生命周期事件流转
myLifecycleOwner.onCreate()
myLifecycleOwner.onStart()
myLifecycleOwner.onResume()
myLifecycleOwner.onPause()
myLifecycleOwner.onStop()
myLifecycleOwner.onDestroy()

同理,如果你有一个旧较的项目中的Activity希望使其成为生命周期的被观察者。示例:

被观察者MyActivity

class MyActivity : Activity(), LifecycleOwner {
    private lateinit var lifecycleRegistry: LifecycleRegistry

    override val lifecycle: Lifecycle
        get() = lifecycleRegistry

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleRegistry = LifecycleRegistry(this)


        val myLifecycleObserver = MyLifecycleObserver()
        lifecycle.addObserver(myLifecycleObserver)

//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
    }

//    override fun onStart() {
//        super.onStart()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
//    }
//
//    override fun onResume() {
//        super.onResume()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
//    }
//
//    override fun onPause() {
//        super.onPause()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
//    }
//
//    override fun onStop() {
//        super.onStop()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
//    }
//
//    override fun onDestroy() {
//        super.onDestroy()
//        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
//    }
}

🔍 即使注释了 handleLifecycleEvent,为什么观察者类中仍然有回调?

如果项目已经引入 androidx.lifecycle:lifecycle-runtime 或 lifecycle-runtime-ktx,Jetpack 会通过 Application.registerActivityLifecycleCallbacks 自动同步生命周期状态。

核心逻辑在 lifecycle-runtime 的内部源码:

lifecycle-runtime/src/androidMain/kotlin/androidx/lifecycle/ReportFragment.android.kt

@JvmStatic
internal fun dispatch(activity: Activity, event: Lifecycle.Event) {
    if (activity is LifecycleRegistryOwner) {
        activity.lifecycle.handleLifecycleEvent(event)
        return
    }
    if (activity is LifecycleOwner) {
        val lifecycle = (activity as LifecycleOwner).lifecycle
        if (lifecycle is LifecycleRegistry) {
            lifecycle.handleLifecycleEvent(event)
        }
    }
}

简单来说:

  1. Jetpack 监听所有 Activity 生命周期
  2. 如果 Activity 实现了 LifecycleOwner,并返回 LifecycleRegistry
  3. 系统会自动同步状态,无需手动调用
  4. 这就是为什么在 AndroidX 项目中,很多情况下我们可以直接使用 lifecycle.addObserver 而无需额外处理。

4. 在 Service 中使用Lifecycle

在 Android 的原生设计中,Service 并未实现 LifecycleOwner 接口,无法直接被 Jetpack Lifecycle 框架感知或观察。如果你希望在 Service 中使用 lifecycle.addObserver(),就必须“伪造”一个 LifecycleOwner。

Jetpack 官方提供了 ServiceLifecycleDispatcher,用于为 Service 提供生命周期感知能力。

4.1. ServiceLifecycleDispatcher

ServiceLifecycleDispatcher 是 Jetpack 在 androidx.lifecycle:lifecycle-service 库中提供的类,可以帮助 Service 组件拥有 Lifecycle 能力。通过它,Service 可以成为 LifecycleOwner,进而支持 LifecycleObserver 或 DefaultLifecycleObserver。示例:

被观察者 MyService

class MyService : Service(), LifecycleOwner {
    private var dispatcher = ServiceLifecycleDispatcher(this)

    override val lifecycle: Lifecycle
        get() = dispatcher.lifecycle

    private val myLifecycleObserver = MyLifecycleObserver()

    override fun onCreate() {
        dispatcher.onServicePreSuperOnCreate()
        super.onCreate()

        lifecycle.addObserver(myLifecycleObserver)
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        dispatcher.onServicePreSuperOnStart()
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        dispatcher.onServicePreSuperOnDestroy()
        super.onDestroy()
    }

    override fun onBind(intent: Intent): IBinder? {
        dispatcher.onServicePreSuperOnBind()
        return null
    }
}

观察者 MyLifecycleObserver

class MyLifecycleObserver : DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {
        println("Observer: onCreate, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onStart(owner: LifecycleOwner) {
        println("Observer: onStart, 当前状态=${owner.lifecycle.currentState}")
    }

//    override fun onResume(owner: LifecycleOwner) {
//        println("Observer: onResume, 当前状态=${owner.lifecycle.currentState}")
//    }
//
//    override fun onPause(owner: LifecycleOwner) {
//        println("Observer: onPause, 当前状态=${owner.lifecycle.currentState}")
//    }

    override fun onStop(owner: LifecycleOwner) {
        println("Observer: onStop, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        println("Observer: onDestroy, 当前状态=${owner.lifecycle.currentState}")
    }
}

说明:

  1. ServiceLifecycleDispatcher 内部维护了一个 LifecycleRegistry,通过调用 onServicePreSuperOnXXX() 方法,实际是驱动 LifecycleRegistry 的状态变化,并通知所有注册的观察者。
  2. dispatcher.onServicePreSuperOnXXX 方法必须在 super.XXX() 方法之前调用,这是 Jetpack 官方推荐的调用顺序,确保生命周期事件及时分发,避免生命周期状态滞后,导致观察者感知不准确。
  3. 在 Service 中没有 onResume 和 onPause,因此观察者不需要实现这两个回调。

4.2. 对应生命周期映射关系

Service 方法

Dispatcher 方法

分发的 Lifecycle 事件顺序

Lifecycle 状态变化

onCreate()

onServicePreSuperOnCreate()

ON_CREATE

INITIALIZED → CREATED

onStartCommand()

onServicePreSuperOnStart()

ON_START

CREATED → STARTED

onBind()

onServicePreSuperOnBind()

ON_START

CREATED → STARTED

onDestroy()

onServicePreSuperOnDestroy()

ON_STOP→ON_DESTROY

STARTED → DESTROYED

4.3. LifecycleService(官方封装)

如果不想手动管理 ServiceLifecycleDispatcher,Jetpack 已封装了 LifecycleService,你只需继承它即可自动获得 LifecycleOwner 能力。示例:

修改被观察者 MyService

class MyService : LifecycleService() {
    private val myLifecycleObserver = MyLifecycleObserver()

    override fun onCreate() {
        super.onCreate()

        lifecycle.addObserver(myLifecycleObserver)
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onBind(intent: Intent): IBinder? {
        super.onBind(intent)
        return null
    }
}

说明:

LifecycleService 已自动处理 Dispatcher 的生命周期管理,开发者只需专注于注册观察者即可。

5. 在 Application 中使用 Liefcycle

5.1. 传统方案:Activity 计数法

过去,监听应用是否处于前台,通常通过 registerActivityLifecycleCallbacks 来实现。示例:

var activityCount = 0
fun registerActivityLifecycleCallbacks(application: Application) {
    application.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
        override fun onActivityStarted(activity: Activity) {
        }

        override fun onActivityResumed(activity: Activity) {
            activityCount++
        }
        override fun onActivityPaused(activity: Activity) {
            activityCount--
        }
        override fun onActivityStopped(activity: Activity) { }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        override fun onActivityDestroyed(activity: Activity) { }
    })
}

通过判断 activityCount > 0,可以推断应用是否处于前台。

5.2. 推荐方案:ProcessLifecycleOwner

Jetpack 在androidx.lifecycle:lifecycle-process 库提供了更简洁的全局生命周期感知类 ProcessLifecycleOwner,用于监听整个应用的生命周期状态。示例:

被观察者 MyApplication

class MyApplication : Application() {
    private val myLifecycleObserver = MyLifecycleObserver()

    override fun onCreate() {
        super.onCreate()

        ProcessLifecycleOwner.get().lifecycle.addObserver(myLifecycleObserver)
    }
}

观察者 MyLifecycleObserver

class MyLifecycleObserver : DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {
        println("Observer: onCreate, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onStart(owner: LifecycleOwner) {
        println("Observer: onStart, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onResume(owner: LifecycleOwner) {
        println("Observer: onResume, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onPause(owner: LifecycleOwner) {
        println("Observer: onPause, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onStop(owner: LifecycleOwner) {
        println("Observer: onStop, 当前状态=${owner.lifecycle.currentState}")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        println("Observer: onDestroy, 当前状态=${owner.lifecycle.currentState}")
    }
}

说明:

  1. ProcessLifecycleOwner 监听的是整个应用进程的生命周期,与 Activity 或 Service 数量无关。
  2. onCreate 仅在应用启动时调用一次,onDestroy 不会被调用,因为应用被杀死时不会触发常规生命周期。
  3. 当应用从前台退到后台时,会依次调用 onPause → onStop;从后台回到前台时,会依次调用 onStart → onResume。
  4. onPause 和 onStop 的调用存在一定延迟,系统会等待确认是否为屏幕旋转或短暂切换场景,避免误判。

6. 总结

Jetpack Lifecycle 框架为 Android 提供了更优雅、更统一的生命周期管理能力。虽然 Activity 和 Fragment 天生支持 Lifecycle,但 Service 和 Application 这类组件原生并不具备 Lifecycle 感知能力。针对这种情况,Jetpack 提供了相应的扩展工具:

  1. 在 Service 中,可以通过 ServiceLifecycleDispatcher 手动接入 Lifecycle,或者直接继承官方封装好的 LifecycleService,简化开发流程。
  2. 在 Application 中,可以使用 ProcessLifecycleOwner 全局感知应用的前后台状态,相比传统的 Activity 计数法更加准确和便捷。

合理地使用 Lifecycle,不仅有助于简化生命周期事件的监听,还能避免内存泄漏、回调失效等问题,提升应用的架构健壮性和代码可维护性。了解并掌握这些进阶用法,有助于开发者在复杂场景中写出更优雅的 Android 应用。

更多详细的 Lifecycle 介绍,请访问 Android 开发者官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值