JetPack之Lifecycles使用和原理分析

2020-03-29  本文已影响0人  安仔夏天勤奋

作为一个开发人员,学习过的知识是否掌握,通过实践验证,并加以分析,让自己对知识点有更深刻的认知,如果下面内容有不当之处,请多多指教。下面进行Lifecycle主题。

正文

通过下面几点去认识Lifecycle的真面目。

什么是Lifecycle?

Lifecycle 组件是 google开发出的JetPack架构组件之一,它具有感知生命周期变化。主要是通过观察者模式去感知生命周期变化。

为什么要使用Lifecycle?

通过MVP例子去玩一下Lifecycle

实现这样一个功能:监听某个 Activity 生命周期的变化,在生命周期改变的时候打印日志。

需要去实现生命周期,那么就要实现LifecycleObserver接口,同时在每一个方法实现上增加@OnLifecycleEvent(Lifecycle.Event.XXXX)注解,OnLifecycleEvent对应了Activity的生命周期方法。

从上面的代码看是不是很简单,的确挺简单的。还可以继承BasePresenter扩展成跟自己业务对应的Presenter去监听生命周期,然后复写需要的生命周期方法即可。从上面代码也可以看出,监听感知 Activity 的生命周期,只需要在Activity中调用一句 getLifecycle().addObserver(presenter) 就可以了。Lifecycle 是怎样实现感知生命周期的呢,监听流程是怎么样的呢,下面开始源码解析了。

Lifecycle的组成与实现原理

从上面例子不难看出,我们的切入点就是getLifecycle().addObserver(presenter)。其实是通过观察者LifecycleObserver和被观察者LifecycleOwner(在底层的Activity/Fragment都实现了)进行绑定,从而实现监听生命周期变化,也是一种观察者模式啦。至于怎么观察监听的,下面会详细说明。从上述例子还是很难理解 MainActivity、LifecycleOwner、Lifecycle 和 LifecycleObserver 之间的关系,我们通过辅助类图整理他们的关系,当我们在整理绘制类图的过程中,理深刻地了解框架大概包含哪些组成部分,有哪些比较重要的成员变量和方法。


分析Lifecycle组件内的类与接口的关系

从上面的类图可以分析出:

通过类图分析我们可以知道了Activity、LifecycleRegistry、LifecycleOwner 、LifecycleObserver、Lifecycle 之间的对应关系。但是我们还不知道注册/注销监听流程和生命周期分发流程。

分析Lifecycle组件的监听流程/生命周期分发流程

通过整理类图,我们脑海里有了一个大概的类与接口对应关系和重要的变量与方法调度概念。在整理类图的过程,要记录调度次序,看下面的时序图。

Lifecycle组件的监听流程

从时序图中我们可以看出,在FragmentActivity中创建了一个LifecycleRegistry对象。FragmentActivity的父类ComponentActivity中实现了LifecycleOwner接口,这样LifecycleRegistry就与LifecycleOwner绑定了。在父类构造方法中调用了getLifecycle().addObserver(observer),那么 addObserver 就可以作为源码分析的切入口。通过一步步追踪,最终确定addObserver 实际上是调用了 LifecycleRegistry 的 addObserver (observer)方法,并将 LifecycleObserver 的对象作为参数传递进去,这样就完成了一个完整的注册监听过程。
MainActivity 中调用 getLifecycle()方法得到 LifecycleRegistry 对象,LifecycleRegistry 对象的初始化在 FragmentActivity 中完成。

public ComponentActivity() {
        Lifecycle lifecycle = getLifecycle();
        //noinspection ConstantConditions
        if (lifecycle == null) {
            throw new IllegalStateException("getLifecycle() returned null in ComponentActivity's "
                    + "constructor. Please make sure you are lazily constructing your Lifecycle "
                    + "in the first call to getLifecycle() rather than relying on field "
                    + "initialization.");
        }
        if (Build.VERSION.SDK_INT >= 19) {
            getLifecycle().addObserver(new LifecycleEventObserver() {
                @Override
                public void onStateChanged(@NonNull LifecycleOwner source,
                        @NonNull Lifecycle.Event event) {
                    if (event == Lifecycle.Event.ON_STOP) {
                        Window window = getWindow();
                        final View decor = window != null ? window.peekDecorView() : null;
                        if (decor != null) {
                            decor.cancelPendingInputEvents();
                        }
                    }
                }
            });
        }
        getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source,
                    @NonNull Lifecycle.Event event) {
                if (event == Lifecycle.Event.ON_DESTROY) {
                    if (!isChangingConfigurations()) {
                        getViewModelStore().clear();
                    }
                }
            }
        });

        if (19 <= SDK_INT && SDK_INT <= 23) {
            getLifecycle().addObserver(new ImmLeaksCleaner(this));
        }
    }

当getLifecyle().addObserver监听的时候,会先初始化状态值,然后把状态值与传入的observer绑定并保存到mObserverMap。

@Override
    public void addObserver(@NonNull LifecycleObserver observer) {
          //得到初始化状态值,把状态与传入的observer绑定并保存到mObserverMap     
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);

        if (previous != null) {
            return;
        }
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            // it is null we should be destroyed. Fallback quickly
            return;
        }

        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        //当生命周期发生改变的时候,就会遍历这个ObserverWithState集合
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            //生命周期变量了,分发事件
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            popParentState();
            // mState / subling may have been changed recalculate
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            // we do sync only on the top level.
            //同步状态
            sync();
        }
        mAddingObserverCounter--;
    }
