美文网首页
jetpack系列——lifecycle源码分析

jetpack系列——lifecycle源码分析

作者: Peakmain | 来源:发表于2021-03-16 20:28 被阅读0次

简单使用

class MyLifecycleObserver : LifecycleObserver {
    private val TAG = LifecycleObserver::class.simpleName

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun create() {
        Log.e(TAG, "LifecycleObserver->onCreate")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start(){
        Log.e(TAG, "LifecycleObserver->onStart")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume(){
        Log.e(TAG, "LifecycleObserver->onResume")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop(){
        Log.e(TAG, "LifecycleObserver->onStop")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun destory(){
        Log.e(TAG, "LifecycleObserver->onDestory")
    }
}

MainActivity中使用

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val observer = MyLifecycleObserver()
        lifecycle.addObserver(observer)
    }
}

源码分析

  • getLifecycle
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

实际返回的是LifecycleRegistry

  • addObserver源码分析
    public void addObserver(@NonNull LifecycleObserver observer) {
      //判断当前状态是否等于DESTROYED,此时是INITIALIZED
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        //observer=自定义MyLifecycleObserver, initialState封装成新对象ObserverWithState
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        //1 实际是MainActivity
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            return;
        }
       //第一次是false
        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        //代码省略
        if (!isReentrance) {
            //第一次实际进入到这里
            sync();
        }
        mAddingObserverCounter--;
    }

sync源码分析

    private void sync() {
        //返回的是MainActivity
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
       
        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 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();
            }
        }
    }
  • observer是ObserverWithState对象,对owner和状态event进行封装
  • upEvent(observer.mState)的源码
    private static Event upEvent(State state) {
        switch (state) {
            case INITIALIZED:
            case DESTROYED:
                return ON_CREATE;
            case CREATED:
                return ON_START;
            case STARTED:
                return ON_RESUME;
            case RESUMED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }
image.png

因为此时的mState是INITIALIZED所以upEvent(observer.mState)实际返回的是ON_CREATE,lifecleOwner就是MainActivity

  • observer.dispatchEvent源码分析
    static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;

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

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

实际最终会走到观察者的onStateChange

我们会发现mLifecycleObserver实际是个接口,所以我们需要知道mLifecycleObserver是什么

  • Lifecycling.lifecycleEventObserver(observer)源码分析
   static LifecycleEventObserver lifecycleEventObserver(Object object) {
          //实际是MyLifecycleObserver的class
        final Class<?> klass = object.getClass();
        int type = getObserverConstructorType(klass);
        //type实际是1
        if (type == GENERATED_CALLBACK) {
        //GENERATED_CALLBACK=2
            return new CompositeGeneratedAdaptersObserver(adapters);
        }
        //所以会走到这里,这里留意,待会回到这里分析代码
        return new ReflectiveGenericLifecycleObserver(object);
    }

getObserverConstructorType(klass)源码分析

 private static int getObserverConstructorType(Class<?> klass) {
   //缓存
        Integer callbackCache = sCallbackCache.get(klass);
        if (callbackCache != null) {
            return callbackCache;
        }
        //实际走的是这里
        int type = resolveObserverCallbackType(klass);
        sCallbackCache.put(klass, type);
        return type;
    }
 private static int resolveObserverCallbackType(Class<?> klass) {
          //代码省略
        boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);
        if (hasLifecycleMethods) {
        //这里的值是1
            return REFLECTIVE_CALLBACK;
        }
        //代码省略
        return REFLECTIVE_CALLBACK;
    }
 boolean hasLifecycleMethods(Class<?> klass) {
        Boolean hasLifecycleMethods = mHasLifecycleMethods.get(klass);
        if (hasLifecycleMethods != null) {
            return hasLifecycleMethods;
        }
        //解析MyLifecycleObserver所有的方法
        Method[] methods = getDeclaredMethods(klass);
        for (Method method : methods) {
        //判断是否有注解
            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
            if (annotation != null) {
                createInfo(klass, methods);
                return true;
            }
        }
        mHasLifecycleMethods.put(klass, false);
        return false;
    }

createInfo源码分析

  private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) {
       //MyLifecycleObserver的所有方法
        Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
        boolean hasLifecycleMethods = false;
        for (Method method : methods) {
        //找到带有OnLifecycleEvent注解的方法
            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();

            //代码省略,参数判断
            //callType=CALL_TYPE_NO_ARG=0
            MethodReference methodReference = new MethodReference(callType, method);
            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
        }
        //解析的数据全部封装到CallbackInfo
        CallbackInfo info = new CallbackInfo(handlerToEvent);
        mCallbackMap.put(klass, info);
        mHasLifecycleMethods.put(klass, hasLifecycleMethods);
        return info;
    }

实际就是解析注解和方法并封装到CallbackInfo中

返回到lifecycleEventObserver的源码解析

   static LifecycleEventObserver lifecycleEventObserver(Object object) {
          //实际是自定义MyLifecycleObserver类
        final Class<?> klass = object.getClass();
        int type = getObserverConstructorType(klass);
        //type实际是1
        //所以会走到这里
        return new ReflectiveGenericLifecycleObserver(object);
    }
    

上面第一点的时候我们知道实际最终会走到onStateChanged方法

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(@NonNull LifecycleOwner source, @NonNull Event event) {
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
}
 void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
            invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
            invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
                    target);
 }
 private static void invokeMethodsForEvent(List<MethodReference> handlers,
                LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
                //解析刚才封装到CallbackInfo中的handlerToEvent的Map集合
            if (handlers != null) {
                for (int i = handlers.size() - 1; i >= 0; i--) {
                //event是onCreate方法
                    handlers.get(i).invokeCallback(source, event, mWrapped);
                }
            }
        }
    }
void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
            //noinspection TryWithIdenticalCatches
            try {
              //mCallType是参数的个数
                switch (mCallType) {
                    case CALL_TYPE_NO_ARG:
                        mMethod.invoke(target);
                        break;
                    case CALL_TYPE_PROVIDER:
                        mMethod.invoke(target, source);
                        break;
                    case CALL_TYPE_PROVIDER_WITH_EVENT:
                        mMethod.invoke(target, source, event);
                        break;
                }
            } catch (InvocationTargetException e) {
                throw new RuntimeException("Failed to call observer method", e.getCause());
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }

上面我们分析到mCallType实际是0,所以执行到的是 mMethod.invoke(target);

实际最终是通过反射执行的继承于LifecycleObserver的类的所有带有@OnLifecycleEvent的方法

最后附上lifecycle源码有序图


image.png

相关文章

网友评论

      本文标题:jetpack系列——lifecycle源码分析

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