Android Jetpack架构组件-Lifecycle使用

在这里插入图片描述

一、 定义

Lifecycle是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

  • 为什么需要Lifecycle

在实际应用开发中,多数应用组件都存在生命周期,但是生命周期由操作系统和进程中运行的框架代码管理,它们是Android运行方式的核心,应用必须遵循它们,如果不这样做,可能会引发内存泄漏甚至应用崩溃

  • 举一个简单的定位服务应用示例:

假如我们有一个屏幕上显示设备位置的Activity,常规实现如下所示:

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

    fun start() {
        // connect to system location service
        Log.d("lifecycle","MyLocationListener start")
    }

    fun stop() {
        // disconnect from system location service
        Log.d("lifecycle","MyLocationListener stop")
    }
}

在Activity中通过接口回调来实现UI更新

class LifecycleActivity : AppCompatActivity() {

    private lateinit var myLocationListener: MyLocationListener

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lifecycle)
        myLocationListener = MyLocationListener(this) {
            //更新UI
        }
    }

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

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

虽然此示例看起来没问题,但在实际的应用中,定位功能会有太多界面和其他组件的调用,这样写会有啥问题?

  • 在生命周期方法(如 onStart()onStop())中放置大量的代码,显得不太优雅且难以维护

  • 在组件中做了耗时操作(比如在onStart方法),这种写法就无法保证组件在Activity或者Fragment停止之前完成启动。

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

二、如何使用Lifecycle控件

  • 举一个使用Lifecycle的简单例子

新建一个LastLocationListener类,它实现了LifecycleObserver接口,说明LastLocationListener成为了一个Lifecycle的观察者。

class LastLocationListener :LifecycleObserver{

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start() {
        // connect to system location service
        Log.d("lifecycle","LastLocationListener start")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop() {
        // disconnect from system location service
        Log.d("lifecycle","LastLocationListener stop")
    }
}

在Activity中实现观察者注册

class LifecycleActivity : AppCompatActivity() {

    private lateinit var lastLocationListener: LastLocationListener

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lifecycle)
		// 注释1 
        lastLocationListener = LastLocationListener()
        lifecycle.addObserver(lastLocationListener)

    }
}

然后在注释1处将LastLocationListener添加到LifecycleOwner中。LifecycleOwner是一个接口,其内部只有一个方法getLifecycle(),getLifecycle方法用于获取Lifecycle,这样就可以将LastLocationListener添加到Lifecycle中,当Lifecycle的生命周期发生变化时,LastLocationListener就会观察到,或者说是感知到。

  • 日志输出:

在这里插入图片描述

简单说明一下就是:

先实现LastLocationListener,对ON_STARTON_STOP事件进行监听。因为在Android Support Library 26.1.0及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,所以在注释1处可以直接使用getLifecycle方法获取Lifecycle对象,这样LastLocationListener就可以观察LifecycleActivity的生命周期变化了,LifecycleOwner可以理解为被观察者,默认实现了LifecycleOwner接口,也就是说LifecycleActivity是被观察者。

只要在LifecycleActivity的onCreate方法中添加LastLocationListener,那么LastLocationListener就可以观察到LifecycleActivity的各个生命周期的变化。

三、自定义LifecycleOwner

如果想实现自定义LifecycleOwner,可以使用LifecycleRegistry,它是Lifecycle的实现类。Android Support Library 26.1.0及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,因此我们可以这么写:

package com.onexzgj.inspur.pageingsample.lifecycle

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import com.onexzgj.inspur.pageingsample.R

/**
 * 自定义LifecycleOwner
 */
class MyLifecycleOwnerActivity : AppCompatActivity(), LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry

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

        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.currentState = Lifecycle.State.CREATED
    }

    override fun getLifecycle(): Lifecycle {
        return super.getLifecycle()
    }

    override fun onStart() {
        super.onStart()
        lifecycleRegistry.currentState = Lifecycle.State.STARTED
    }

    override fun onDestroy() {
        super.onDestroy()
        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
    }
}

通过新建LifecycleRegistry,为LifecycleRegistry设置Lifecycle的各种状态,并通过getLifecycle方法返回该LifecycleRegistry。

总结

这一篇介绍了Lifecycle的基本用法,并通过简单案例来帮助大家消化理解,具体在项目中的使用也不难,唯一还算难点的是Lifecycle的原理,待后续更新更新Lifecycle的原理。

文章中的示例代码见Jetpack_Component

##详细介绍文章

项目目录结构为如下
image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章