// happens only on the top of stack (never in reentrance),
    // so it doesn't have to take in account parents
    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;
    }

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

private void forwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                mObserverMap.iteratorWithAdditions();
      //取得下一个状态,与当前状态比较
        while (ascendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                pushParentState(observer.mState);
                //如果下一个状态与当前状态不等,则分发事件
                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                popParentState();
            }
        }
    }

生命周期时分发事件

在 Activity 生命周期变化时,在每个生命周期回调函数中调用 LifecycleRegistry的 handleLifecycleEvent()方法,在 handleLifecycleEvent()方法的层层调用中,最后通过 observer.dispatchEvent(lifecycleOwner, event) 方法中onStateChanged(owner, event)将生命周期的变化传递到 LifecycleObserver 的实现类BasePresenter 中。

需要注意的是启动Activity时调用onCreat()方法的时候会注入ReportFragment,这个Fragment没有界面。这样就绑定了一个Fragment去管理生命周期了。在ReportFragment中做一些分发事件。


public class ReportFragment extends Fragment {
   //省略代码...
    public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        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();
        }
    }
  //省略代码...
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }

    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // just want to be sure that we won't leak reference to an activity
        mProcessListener = null;
    }

    private void dispatch(Lifecycle.Event event) {
        Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }
//省略代码...
}

接下来我们看看handleLifecycleEvent()方法中做了那些事情。

public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        //去拿下一个状态
        State next = getStateAfter(event);
        //移动到下一个状态
        moveToState(next);
    }
static State getStateAfter(Event event) {
        switch (event) {
            case ON_CREATE:
            case ON_STOP:
                return CREATED;
            case ON_START:
            case ON_PAUSE:
                return STARTED;
            case ON_RESUME:
                return RESUMED;
            case ON_DESTROY:
                return DESTROYED;
            case ON_ANY:
                break;
        }
        throw new IllegalArgumentException("Unexpected event value " + event);
    }

拿取状态时,是按照事件取对应的状态,如果事件是ON_CREATE、ON_STOP,状态为CREATED,如果事件是ON_START、ON_PAUSE,状态为STARTED,如果事件是ON_RESUME,状态为RESUMED,如果事件是ON_DESTROY,状态为DESTROYED。根据获取的状态移动到下一个状态。

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

因为一开始Activity是有一个init初始状态值,随着Activity的生命周期变化时,状态都随之改变。addObserver初始时会同步状态,和Activity的生命周期变化时同步状态。下面看一个状态时序图可以更加好理解。


当生命周期发生变化时,会调用mLifecycleObserver.onStateChanged(owner, event)进行分发事件。

static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
             //LifecycleObserver有多个实现类
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            mState = initialState;
        }

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

然而mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer)的实现类有很多个,通过追踪,最终都会走到ReflectiveGenericLifecycleObserver类,在构建ReflectiveGenericLifecycleObserver类时,将ObserverWithState传入的observer(这个observer其实就是自己写的BasePresenter)通过ClassesInfoCache类的getInfo(observer)方法生产出CallbackInfo信息。CallbackInfo信息是通过反射拿到外面定义的BasePresenter类中标了OnLifecycleEvent注解的通通解析出来put进来。

class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
    private final Object mWrapped;
    private final CallbackInfo mInfo;

    ReflectiveGenericLifecycleObserver(Object wrapped) {
        mWrapped = wrapped;
        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Event event) {
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
}
private CallbackInfo createInfo(Class klass, @Nullable Method[] declaredMethods) {
        Class superclass = klass.getSuperclass();
        Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
        if (superclass != null) {
            CallbackInfo superInfo = getInfo(superclass);
            if (superInfo != null) {
                handlerToEvent.putAll(superInfo.mHandlerToEvent);
            }
        }

        Class[] interfaces = klass.getInterfaces();
        for (Class intrfc : interfaces) {
            for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
                    intrfc).mHandlerToEvent.entrySet()) {
                verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
            }
        }

        Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
        boolean hasLifecycleMethods = false;
        for (Method method : methods) {
            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
            if (annotation == null) {
                continue;
            }
            hasLifecycleMethods = true;
            Class<?>[] params = method.getParameterTypes();
            int callType = CALL_TYPE_NO_ARG;
            if (params.length > 0) {
                callType = CALL_TYPE_PROVIDER;
                if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
                    throw new IllegalArgumentException(
                            "invalid parameter type. Must be one and instanceof LifecycleOwner");
                }
            }
            Lifecycle.Event event = annotation.value();

            if (params.length > 1) {
                callType = CALL_TYPE_PROVIDER_WITH_EVENT;
                if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
                    throw new IllegalArgumentException(
                            "invalid parameter type. second arg must be an event");
                }
                if (event != Lifecycle.Event.ON_ANY) {
                    throw new IllegalArgumentException(
                            "Second arg is supported only for ON_ANY value");
                }
            }
            if (params.length > 2) {
                throw new IllegalArgumentException("cannot have more than 2 params");
            }
            MethodReference methodReference = new MethodReference(callType, method);
            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
        }
        CallbackInfo info = new CallbackInfo(handlerToEvent);
        mCallbackMap.put(klass, info);
        mHasLifecycleMethods.put(klass, hasLifecycleMethods);
        return info;
    }

总结

上一篇下一篇

猜你喜欢

热点阅读