Jetpack —— Lifecycle源码解析

从本篇博客开始,慢慢的开始在项目中学习使用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;
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值