美文网首页
Jetpack使用(一)之 Lifecycles 篇

Jetpack使用(一)之 Lifecycles 篇

作者: 骑着金刚的猿 | 来源:发表于2021-01-13 07:42 被阅读0次

    Kotlin入坑指南
    带你走进Android Jetpack组件库
    Jetpack使用(一)之 Lifecycles 篇
    Jetpack使用(二)之 LiveData 篇

    Lifecycles介绍

    生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。

    Lifecycles中文意思就是生命周期感知型组件,用来感知activity和fragment的生命周期的组件,主要运用观察者模式,Jetpack里很多组件都是基于Lifecycles来实现的,可以毫不夸张的说,Lifecycles是Jetpack的基础、是Jetpack组件库的重中之重。

    Lifecycles基本使用

    首先导入库,可以根据实际项目情况导入

    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    // Lifecycles only (without ViewModel or LiveData)
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
    //.......
    

    现在有一个定位监听器,需要在Activity启动的时候开启,销毁的时候关闭。正常代码如下:

    class BindingActivity : AppCompatActivity() {
    
        private lateinit var myLocationListener: MyLocationListener
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            myLocationListener = MyLocationListener(this) { location ->
                // update UI
            }
        }
        public override fun onStart() {
            super.onStart()
            myLocationListener.start()       
        }
        public override fun onStop() {
            super.onStop()
            myLocationListener.stop()
        }
    
        internal class MyLocationListener(
                private val context: Context,
                private val callback: (Location) -> Unit
        ) {
            fun start() {
                // connect to system location service
            }
            fun stop() {
                // disconnect from system location service
            }
        }  
    }
    

    乍一看也没什么问题是吧,但是如果需要管理生命周期的类一多,是不是就不好管理了。所有的类都要在Activity里面管理,还容易漏掉。
    所以解决办法就是实现解耦,让需要管理生命周期的类自己管理,这样Activity也不会遗漏和臃肿了。上代码:

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            myLocationListener = MyLocationListener(this) { location ->
                // update UI
            }
           lifecycle.addObserver(myLocationListener)
        }
    
    
    
        internal class MyLocationListener (
                private val context: Context,
                private val callback: (Location) -> Unit
        ): LifecycleObserver {
    
            @OnLifecycleEvent(Lifecycle.Event.ON_START)
            fun start() {
    
            }
    
            @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
            fun stop() {
                // disconnect if connected
            }
        }
    

    很简单吧,只要实现LifecycleObserver接口,就可以用注释的方式执行每个生命周期要执行的方法。然后在Activity里面addObserver绑定即可。

    同样的,Lifecycle也支持自定义生命周期,只要继承LifecycleOwner即可,然后通过markState方法设定自己类的生命周期,举个🌰
    class BindingActivity : AppCompatActivity(), LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }
    
    public override fun onStart() {
        super.onStart()
        lifecycleRegistry.markState(Lifecycle.State.STARTED)
    }
    

    }
    官方文档

    相关文章

      网友评论

          本文标题:Jetpack使用(一)之 Lifecycles 篇

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