美文网首页
Android Jetpack组件学习(一):LifeCycle

Android Jetpack组件学习(一):LifeCycle

作者: 静水红阳 | 来源:发表于2021-11-09 15:52 被阅读0次

    前言

    Lifecycle是Google推出的用于处理Activity和Fragment的生命周期相关问题的组件,是一种观察者模式的结构。

    使用lifeCycle能够在生命周期的拥有者和观察者之间建立一种监听关系,当拥有者的生命周期发生变化时观察者能够及时监听到并作出对应的处理,同时观察者能够非常方便的判断当前拥有者的生命周期是什么。

    从上面的描述上看,显然LifeCycle的使用场景是和Activity和Fragment的生命周期相关的业务逻辑。

    举例来说,在MVP结构中,Presenter需要感知到Activity或者Fragment的生命周期,从而能够及时的处理和生命周期相关的业务逻辑,在这种需求下我们可以使用LifeCycle来观察生命周期,从而及时作出处理。

    一、使用

    LifeCycle主要分为两个部分:LifeCycleOwner和LifeCycleObserver.

    1. LifeCycleOwner

    LifeCycleOwner,生命周期的拥有者,一般情况下是指Activity和Fragment,自定义限制非常大,本次不做讨论。

    AppCompatActivity和V4中的Fragment都已默认实现了LifeCycleOwner接口,因此我们可以在开发中直接使用。

    2. LifeCycleObserver

    LifeCycleObserver,生命周期的观察者需要实现此接口。
    此接口内没有任何方法,对生命周期观察是通过注解onLifecycleEvent来实现的,示例代码如下:

    class SingleMainLifeCycle : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onActivityOnCreate() {
    
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun onActivityOnResume() {
    
        }
    }
    

    这样我们就创建了一个LifeCycleObserver实例,然后我们可以把这个观察者和拥有者建立联系,就能够进行监听了,示例代码如下:

    class SingleMainActivity : BaseActivity<ActivitySingleMainBinding>() {
    
        override var viewBinding: ActivitySingleMainBinding = ActivitySingleMainBinding.inflate(layoutInflater)
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            //绑定lifecycle观察者
            lifecycle.addObserver(SingleMainLifeCycle())
        }
    }
    

    上述代码中由于Activity中已经实现了LifeCycleOwner接口,所以可以直接使用getLifeCycle()方法获取lifecycle进行绑定。绑定之后,在SingleMainLifeCycle中的方法就会在对应的生命周期内执行。

    3. 判断生命周期执行达到的状态

    Lifecycle能够判断当前的生命周期是否达到了某个状态,即是否大于等于当前的状态,代码如下:

            if(lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)){
    
            }
    

    二、源码概要解析

    下面对源码做一个概要说明,以Fragment为例,查看Fragment的getLifeCycle()方法可以看到如下:

        @Override
        @NonNull
        public Lifecycle getLifecycle() {
            return mLifecycleRegistry;
        }
    

    是实现的LifeCycleOwner的接口,mLifecycleRegistry分别performStart(),performResume等perform方法中调用

    mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.**);

    查看下此方法,如下:

        public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
            State next = getStateAfter(event);
            moveToState(next);
        }
    
        private void moveToState(State next) {
            if (mState == next) {
                return;
            }
            mState = next;
            if (mHandlingEvent || mAddingObserverCounter != 0) {
                mNewEventOccurred = true;
                // we will figure out what to do on upper level.
                return;
            }
            mHandlingEvent = true;
            sync();
            mHandlingEvent = false;
        }
    

    是通过sync()方法执行的同步到其他观察者,

        private void sync() {
            LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
            if (lifecycleOwner == null) {
                throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                        + "garbage collected. It is too late to change lifecycle state.");
            }
            while (!isSynced()) {
                mNewEventOccurred = false;
                // no need to check eldest for nullability, because isSynced does it for us.
                if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                    backwardPass(lifecycleOwner);
                }
                Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
                if (!mNewEventOccurred && newest != null
                        && mState.compareTo(newest.getValue().mState) > 0) {
                    forwardPass(lifecycleOwner);
                }
            }
            mNewEventOccurred = false;
        }
    

    此方法中有两个方法backwardPass()forwardPass()是执行同步过程,以backwardPass()为例,会从mObserverMap进行遍历,执行dispatchEvent(),将状态同步至所有的Observer.

        private void backwardPass(LifecycleOwner lifecycleOwner) {
            Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                    mObserverMap.descendingIterator();
            while (descendingIterator.hasNext() && !mNewEventOccurred) {
                Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
                ObserverWithState observer = entry.getValue();
                while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                        && mObserverMap.contains(entry.getKey()))) {
                    Event event = downEvent(observer.mState);
                    pushParentState(getStateAfter(event));
                    observer.dispatchEvent(lifecycleOwner, event);
                    popParentState();
                }
            }
        }
    

    mObserverMap是用来存储LifecycleObserver,在绑定方法调用时会将监听者添加到此数据结构中。

    总结

    LifeCycle是采用了观察者模式,对LifeCycleOwner的生命周期进行监听,观察者能够及时的做出对应的动作。
    LifeCycle作为jetpack中相对独立的组件,有许多自身的优势;同时是其他多个组件的基础内容,像LiveData 与 ViewModel 的 lifecycle 也依赖于 Lifecycle 框架。

    相关文章

      网友评论

          本文标题:Android Jetpack组件学习(一):LifeCycle

          本文链接:https://www.haomeiwen.com/subject/meamzltx.html