目录
简单介绍
在编写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第一行代码》第三版