运行结果如下:
Activity中不需要重写一堆生命周期回调方法,只需添加一个观察者,从 继承
变成了 组合
,代码精简效果不是一星半点。
你可能不知道这有多妙,容杰哥娓娓道来,想想:
现在有十个库,都要在生命周期里执行相关操作,按照原先的写法,得重写Activity生命周期回调,补上这是个库对应的代码调用,恭喜,这个类一下子就变得 又长又臭 了。
再加下难度?
库对应的生命周期回调都不一致,比如:A库只关注onCreate()和onDestory(),B库只关注onDestory(),C库只关注onStop等。当要去掉、增加、修改某一个库时,你可得 打醒十二分精神,毕竟一个不小心改错了,就得在这种低级BUG上耗费宝贵的时间。
那换成Lifecycle这种方案呢?它帮我们做到了:关注点分离
每个库定义一个观察者,在其中按需重写生命周期回调,Activity无脑addObserve()即可。将原本又臭又长的代码 隔离 到单独类中。改的话直接改对应类,无需担心影响到其他库,增删改库无压力,妙啊!
③ Event(事件) & State(状态)
官方文档中有这样一个图:
有些读者看了可能有点懵逼,把中间的Event大写改成小写你就懂了,比如ON_CREATE → onCreate(),就是 生命周期回调,而State就是所处的 生命周期状态,有时我们需要获取生命周期组件当前的状态,就是通过这个判定的,两者配合使用。
解读:
- Lifecycle.State.CREATED → 回调onCreate()、onStop()后;
- Lifecycle.State.STARTED → 回调onStart()、onPause()后;
- Lifecycle.State.RESUMED → 回调onResume()后;
- Lifecycle.State.DESTROYED → 回调onDestroy()后;
Tips:判断生命周期状态示例:if
(lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
④ 自定义 LifecycleOwner
appcompat 26.1.0 及更高版本的 Fragment、Activity 默认实现了 LifecycleOwner,一般是无需自定义的,当然想自己实现一个具有生命周期感知的组件,也开始可以的。先知道下三个核心类:
LifecycleOwner
→ 具有Lifecycle;
LifecycleObserver
→ 监听生命周期事件;
LifecycleRegistry
→ 转发生命周期事件,自定义LifecycleOwner才用得到;
为了应付写例子没啥大用,直接以 Lifecycle可选库 lifecycle-process
为例讲解一波~
它为整个App进程提供一个 ProcessLifecycleOwner,通过简单几行代码,即可监听App前后台切换。
依赖引入:
implementation "androidx.lifecycle:lifecycle-process:2.4.0"
测试代码如下,显示Application类:
然后是调用的Activity:
运行下看下效果:
简单易用没毛病,轻松监听应用前后台切换,接着扒下这个库是如何实现的:
可很简单,就四个文件,先是初始化类 ProcessLifecycleInitializer
:
利用ContentProvider拿到App的Context,执行初始化操作,这里用到另一个组件StartUp,后续会介绍~
跟下 LifecycleDispatcher → init()
registerActivityLifecycleCallbacks()
是Application提供的一个方法,可以监控App内所有Activity的生命周期。只重写了 onActivityCreated()
,通过 ReportFragment
来Hook宿主的生命周期。
接着往下看 ProcessLifecycleOwner → init() → attach()
看不太懂,貌似是为了保证onStart()和onResume()的顺序相对正确,跟下回调方法:
再跟下 mDelayedPauseRunnable
:
延时700ms,然后去验证是否处于后台,然后 LifecycleRegistry 转发生命周期事件,完。简单点就是封装了 Application.ActivityLifecycleCallbacks,并提供了一个全局的 LifecycleOwner。
0x3、小结
以上就是Lifecycle基本使用相关的内容,限于篇幅,把Lifecycle背后实现原理 (模板模式+观察者模式) 解读拆分到下一节,感兴趣的可以自行移步到《【Jetpack】学穿:Lifecycle → 生命周期 (原理篇)》,谢谢~
Tips:关于Lifecycle库的改动可以参见:Lifecycle,其他库亦是如此