Android:Lifecycle

整体架构

Android:Lifecycle_第1张图片

LifecycleOwner

Lifecycle持有者
在ComponentActivity中new出来,所以Activity和Fragment自带
实现了LifecycleOwner接口的类 可以获得生命周期信息类Lifecycle
Fragment和Activity都已经实现了该接口
Android:Lifecycle_第2张图片

Lifecycle Registry

生命周期注册器
可以提交生命周期事件 持有LifecycleOwner的弱引用,避免内存泄漏

public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }

Lifecycle

持有应用组件生命周期状态(如Activity/Fragment/LifecycleService)信息的抽象类
可以添加和移除监听器,获取当前状态 方法调用都只能在主线程调用

通过为Activity、Fragment添加空Fragment监听生命周期,即ReportFragment
这样就在ReportFragment生命周期方法中可分发对应事件
Android:Lifecycle_第3张图片
Android:Lifecycle_第4张图片
Android:Lifecycle_第5张图片
dispatch()分发事件时会调用handleLifecycleEvent
在这里插入图片描述
getStateAfter会返回对应的状态
moveToState 负责同步状态,执行前STATE未同步
Android:Lifecycle_第6张图片
这里涉及到个变量 mOberverMap
这是key为LifecyclerObserver,值为ObserverWithState的map

ObserverWithState则是包含state和LifecyclerEventOberser的包装类
Android:Lifecycle_第7张图片
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
Android:Lifecycle_第8张图片

流程梳理

Lifecycle提供了个空Fragment作为被观察者,监听生命周期,在对应生命周期函数分发对应事件,收到事件后调用LifecycleRegistry的handleLifecycleEvent来得出新状态并更新状态,并同步观察者状态,同步方法会比较观察者状态和被观察者状态大小,得出执行了何种生命周期方法,并将其分发给对应观察者

简而言之就是,被观察者监听状态,更新自我状态后再通知观察者

使用

在Activity/Fragment中,因为已经实现了接口,自带LifecyclerOwner和LifecyclerRegister,可直接通过getLifeCycle获取LifeCycle,添加监视器等

在其余场合,可以通过实现接口LifecyclerOwner自行注册LifecyclerRegister

你可能感兴趣的:(android)