初识Kotlin 之7__探究Jetpack__如何在一个非Activity类中去感知Activity的生命周期

本文介绍Lifecycles,  它可以让任何一个类都能轻松感知到Activity的生命周期, 同时又不需要在Activity中编写大量的逻辑处理。

实现步骤是怎样的呢?

第1步  首先新一个MyObserver类, 并让它实现LifecycleObsserver 接口, 代码如下: 

package com.rd

import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent

class MyObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun activityStart() {
        Log.d("MyObserver", "activityStart")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun activityStop() {
        Log.d("MyObserver", "activityStop")
    }

}

如果想要感知到Activity 的生命周期, 还得借助额外的注解功能才行。 例如: @OnLifecycleEvent 注解。并传入一种生命周期事件。

生命周期事件的类型一共有 7 种: 

前6种分别匹配Activity 中相应的生命周期回调, 还有一种ON_ANY 类型, 表示可以匹配Activity 的任何生命周期回调

在上述代码activityStart() 和activityStop 就分别对应在Activity 的onStart() 和 onStop() 触发的时候执行。

第2步 Activity 的生命周期变化时怎么通知MyObserver?   需要 借助LifecycleOwner ,  使用如下的语法让MyObserver得到通知:

    lifecycleOwner.lifecycle.addObserver(MyObserver())

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

需要注意: 只要Activity 继承自AppCompatActivity ,或者Fragment继承自androidx.fragment.app.Fragment , 那么它们本身就是一个LifecycleOwner的实例,这部分工作已经由AndroidX库自动帮我们完成了。

第3 步, 现在运行程序,activityStart日志就会打印出来了, 如果再按下Home 键或者Back键的话, activityStop日志也会打印出来。 

到现在,MyObserver虽然能够感知到Activity 的生命周期发生了变化, 却没有办法主动获知当前的生命周期。

要解决这个问题, 需要在MyObserver的构造函数中将Lifecycle对象传进来即可。如下所示:

class MyObserver(val lifecycle:Lifecycle) : LifecycleObserver {

    ...
}

有了Lifecycle对象之后, 我们就可以在任何地方调用lifecycle.currentState 来主动获知当前的生命周期状态。

lifecycle.currentState 返回的生命周期状态是一个枚举类型, 一共有5种状态, 它们与Activity 的生命周期回调对应的关系如图13.8 所示。

当获取的Activity的生命周期是CREATED的时候, 说明onCreate()  方法已经执行了, 但是onStart() 还没有执行, 以此类推。

具体实例请参见 JetpackDemo1_20210219 示例。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值