LifeCycle的由来
解耦是为了解决传统开发某块臃肿,以达到代码量平衡、优雅、易扩展。由于Android大部分开发需要感知组件的生命周期,在对应生命周期中做对应的工作,故原始的做法就是在Activity、Fragment、Service等生命周期回调中增加相应的处理代码,这样导致Activity等组件十分臃肿、难以做扩展。LifeCycle的出现就是在外面实现对这些组件生命周期的感知能力,减少组件中的代码量。
LifeCycle的使用
在Activity、Fragment中的使用
简单新建一个生命周期感知监听器,如下图,该类需要实现LifecycleObserver接口
首先在Activity中使用该接口,使用非常简单,只要两行代码就够了
下面就是见证奇迹的时候,这样解耦就完成了
在Fragment里面实现也非常简单,只用在Fragment里面做Activity同样的工作
在Service中的使用
service中使用非常简单,纯了添加LifeCycleExampleListener监听器外,Service需要继承LifecycleService
Application中的使用
application中使用非常简单,不过LifeCycleExampleListener是添加到全局的ProcessLifecycleOwner里面,这样就可以很方便的感知应用进程在前台还是后台了
LifeCycle原理
现以Application为例,其实里面所有的原理都是一样,ProcessLifecycleOwner.get().getLifecycle().addObserver最终实现类为LifecycleRegistry,addObserver方法如下
new ObserverWithState(observer, initialState)->Lifecycling.lifecycleEventObserver(observer),如下图所示,其实就是根据不同Observer的实现方式做适配,当为图1注解时,会动态生成对应的回调方法
后面最重要的是生命周期状态改变事件的分发statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState)),这样就实现了初始状态的监听,那Application生命周期改变是如何通知这些观察者的呢?主要的实现在ProcessLifecycleOwner类,其中生命周期感应在attachapp.registerActivityLifecycleCallbacks(接口中感应,当有activity启动时执行activityStarted->mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)->moveToState(next)->sync()
sync()代码如下,经过backwardPass或者forwardPass将生命周期事件传递给观测者,两个方法里面都是通过observer.dispatchEvent(l)实现
这样,LifeCycle就实现了动态感知生命周期,且不会造成内存泄漏,因为LifecycleRegistry都是弱引用LifecycleRegistry(包括Activity、Fragment、Service等)