LifeCycle详解

LifeCycle的由来

解耦是为了解决传统开发某块臃肿,以达到代码量平衡、优雅、易扩展。由于Android大部分开发需要感知组件的生命周期,在对应生命周期中做对应的工作,故原始的做法就是在Activity、Fragment、Service等生命周期回调中增加相应的处理代码,这样导致Activity等组件十分臃肿、难以做扩展。LifeCycle的出现就是在外面实现对这些组件生命周期的感知能力,减少组件中的代码量。

LifeCycle的使用

在Activity、Fragment中的使用

简单新建一个生命周期感知监听器,如下图,该类需要实现LifecycleObserver接口

图1

首先在Activity中使用该接口,使用非常简单,只要两行代码就够了

图2

下面就是见证奇迹的时候,这样解耦就完成了

图3

在Fragment里面实现也非常简单,只用在Fragment里面做Activity同样的工作

图4

在Service中的使用

service中使用非常简单,纯了添加LifeCycleExampleListener监听器外,Service需要继承LifecycleService

图5

Application中的使用

application中使用非常简单,不过LifeCycleExampleListener是添加到全局的ProcessLifecycleOwner里面,这样就可以很方便的感知应用进程在前台还是后台了

图6

LifeCycle原理

现以Application为例,其实里面所有的原理都是一样,ProcessLifecycleOwner.get().getLifecycle().addObserver最终实现类为LifecycleRegistry,addObserver方法如下

图7

new ObserverWithState(observer, initialState)->Lifecycling.lifecycleEventObserver(observer),如下图所示,其实就是根据不同Observer的实现方式做适配,当为图1注解时,会动态生成对应的回调方法

图8

后面最重要的是生命周期状态改变事件的分发statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState)),这样就实现了初始状态的监听,那Application生命周期改变是如何通知这些观察者的呢?主要的实现在ProcessLifecycleOwner类,其中生命周期感应在attachapp.registerActivityLifecycleCallbacks(接口中感应,当有activity启动时执行activityStarted->mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)->moveToState(next)->sync()

图9

sync()代码如下,经过backwardPass或者forwardPass将生命周期事件传递给观测者,两个方法里面都是通过observer.dispatchEvent(l)实现

图10

这样,LifeCycle就实现了动态感知生命周期,且不会造成内存泄漏,因为LifecycleRegistry都是弱引用LifecycleRegistry(包括Activity、Fragment、Service等)

图11

版权声明:
作者:Mr李
链接:https://www.techfm.club/p/54231.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>