整体架构
LifecycleOwner
Lifecycle持有者
在ComponentActivity中new出来,所以Activity和Fragment自带
实现了LifecycleOwner接口的类 可以获得生命周期信息类Lifecycle
Fragment和Activity都已经实现了该接口
Lifecycle Registry
生命周期注册器
可以提交生命周期事件 持有LifecycleOwner的弱引用,避免内存泄漏
public LifecycleRegistry(@NonNull LifecycleOwner provider) {
mLifecycleOwner = new WeakReference<>(provider);
mState = INITIALIZED;
}
Lifecycle
持有应用组件生命周期状态(如Activity/Fragment/LifecycleService)信息的抽象类
可以添加和移除监听器,获取当前状态 方法调用都只能在主线程调用
通过为Activity、Fragment添加空Fragment监听生命周期,即ReportFragment
这样就在ReportFragment生命周期方法中可分发对应事件
dispatch()分发事件时会调用handleLifecycleEvent
getStateAfter会返回对应的状态
moveToState 负责同步状态,执行前STATE未同步
这里涉及到个变量 mOberverMap
这是key为LifecyclerObserver,值为ObserverWithState的map
ObserverWithState则是包含state和LifecyclerEventOberser的包装类
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0)
表示当前状态是否旧状态是否更小,由状态图可推导 生命周期执行了什么方法
State大小:DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED
如新状态时Resume,旧状态是start,说明执行了Pause方法,因为生命周期方法是顺序执行
backwardPass方法中调用了downEvent,来计算是执行了哪个生命周期方法,返回对应事件,然后进行分发dispatch,dispatch再调用Observer.onStateChanged通知LifecycleObserver
Event、State
Event、STATE
Event:
ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY STATE:
ON_CREATE、ON_STOP 对应 CREATED
ON_START、ON_PAUSE 对应 STARTED
ON_RESUME 对应 RESUME
ON_DESTROY 对应 DESTROYED
STATE对应生命周期状态
State大小:DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED
流程梳理
Lifecycle提供了个空Fragment作为被观察者,监听生命周期,在对应生命周期函数分发对应事件,收到事件后调用LifecycleRegistry的handleLifecycleEvent来得出新状态并更新状态,并同步观察者状态,同步方法会比较观察者状态和被观察者状态大小,得出执行了何种生命周期方法,并将其分发给对应观察者
简而言之就是,被观察者监听状态,更新自我状态后再通知观察者
使用
在Activity/Fragment中,因为已经实现了接口,自带LifecyclerOwner和LifecyclerRegister,可直接通过getLifeCycle获取LifeCycle,添加监视器等
在其余场合,可以通过实现接口LifecyclerOwner自行注册LifecyclerRegister