Lifecycle
即生命周期,一些业务场景如三方地图、播放器等,依赖于activity的生命周期,会有类似下面的用法:
1 | class MyAct extends Activity{ |
这样使得act代码耦合臃肿,业务代码无法移植,通常需要用接口回调的形式抽离业务代码进行解耦,不过,从SDK 26.1.0
开始,Activity和Fragment已经默认实现了LifecycleOwner
接口,成为可观察对象,开发者只需为其添加观察者即可监听生命周期,LiveData
与ViewModel
也是依赖于Lifecycle
实现的。
本文源码基于SDK 29
使用
引入依赖:
1 | def lifecycle_version = "2.2.0" |
定义一个观察者,他可以是任何关心act生命周期的业务类,
1 | class MyObserver implements LifecycleObserver { |
如果引入了java8,可以不用注解的形式,直接实现DefaultLifecycleObserver
接口,这样做的好处是可以避免反射,
1 | //app/build.gradle |
1 | //DefaultLifecycleObserver接口里有默认实现,所以需要java8支持 |
在act中添加观察者:
1 | class LifecycleActivity extends AppCompatActivity { |
然后就可以直接运行看日志了。
原理
注解方式多了些反射逻辑,由于主要分析生命周期,所以以DefaultLifecycleObserver
的实现方式来分析即可。
getLifecycle得到LifecycleRegistry
对象,以addObserver作为入口,
1 | //LifecycleRegistry.java |
然后debug一下,看看调用链,
这里出现了一个ReportFragment
,可以猜测下是不是添加了一个空fragment来管理生命周期,这个先放一放,然后看看LifecycleRegistry
,
1 | //LifecycleRegistry.java |
然后看到内部类LifecycleRegistry.ObserverWithState
,
1 | //LifecycleRegistry.ObserverWithState |
来到FullLifecycleObserverAdapter
,
1 | //FullLifecycleObserverAdapter.java |
最后,前边提到的ReportFragment
,也进去看看,
1 | class ReportFragment extends Fragment { |
可以看到,即便都会添加一个空fragment,但从Android 10
开始,使用Application.ActivityLifecycleCallbacks
来分发事件,之前的版本才会使用ReportFragment
来分发,看注释大概是为了处理一些兼容问题?
优缺点
- 优点:
- 解耦,避免act臃肿
- 模块化和可移植
- 缺点:
- 观察者操作比较耗时的话,会阻塞住其他观察者甚至生命周期。