Android Jetpack架构组件(二)Lifecycle使用篇

前言 上一篇文章Android Jetpack架构组件(一)了解Android Jetpack中我们简单介绍了Jetpack组件,从本篇开始逐步的介绍Jetpack组件中的Architecture部分,本篇从Lifecycle开始。

没有Lifecycle的时候如何管理声明周期?
  • 一般情況下,我们可以直接写一个接口LifecycleListener,在Activity的生命周期中对应的调用这个接口的方法,就可以实现我们的代码逻辑,代码如下所示:

    class DetailActivity : AppCompatActivity() {
    
        lateinit var listener: LifecycleListener
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_app_detail)
            listener = LifecycleListener()
        }
    
        override fun onStart() {
            super.onStart()
            Log.i("aaa", "Activity onStart ")
            listener.onStart()
        }
    
        override fun onStop() {
            super.onStop()
            Log.i("aaa", "Activity onStop ")
            listener.onStop()
        }
    }
    class LifecycleListener {
        fun onStart() {
            Log.i("aaa", "listener onStart ")
        }
    
        fun onStop() {
            Log.i("aaa", "listener onStop ")
        }
        ...
    }
    //运行结果
    aaa: Activity onStart 
    aaa: listener onStart 
    aaa: Activity onStop 
    aaa: listener onStop 
    
  • 其实这可以理解为一个观察者模式,Activity就是被观察者,它持有LifecycleListener这个观察者,当生命周期发生变化的时候,会调用观察者LifecycleListener对应的方法来执行我们需要的逻辑,但是这样写有几个问题。

  • 首先,因为在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。

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

如何使用Lifecycle
  • 有了以上的问题,这时候我们就需要使用Lifecycle组件了。
  • Lifecycle是一个声明周期感知型组件,生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中。另外这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。
  • 想要使用Lifecycle组件首先要加上依赖,因为gradle的依赖会有依赖传递效果,所以我们不用全部加上所有的依赖,当然加上也没有关系。
    dependencies {
        implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.lifecycleVersion"//记得替换为实际的版本
    }
    
  • 我们将上面的代码使用Lifecycle组件先以注解形式重新来写,代码如下:
    class DetailActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_app_detail)
            lifecycle.addObserver(LifecycleListener()) //--- 1 ----
        }
    
        override fun onStart() {
            super.onStart()
            Log.i("aaa", "Activity onStart ")
        }
    
        override fun onStop() {
            super.onStop()
            Log.i("aaa", "Activity onStop ")
        }
    }
    
    class LifecycleListener : LifecycleObserver { // //--- 2 ----
    
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun onStart() {
            Log.i("aaa", "listener onStart ")
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun onStop() {
            Log.i("aaa", "listener onStop ")
        }
    }
    //结果如下
    aaa: Activity onStart 
    aaa: listener onStart 
    aaa: listener onStop 
    aaa: Activity onStop 
    
    我们看到首先在注解2处自定义了一个类LifecycleListener实现了Lifecycle的组件LifecycleObserver,里面的方法使用了注解@OnLifecycleEvent, 然后在注解1的地方直接调用lifecycle.addObserver将我们自定义的LifecycleListener传进去就可以了,本篇只讲解Lifecycle的使用,下一篇我会讲解原理,所以这里知道怎么使用就可以了。
  • 上面使用的是注解的方式,如果我们使用的是java8, 我们也可以采用另外一种非注解的方式实现,首先要加上依赖:
    dependencies {
     implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" //记得替换为实际的版本
    }
    
  • 加上了这个依赖后,里面只有一个类就是DefaultLifecycleObserver, 源码如下:
    public interface DefaultLifecycleObserver extends FullLifecycleObserver {
    
        @Override
        default void onCreate(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onStart(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onResume(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onPause(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onStop(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onDestroy(@NonNull LifecycleOwner owner) {
        }
    }
    
  • DefaultLifecycleObserver虽然是一个接口,但是默认实现了最常见的生命周期方法,我们可以自定义一个类实现DefaultLifecycleObserver, 然后只重写我们需要的代码即可,所以整个代码如下:
    class DetailActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_app_detail)
            lifecycle.addObserver(LifecycleListener())
        }
    
        override fun onStart() {
            super.onStart()
            Log.i("aaa", "Activity onStart ")
        }
    
        override fun onStop() {
            super.onStop()
            Log.i("aaa", "Activity onStop ")
        }
    
        class LifecycleListener : DefaultLifecycleObserver {
    
            override fun onStart(owner: LifecycleOwner) {
                super.onStart(owner)
                Log.i("aaa", "listener onStart ")
            }
    
            override fun onStop(owner: LifecycleOwner) {
                super.onStop(owner)
                Log.i("aaa", "listener onStop ")
            }
        }
    }
    //结果如下
    aaa: Activity onStart 
    aaa: listener onStart 
    aaa: listener onStop 
    aaa: Activity onStop 
    
  • 真实的开发环境中,我们可以将LifecycleListener放在一个单例中,这样Activity中就不会有这个类了,Activity的代码就会变的更加简洁。

总结

本片主要讲解的是如何使用Lifecycle组件,在下一篇Lifecycle原理篇中我们会对本篇中的代码结合源码部分进行深入讲解。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值