Lifecycle介绍及基本用法

51 阅读2分钟

为什么需要 Lifecycle

在应用开发中,处理 Activity 或 Fragment 组件的生命周期相关代码是必不可免的。通常,我们会采用如下做法来管理生命周期:

class MyLocationListener {

    fun start() {
        // 开始监听位置变化
    }

    fun stop() {
        // 停止监听位置变化
    }
}

class MyActivity : AppCompatActivity() {

    private lateinit var myLocationListener: MyLocationListener

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

        myLocationListener = MyLocationListener()
    }

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

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

虽然此示例看起来没问题,但在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart()onStop())中放置大量的代码,这使得它们难以维护。

此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。例如,在需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时,这可能会导致出现一种竞态条件,即 onStop() 方法会在 onStart() 之前结束,使得组件留存的时间比所需的时间要长。

因此,我们需要一个能管理 Activity 和 Fragment 生命周期的库,这个库就是 Lifecycle。

如何使用 Lifecycle

2.1 添加依赖

要使用 Lifecycle,首先需要在项目中添加相关依赖项。常用的依赖项如下:

dependencies {
    def lifecycle_version = "1.1.1"

    // 包含 ViewModel 和 LiveData
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    // 仅包含 ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // 仅包含 LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    // 仅包含 Lifecycles
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
    
    kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
    // 如果用 Java 8, 用于替代 compiler
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

    // 可选,ReactiveStreams 对 LiveData 的支持
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version"

    // 可选,LiveData 的测试
    testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}

在日常开发中,一般只需添加以下依赖项,如果需要额外的功能再单独添加即可:

// 包含 ViewModel 和 LiveData
implementation "androidx.lifecycle:lifecycle-extensions:1.1.1"

2.2 Lifecycle 基本用法

以下是一个使用 Lifecycle 进行生命周期管理的示例:

class MyLifecycleObserver : LifecycleEventObserver {

    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_START -> {
                // 处理启动事件
            }
            Lifecycle.Event.ON_STOP -> {
                // 处理停止事件
            }
            else -> {}
        }
    }
}

class MyLifecycleActivity : AppCompatActivity() {

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

        lifecycle.addObserver(MyLifecycleObserver())
    }
}

在这个示例中,我们创建了一个 MyLifecycleObserver 类,实现了 LifecycleEventObserver 接口,并在 onStateChanged 方法中处理生命周期事件。然后,在 MyLifecycleActivity 中,通过 lifecycle.addObserver 方法将该观察者添加到生命周期中。

通过这种方式,我们可以将生命周期相关的逻辑从 ActivityFragment 中分离出来,使代码更易于维护和测试。