从本篇博客开始,慢慢的开始在项目中学习使用Jetpack,这东西出来时间挺长了,但是一直种种原因,没学习(说白了就是:懒)。 由于项目中使用的是MVVM,前段时间想重新学习下MVVM,然后就搜到了这个Jetpack,从JetPack的LiveData ——> Lifecycle,这个学习过程,渐渐的发现,Google推出这套开发组件是有道理的。 本篇博客写一下学习到的Lifecycle知识点。
Lifecycle使用
创建一个类实现LifecycleObserver接口
public class BaseLifeCycleObserver implements LifecycleObserver {
private final String TAG = BaseLifeCycleObserver.class.getName();
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate(LifecycleOwner owner) {
LogUtil.e(TAG, "onCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart(LifecycleOwner owner) {
LogUtil.e(TAG, "start");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume(LifecycleOwner owner) {
LogUtil.e(TAG, "onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onAny(LifecycleOwner owner, Lifecycle.Event event) {
LogUtil.e(TAG, "AnY: " + event.name());
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause(LifecycleOwner owner) {
LogUtil.e(TAG, "onPause");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop(LifecycleOwner owner) {
LogUtil.e(TAG, "onStop");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner owner) {
LogUtil.e(TAG, "onDestroy");
}
}
代码中有7中枚举类型的注解, 分别对应被观察者的生命周期,LifecycleObserver的实现类相当于观察者,现在我们看下被观察者。
被观察者需要实现LifecycleOwner接口,而我们的Activity和Fragment都实现了该接口,所以可以直接在Activity或者Fragment中添加观察者。
以Activity为例, 在onCreate方法中添加下面代码:
getLifecycle().addObserver(new BaseLifeCycleObserver());
可看到控制台打印相应日志。
Lifecycle的用途
其实说到用途,官网说的那个例子就很好,屏幕显示位置信息为例,在onStart和onStop方法中,分别需要开启和停止定位,此时定位的位置代码就和Activity的生命周期关联了起来,为了结偶,并且减少Activity 的工作量,引入Lifecycle就很有必要了。
总结起来,当我们需要处理一个业务,该业务的子业务需要根据Activity或者Fragment 的生命周期不同变化时,就引入Lifecycle。例如:自定义埋点需求。
当然了,脱离UI层, 自定义LifecycleOwner,根据自己需求发送相应事件。这个具体自定义,看完源码应该有进一步的了解。
Lifecycle源码分析
根据Lifecycle的使用,我们从getLifecycle().addObserver(观察者)说起,开发者创建的Activity继承自:ComponentActivity,该类实现了LifecycleOwner接口, 而LifecycleOwner接口就一个方法:
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
因此ComponentActivity实现了接口,必然实现了该方法:
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
getLifecycle方法返回的就是这个LifecycleRegistry对象。而getLifecycle().addObserver(观察者)也就是调用的就是LifecycleRegistry的addObserver方法:
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
//初始化Observer的状态标记:INITIALIZED;
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
// 将Observer和标记封装成一个对象:ObserverWithState
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
//将该对象放入Map集合中
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
// 如果该Observer之前已经在Map中了,那么就直接返回
if (previous != null) {
return;
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
// it is null we should be destroyed. Fallback quickly
return;
}
//如果没放入过,也就是初次放入,那么就需要“倒灌”:给该Observer 发送之前没接收到的事件,
//比如:在onResume的时候添加了Observer,那么之前丢失的事件onCreate,onStart,事件都会依此分发,
//也可以理解为:EventBus的粘性事件。
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;