Lifecycle原理解析,人人都能看得懂

182 篇文章 11 订阅

1

前言

之前虽然对Lifecycle的源码有一个大概的理解,但是感觉还是模棱两可,于是直接全面领略了一遍源码的风采。

今天就由浅入深直接带大家来了解一下它的原理。如果不想看长篇源码,可以直接跳「总结」。

首先来看看它的使用。

2

使用

首先我们先创建一个类实现DefaultLifecycleObserver,这样我们的观察者就定义好了。

 
class SampleLifecycle : DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        Log.e(TAG, "onCreate: ")
    }

    override fun onStart(owner: LifecycleOwner) {
        super.onStart(owner)
        Log.e(TAG, "onStart: ")
    }

    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        Log.e(TAG, "onResume: ")
    }

    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
        Log.e(TAG, "onPause: ")
    }

    override fun onStop(owner: LifecycleOwner) {
        super.onStop(owner)
        Log.e(TAG, "onStop: ")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        super.onDestroy(owner)
        Log.e(TAG, "onDestroy: ")
    }

    companion object {
        private const val TAG = "SampleLifecycle"
    }
}
 

在Activity 或者Fragment 添加监听:

lifecycle.addObserver(SampleLifecycle())
 

这样当我们UI状态进行变化的时候就会接收到状态监听了。在使用上非常简单方便

接下来,就带领大家领略一下它的实现原理。

3

原理

添加观察者

首先我们从添加观察者说起,在Activity中,为什么可以获取到Lifecycle?

public Lifecycle getLifecycle() {
      return mLifecycleRegistry;
}
 

跳转源码,可以看到在父类ComponentActivity中,实现 LifecycleOwner 接口,   getLifecycle 返回了 mLifecycleRegistry。

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        ContextAware,
        LifecycleOwner,
        ............
        {
    ............
    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    ............       
}
 

在 ComponentActivity 创建的时候,同时创建了 LifecycleRegistry ,LifecycleRegistry 是Lifecycle 子类。

看到这里就可以理解为什么可以在Activity 里 添加观察者了。

接下来我们看下,添加观察者。

LifecycleRegistry类   

@Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        enforceMainThreadIfNeeded("addObserver");
        //初始状态
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        //通过ObserverWithState将观察者和状态进行包装
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        //将包装类放到 FastSafeIterableMap<LifecycleObserver, ObserverWithState> 中 。
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
        ............
        //将状态进行对齐  
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            final Event event = Event.upFrom(statefulObserver.mState);
            if (event == null) {
                throw new IllegalStateException("no event up from " +                statefulObserver.mState);
            }
            statefulObserver.dispatchEvent(lifecycleOwner, event);
            popParentState();         
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            //同步状态 
            sync();
        }
        mAddingObserverCounter--;
    }
 

使用 ObserverWithState类 将观察者对象和状态进行包装,然后存储在 FastSafeIterableMap 中,这里先对ObserverWithState这个类有点印象, 在下文事件分发的时候,会再详细讲解。

FastSafeIterableMap  具有以下特性:

• 支持键值对存储,用链表实现,模拟成Map的接口。

• 支持在遍历的过程中删除任意元素,不会触发ConcurrentModifiedException。

• 非线程安全。

注释中提到的将状态进行对齐,是在添加观察者的时候,可能是在任何状态的时候进行添加的,lifecycle需要将这个状态进行对齐。

例如我们在onResume的回调中添加了观察者,此时我们的观察者就收到依次收到 onCreate, onStart,onResume的回调。

监听生命周期

我们的观察者是怎样收到Activity 的生命周期的监听的呢?

这里我们看下父类ComponentActivity的onCreate方法中,有一个这样的操作:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    ............
    ReportFragment.injectIfNeededIn(this);
    if (mContentLayoutId != 0) {
        setContentView(mContentLayoutId);
    }
}
 
public static void injectIfNeededIn(Activity activity) {
   ........
   android.app.FragmentManager manager = activity.getFragmentManager();
   if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
       manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
       // Hopefully, we are the first to make a transaction.
       manager.executePendingTransactions();
   }
}
 

在 ComponentActivity 创建的时候,同时创建了ReportFragment,这个Fragment的作用就是用来分发生命周期状态的。

在ReportFragment的每个生命周期的回调中,都对应的调用了 dispatch 方法 ,来进行状态分发。

最后 dispatch的方法中,又调用了 LifecycleRegistry 的handleLifecycleEvent。

public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
   enforceMainThreadIfNeeded("handleLifecycleEvent");
   moveToState(event.getTargetState());
}                                                   

我们当前的状态是通过  event.getTargetState()来获取的。

