13.3--Lifecycles

在编写Android 应用程序的时候,可能经常会遇到需要感知Activity 生命周期的情况。比如说,某个界面中发起了一条网络请求,但是当请求得到响应的时候,界面或许已经关闭了,这个时候就不应该继续对响应的结果进行处理。因此,我们需要能够时刻感知到Activity 的生命周期,以便在适当的时候进行相应的逻辑控制。

感知Activity 的生命周期并不复杂,早在第3章的时候我们就学习过Activity 完整的生命周期流程。但问题在于,在一个Activity 中去感知它的生命周期非常简单,而如果要在一个非Activity 的类中去感知Activity 的生命周期,应该怎么办呢?

下面的代码演示了如何通过写监听器的方式来对Activity 的生命周期进行感知:

class MyObserver {
    fun activityStart(){
    }
    fun activityStop(){
    }
}
class MainActivity : AppCompatActivity() {
    lateinit var observer: MyObserver
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        observer = MyObserver()
    }

    override fun onStart() {
        super.onStart()
        observer.activityStart()
    }

    override fun onStop() {
        super.onStop()
        observer.activityStop()
    }
    
}

可以看到,这里我们为了让 MyObserver 能够感知到 Activity 的生命周期,需要专门在MainActivity 中重写相应的生命周期方法,然后再通知给 MyObserver 。这种实现方式虽然是可以正常工作的,但是不够优雅,需要在Activity 中编写太多的额外逻辑。

而Lifecycles 组件就是为了解决这个问题而出现的,它可以让任何一个类都能轻松感知到Activity 的生命周期,同时又不需要在Activity 中编写大量的逻辑处理。

那么下面我们就通过具体的例子来学习Lifecycles 组件的用法。新建一个MyObserver 类,并让它实现LifecycleObserver 接口,代码如下所示:

class MyObserver :LifecycleObserver{

}

LifecycleObserver 是一个空方法接口,只需要进行以下接口实现声明就可以了,而不去重写任何方法。

接下来我们可以在MyObserver 中定义任何方法,但是如果想要感知到Activity 的生命周期,还得借助额外的注解功能才行。比如这里还是定义activityStart() 和 activityStop() 这两个方法,代码如下所示:

class MyObserver :LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun activityStart(){
        Log.e("MyObserver", "activityStart")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun activityStop(){
        Log.e("MyObserver", "activityStop")
    }
}

可以看到,我们在方法上使用了@OnLifecycleEvent 注解,并传入了一种生命周期事件。生命周期事件的类型一共有7中:ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP 和 ON_DESTROY 分别匹配Activity 中相应的生命周期回调;另外还有一种ON_ANY 类型,表示可以匹配Activity 的任何生命周期回调。

因此,上述代码中的activityStart() 和 activityStop() 方法就应该分别在Activity 的 onStart() 和onStop() 触发的时候执行。

但是代码写到这里还是无法正常工作的,因为当Activity 的生命周期发生变化的时候并没有人去通知MyObserver,而我们又不想像刚才一样在Activity 中去一个个手动通知。

这个时候就得借助LifecycleOwner 这个好帮手了,它可以使用如下的语法结构让MyObserver 得到通知。

        lifecycleOwner.lifecycle.addObserver(MyObserver())

首先调用LifecycleOwner 的getLifecycle() 方法,得到一个Lifecycle 对象,然后调用它的addObserver() 方法来观察LifecycleOwner 的生命周期,再把MyObserver 的实例传进去就可以了。

那么接下来的问题就是,LifecycleOwner 又是什么呢?怎么样才能获取一个LifecycleOwner 的实例?

当然,我们可以自己去实现一个LifecycleOwner,但通常情况下这是完全没有必要的。因为只要你的Activity 是继承自 AppCompatActivity 的。或者你的Fragment 是继承自 androidx.fragment.app.Fragment 的,那么它们本身就是一个LificycleOwner的实例,这部分工作已经由AndroidX 库自动帮我们完成了。也就是说,在MainActivity 当中就可以这样写:

 

class MainActivity : AppCompatActivity() {

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

    }


}

没错,只要添加这样一行代码,MyObserver 就能自动感知到Activity 的生命周期了。另外,需要说明的是,尽管我们一直在Activity 举例,但其实上述的所有内容在Fragment 中也是通用的。

现在重新运行一下程序,activityStart 这条日志就会打印出来了。如果你再按下Home 键或者Back 键的话,activityStop 这条日志也会打印出来,如图所示:

这些就是Lifecycles 组件最常见的用法了。不过目前MyObserver 虽然能够感知到Activity 的生命周期发生了变化,却没有办法主动获知当前的生命周期状态。要解决这个问题也不难,只需要在MyObserver 的构造器中将Lifecycle 对象传递进来即可:如下所示:

class MyObserver(val lifecycle:Lifecycle) :LifecycleObserver{
    ...
}

有了Lifecycle 对象之后,我们就可以在任何地方调用lifecycle.currenState 来主动获知当前生命周期状态。lifecycle.currenState 返回的生命周期状态是一个枚举类型,一共有 INITALIZED、DESTROYED、CREATED、STARTED、RESUMED 这5中种状态类型,它们与Activity 的生命周期回调所对应的关系如图所示:

也就是说,当获取的生命周期状态是CREATED 的时候,说明onCreate() 方法已经执行了,但是onStart() 方法还没有执行。当获取的生命周期状态是STARTED 的时候,调用onStart() 方法已经执行了,但是onResume() 方法还没有执行,以此类推。

到这里,Lifecycles 组件的重要内容就基本讲完了,目前我们已经掌握了Jetpack 中的两个重要组件。但是这两个组件是相对比较独立的,并没有太多直接的关系。为了让各个组件可以更好地结合使用,接下来我们就开始学习Jetpack 中的另外一个非常重要的组件——LiveData 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值