Jatpack之Lifecycle

目录

简单介绍

基本使用

简单介绍

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

        这种需求是广泛存在的,同时也衍生出了一系列的解决方案,比如通过在Activity中嵌入一个隐藏的Fragment来进行感知,或者通过手写监听器的方式来进行感知,等等。但是这种方法不够优雅。

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

基本使用

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

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")
    }

    class MainActivity : AppCompatActivity() {
        lateinit var observer: MyObserver
        override fun onCreate(savedInstanceState: Bundle?) {
            observer = MyObserver()
        }        
        override fun onStart() {
            super.onStart()observer.activityStart()
        }
        override fun onStop() {
            super.onStop()observer.activityStop()
        }

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

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

        但是到这里还是无法正常工作的,因为当Activity的生命周期发生变化的时候并没有人去通知MyOberserver,这个时候就得借助LifecycleOwner了.

LifecycleOwner在MainActivity中的声明,需添加:

lifecycleOwner.lifecycle.addObserver(myObserver);

        不过当前MyObserver虽然能够感知到Activity的生命周期发生了变化,却没有办法主动获知当前的生命周期状态.此时需要在MyObserver的构造函数中将Lifecycle传进来即可.所以,此时的MyObersver中的内容

        首先调用LifecycleOwner的getLifecycle()方法,得到一个Lifecycle对象,然后调用它的add0bserver()方法来观察LifecycleOwner的生命周期,再把MyObserver的实例传进去就可以了。
        那么接下来的问题就是,LifecycleOwner又是什么呢?怎样才能获取一个LifecycleOwner的实例?

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

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main) 
...
    lifecycle.add0bserver(MyObserver())
}
...

        没错,只要添加这样一行代码,MyObserver就能自动感知到Activity的生命周期了。另外,需要说明的是,尽管我们一直在以Activity举例,但其实上述的所有内容在Fragment中也是通用的。
现在重新运行一下程序,activityStart这条日志就会打印出来了。如果你再按下Home键或者 Back键的话,activityStop这条日志也会打印出来
        这些就是Lifecycles组件最常见的用法了。不过目前MyObserver虽然能够感知到Activity的生命周期发生了变化,却没有办法主动获知当前的生命周期状态。要解决这个问题也不难,只需要在MyObserver的构造函数中将Lifecycle对象传进来即可,如下所示:

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

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


        

        有了Lifecycle对象之后,我们就可以在任何地方调用lifecycle.currentState来主动获知当前的生命周期状态.lifecycle.currentState返回的生命周期是一个枚举类型,一共有INITALIZED,DESTROYED,CREATED,STARTED,RESUMED这五种状态也就是说,当获取的生命周期状态是CREATED的时候,说明onCreate()方法已经执行了,但是onStart()方法还没有执行。当获取的生命周期状态是STARTED的时候,说明onStart()方法已经执行了,但是onResume()方法还没有执行,以此类推。
        到这里,Lifecycles组件的重要内容就基本讲完了,目前我们已经掌握了Jetpack中的两个重要组件。但是这两个组件是相对比较独立的,并没有太多直接的关系。为了让各个组件可以更好地结合使用,接下来我们就开始学习Jetpack中另外一个非常重要的组件--LiveData。

以上内容均来自郭霖《Android第一行代码》第三版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值