美文网首页Android开发经验谈Android技术知识Android开发
Android Jetpack架构组件-Lifecycle介绍及

Android Jetpack架构组件-Lifecycle介绍及

作者: OneXzgj | 来源:发表于2020-03-23 18:07 被阅读0次

    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就会观察到,或者说是感知到。

    • 日志输出:


      截屏2020-03-2318.07.06.png

    简单说明一下就是:

    先实现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

    相关文章

      网友评论

        本文标题:Android Jetpack架构组件-Lifecycle介绍及

        本文链接:https://www.haomeiwen.com/subject/wtxgyhtx.html