1.介绍:可以让逻辑层感知到view层的生命周期变化,并进行相应的逻辑处理
2.基本使用
2.1.1 被动的通知View层生命周期变化 让逻辑层拥有LifecycleOwner对象,因为view层实现了LifecycleOwner接口,所以可以在view层初始化的时候,直接赋值,有了LifecycleOwner对象,就可以通过getLifecycle方法获取到Lifecycle对象了
2.1.2 有了LifecycleOwner对象,需要在逻辑层获取Lifecycle并添加对应的观察者(addObserver),这里的观察者要实现LifecycleObserver接口,下文的LifecycleEventObserver是其子类,当view生命周期发生变化时,会调用onStateChanged方法,处理相应的业务逻辑,使用起来超级方便
2.2.1 主动的获取状态,通过注解的方式进行
首先在逻辑层对想要观察的数据进行监听
其次,在View层添加数据的监听者,传入LifecycleOwner,为了获取到Lifecycle
得到Lifecycle后,给lifecycle添加observer,通过addObserver方法,被观察的对象需要实现LifecycleObserver接口,该接口没有具体的方法
实现了LifecycleObserver接口的类,可以通过注解的方式,主动获取到view层生命周期的变化,当view生命周期变化时,会调用注解下面的方法
3.解读源码
3.1 首先在ComponentActivity中实现了LifecycleOwner接口,这样所有的activity、fragment都实现了LifecycleOwner接口
而该接口只有一个功能,那就是获取Lifecycle对象,因为毕竟是通过Lifecycle来让逻辑层感知View层的生命周期的
在ComponentActivity中实现了LifecycleOwner接口的getLifecycle方法,获取到的是一个LifecycleRegistry对象
下面我们就看看LifecycleRegistry干了什么,首先是继承Lifecycle,并且在构造方法中,初始状态为INITIALIZED状态
Events又是怎么来的呢
3.2 在FragmentActivity中复写了Lifecycle getLifecycle() 方法
在FragemntActivity中的各个生命周期中会通过hadleLifecycleEvent方法处理相应的事件,这样就将view层的生命周期变化通过事件传到了Lifecycle的实例对象mFragmentLifecycleRegistry中
这里的Event只是Lifecycle中的一个枚举类,列举各种生命周期
通过getStateAfter方法将相应的事件转换为State,然后通过moveToState方法保存到mState中
基于此,Lifecycle便能感受到view的生命周期的变化
那么,Lifecyle又如何通知observer观察者(这个观察者一般在逻辑层添加)view的生命周期的变化呢?
被动通知方式:首先在逻辑层通过Lifecycle的addObserver方法添加实现了LifecycleEventObserver接口的mViewLifeImpl
通过addObserver方法,将观察者对象添加到LifecycleRegistry的mObsercerMap集合中去
这样根据前文,view生命周期变化时,会处理相应的事件
在moveToState中会调用sync同步方法
这里主要看下backwardPass和forwardPass方法,逻辑是类似的,主要一个是正序,一个是逆序
这里主要看下forwardPass方法,在while循环中,会在mObserverMap集合中循环拿到所有添加进来的观察者observer,然后调用dispatchEvent处理事件
这里掉调到了dispatchEvent方法,mLifecycleObserver便是添加的一个个观察者,经过ObserverWithState类进行包装了一下,最终调到了mLifecycleObserver.onStateChanged方法
即最终调到了我们自定义,实现了LifecycleEventObserver接口的onStateChanged方法,完成了Lifecycle对添加的观察者进行view生命变化的通知(被动通知)
主动通知方式:通过@OnLifecycleEvent注解
前边两种添加观察者的方式,一个是添加了LifecycleEventObserver, 一个是添加了LifecycleObserver,其中LifecycleEventObserver是LifecycleObserver子类
这种添加实现了LifecycleObserver接口的方式,同样的使用Lifecycle的addObserver方法
但在LifecycleEventObserver lifecycleEventObserver方法中,会返回不同的对象,如果添加进来的观察者是实现了LifecycleEventObserver对象,会返回(LifecycleEventObserver) object,如果是实现了LifecycleObserver接口的对象,会返回new ReflectiveGenericLifecycleObserver(object)对象
@NonNull
static LifecycleEventObserver lifecycleEventObserver(Object object) {
boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
if (isLifecycleEventObserver && isFullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
(LifecycleEventObserver) object);
}
if (isFullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
}
if (isLifecycleEventObserver) {
return (LifecycleEventObserver) object;
}
final Class<?> klass = object.getClass();
int type = getObserverConstructorType(klass);
if (type == GENERATED_CALLBACK) {
List<Constructor<? extends GeneratedAdapter>> constructors =
sClassToAdapters.get(klass);
if (constructors.size() == 1) {
GeneratedAdapter generatedAdapter = createGeneratedAdapter(
constructors.get(0), object);
return new SingleGeneratedAdapterObserver(generatedAdapter);
}
GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
for (int i = 0; i < constructors.size(); i++) {
adapters[i] = createGeneratedAdapter(constructors.get(i), object);
}
return new CompositeGeneratedAdaptersObserver(adapters);
}
return new ReflectiveGenericLifecycleObserver(object);
获取type
而ReflectiveGenericLifecycleObserver是 LifecycleEventObserver的子类,并复写了LifecycleEventObserver的onStateChanged方法
添加完成之后和前面一样
因为返回是ReflectiveGenericLifecycleObserver,所以这里的onStateChanged方法是ReflectiveGenericLifecycleObserver实现的
这样就实现了基于注解的方式,让view的生命周期通过lifecycle传递给观察者
PS:可以在方法上加上值参,获取当前的owner和event