用于构建生命周期感知组件的类和接口,这些组件可以根据 Activity 或 Fragment 的当前生命周期自动调整其行为,在support版本为26.1.0中默认的AppCompatActivity和fragment已经集成这个功能。
用法
(1)首先让你的类实现LifecycleObserver接口,在类方法上加上注解OnLifecycleEvent
|
|
其中的Event为以下代码
|
|
很清晰的看到各种的值对应的生命周期的哪个方法。
(2)在activity或者fragmetn中注册
|
|
源码分析
从addObserver这个方法切入,Lifecycle是一个抽象类,它的实现类是LifecycleRegistry,从下面我们可以猜测到运用了典型的观察者模式。
|
|
|
|
ObserverWithState这个类保持当前的状态和GenericLifecycleObserver,其中GenericLifecycleObserver也是个接口,实现类为ReflectiveGenericLifecycleObserver,就是把LifecycleObserver添加了onStateChanged()的方法,这样在ObserverWithState的dispatchEvent的方法中调用onStateChanged,来通知状态发生变化,从而达到要调用那个注解方法,ReflectiveGenericLifecycleObserver里面有CallbackInfo mInfo,其实就是反射获取你添加了OnLifecycleEvent的注解的方法,以便到时候调用。
activity的生命周期和LifecycleRegistry关联,其中有个SupportActivity类,
|
|
就是通过添加个空的ReportFragment来监听activity的生命周期的变化(貌似很多地方都用到了这个),通过监听ReportFragment生命周期调用dispatch(Lifecycle.Event.ON_CREATE),最后到LifecycleRegistry的handleLifecycleEvent方法。
|
|
sync同步状态,isSynced判断要不要同步,它是比较当前的状态和我们存我们存放观察者的集合最早或最新放入的观察者的状态,当前状态比之前状态消的时候就是要回滚,好比从OnPause到OnResume,则调用backwardPass回退,forwardPass则为前进,最后调用
dispatchEvent方法就是,ObserverWithState的,最后调用onStateChanged,之前CallbackInfo的mEventToHandlers根据key就是事件,vaule就是方法,通过事件获取方法最后调用方法,从value是个list可以看出你可以给多个方法注解同个生命周期。
总结
大致的流程就是通过在activity添加个空的fragment来和activity的生命周期同步,然后再调用LifecycleRegistry的handleLifecycleEvent方法到ObserverWithState的dispatchEvent方法到ReflectiveGenericLifecycleObserver的onStateChanged方法,根据注解方法获取各自监听生命周期的方法再调用,只是官方做的更加的完善方便。第一次写分析文章,大部分都是源码很少解读的,希望以后能够改进,通过这次的分析,可以学习到可以通过设置个空的fragment来监听activity的生命周末,很多高度抽象的东西,比如LifecycleObserver你只要实现,很多东西就会自动生成,让开发者集成更加的方便。