public State getTargetState() {
    switch (this) {
        case ON_CREATE:
        case ON_STOP:
            return State.CREATED;
        case ON_START:
        case ON_PAUSE:
            return State.STARTED;
        case ON_RESUME:
            return State.RESUMED;
        case ON_DESTROY:
            return State.DESTROYED;
        case ON_ANY:
            break;
    }
    throw new IllegalArgumentException(this + " has no target state");
}
 

这里是维护了一个状态机,可能有的同学不明白为什么ON_CREATE 和  ON_STOP 状态 都是属于 State.CREATED 状态,接下来用一张图来解释一下。

State 一共维护了  DESTROYED , INITIALIZED ,  CREATED ,STARTED , RESUMED 五种状态。

上图简要说明了一下 各个生命周期回调时,分别对应的状态,整个状态趋势 是分为 正在可见 和正在不可见。

通过状态机获取当前的状态之后,会将当前状态进行记录,然后会 执行  sync()   方法进行同步操作。

private void sync() {
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
    ......
    //当 mObserverMap 中存储的最新的状态(刚插入的) 与 最老的状态(最先插入的) 一致,并且当前状态等于最新的状态,停止同步。 
    while (!isSynced()) {
        mNewEventOccurred = false;
        if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
            backwardPass(lifecycleOwner);
        }
        Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
        if (!mNewEventOccurred && newest != null
                && mState.compareTo(newest.getValue().mState) > 0) {
            forwardPass(lifecycleOwner);
        }
    }
    mNewEventOccurred = false;
}
 

在这里会通过当前状态和存储的状态进行比较操作,判断当然流程 是 向正在可见发展 还是 正在向不可见发展。

例如当前执行的状态是START,与上个状态相比,如果上个状态是CREATE,相比结果就是>0 ,说明是正在可见;如果上个状态是RESUME ,相比结果<0 ,说明是正在不可见。

backwardPass  和  forwardPass 主要有两点不同:

1.在对mObserverMap 存储的状态进行遍历时,backwardPass 是以 栈的形式遍历,forwardPass是以队列的形式遍历。

2.对状态还原的时候,backwardPass 是不可见方向还原,也就是上图的粉色箭头方向,forwardPass 是以可见方向还原,也就是上图的   青绿色箭头方向。

最后是通过ObserverWithState 的 dispatchEvent 方法 进行了分发。

最后是怎样通知到我们对应的观察者对象的呢?

ObserverWithState 在上文有提到,是对观察者对象和状态进行了一个包装,在这里我们来详细看一下。

static class ObserverWithState {
    State mState;
    LifecycleEventObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = event.getTargetState();
        mState = min(mState, newState);
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}
 

我们先看包装的时候的操作,是执行了一个 Lifecycling.lifecycleEventObserver(observer) 操作。

    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);
        }
}
 

是返回一个对应类型 的实例化对象 ,我们自定义的观察者,实现的是DefaultLifecycleObserver 接口,DefaultLifecycleObserver接口又继承了FullLifecycleObserver ,所以这里会新建一个 FullLifecycleObserverAdapter 对象,并返回。

再看  ObserverWithState 的 dispatchEvent 操作,调用了 onStateChanged  方法,然后就会调用到 FullLifecycleObserverAdapter  的 onStateChanged 里面。

在这里面 就是进行接口回调,然后我们的观察者就可以接收到生命周期的回调了。

分析到这里,我们就可以将整个 添加观察者,对应生命周期时间 分发 的过程全部联系起来了。

4

总结

在这里我们总结一下:

首先自定义观察者,实现了FullLifecycleObserver 接口,Activity 的父类ComponentActivity 实现了 LifecycleOwner ,所以可以添加观察者,并且自己的onCreate 方法中,创建并添加了一个ReportFragment ,用来感应自身的生命周期的回调, 并进行对应分发。

在分发过程中,Lifecycle 通过内部维护的状态机 将生命周期事件转化为State状态,并进行存储,在 分发过程中,通过状态比较来判断 当前过程是正在可见还是正在不可见,不同过程采用不同策略。最后通过调用 LifecycleEventObserver 的 onStateChanged 方法 来进行回调。

5

写在最后

整体来说,整个框架原理并不是很难理解,主要是状态机那部分,需要多思考一下, 最好借助图像工具 具体的展示出来。

今天的分享就到这里,希望这篇文章在你学习Lifecycle的路上能够有所帮助。

 

转自:

Lifecycle原理解析,人人都能看得懂!
https://mp.weixin.qq.com/s/CHQPZu9QuAqFLY1T5E_99w

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值