杨说:Jetpack Lifecycle 详解

464 阅读6分钟

目录

一、Lifecycle使用
二、LifecycleObserver注册
三、OnLifecycleEvent注解解析
四、生命周期监听与回调
五、总结

一、Lifecycle使用

1.1 Lifecycle对生命周期的监听

使用LifecycleObserver监听生命周期需要被监听对象实现LifecycleOwner,Activity实现了这个接口,直接getLifecycle.addObserver()将观察者和被观察者关联。这样在Activity创建调用生命周期时就可以通过LifecycleObserver感知到Activity的生命周期

class LifecycleTestActivity : AppCompatActivity(){

    ···
    private val mLifecycleMvp = LifeCycleMvp()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lifecycle_test)
        lifecycle.addObserver(mLifecycleMvp)
    }
}

class LifeCycleMvp :LifecycleObserver{

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(){
        Log.i("yyy","oncreate")
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy(){
        Log.i("yyy","onDestroy")
    }
}

二、LifecycleObserver注册

lifecycle.addObserver(mLifecycleMvp) 添加对生命周期的监听,这个lifecycle是一个LifecycleRegistry类型

ComponentActivity.java

private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

LifecycleRegistry在创建时将当前的Activity作为参数传入,LifecycleRegistry使用弱引用缓存

LifecycleRegistry.java

 public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }

添加观察者到观察列表中

LifecycleRegistry.java

public void addObserver(@NonNull LifecycleObserver observer) {
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        //创建观察状态类用于回调
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
		//如果已经存在了直接返回
        if (previous != null) {
            return;
        }
        //当前的Activity已经被回收
        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++;
        //如果当前状态大于监听状态,通知观察者
        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--;
    }

三、OnLifecycleEvent注解解析

3.1 调用解析OnLifecycleEvent

在lifecycle.addObserver(mLifecycleMvp)的时候,会创建一个ObserverWithState的类用于解析OnLifecycleEvent和实现生命周期的回调

ObserverWithState.java

static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
            //在初始化的时候使用Lifecycling.解析注解lifecycleEventObserver
            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;
        }
    }

Lifecycling.lifecycleEventObserver(observer);用于解析OnLifecycleEvent的注解

Lifecycling.java

static LifecycleEventObserver lifecycleEventObserver(Object object) {
        //如果是LifecycleEventObserver或者FullLifecycleObserver类型直接返回FullLifecycleObserverAdapter,
        //我们也可以实现LifecycleEventObserver用于监听整个生命周期
        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);
        }
		//只是LifecycleEventObserver也是直接返回
        if (isLifecycleEventObserver) {
            return (LifecycleEventObserver) object;
        }

        final Class<?> klass = object.getClass();
        //开始解析
        int type = getObserverConstructorType(klass);
        //如果是GeneratedAdapter 返回对应的Adapter
        if (type == GENERATED_CALLBACK) {
            List<Constructor<? extends GeneratedAdapter>> constructors =
                    sClassToAdapters.get(klass);
            if (constructors.size() == 1) {
                GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                        constructors.get(0), object);
                return new SingleGeneratedAdapterObserver(generatedAdapter);
            }
            GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
            for (int i = 0; i < constructors.size(); i++) {
                adapters[i] = createGeneratedAdapter(constructors.get(i), object);
            }
            return new CompositeGeneratedAdaptersObserver(adapters);
        }
        //如果是反射类型 开始反射
        return new ReflectiveGenericLifecycleObserver(object);
    }

3.2 解析OnLifecycleEvent注解

int type = getObserverConstructorType(klass); kclass是入进来的ifecycleObserver

Lifecycling.java

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;
    }
Lifecycling.java

private static int resolveObserverCallbackType(Class<?> klass) {
        // anonymous class bug:35073837
        if (klass.getCanonicalName() == null) {
            return REFLECTIVE_CALLBACK;
        }
		//反射创建生成Adapter减少反射性能消耗
        Constructor<? extends GeneratedAdapter> constructor = generatedConstructor(klass);
        if (constructor != null) {
            sClassToAdapters.put(klass, Collections
                    .<Constructor<? extends GeneratedAdapter>>singletonList(constructor));
            return GENERATED_CALLBACK;
        }
		//包含传入的类OnLifecycleEvent注解方法
        boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);
        if (hasLifecycleMethods) {
            return REFLECTIVE_CALLBACK;
        }

        Class<?> superclass = klass.getSuperclass();
        List<Constructor<? extends GeneratedAdapter>> adapterConstructors = null;
        if (isLifecycleParent(superclass)) {
            if (getObserverConstructorType(superclass) == REFLECTIVE_CALLBACK) {
                return REFLECTIVE_CALLBACK;
            }
            adapterConstructors = new ArrayList<>(sClassToAdapters.get(superclass));
        }

        for (Class<?> intrface : klass.getInterfaces()) {
            if (!isLifecycleParent(intrface)) {
                continue;
            }
            if (getObserverConstructorType(intrface) == REFLECTIVE_CALLBACK) {
                return REFLECTIVE_CALLBACK;
            }
            if (adapterConstructors == null) {
                adapterConstructors = new ArrayList<>();
            }
            adapterConstructors.addAll(sClassToAdapters.get(intrface));
        }
        if (adapterConstructors != null) {
            sClassToAdapters.put(klass, adapterConstructors);
            return GENERATED_CALLBACK;
        }

        return REFLECTIVE_CALLBACK;
    }

3.2.1 反射创建GeneratedAdapter

generatedConstructor(klass);会反射创建报名+ "_LifecycleAdapter"的类

Lifecycling.java

 @Nullable
    private static Constructor<? extends GeneratedAdapter> generatedConstructor(Class<?> klass) {
        try {
            //获取包名
            Package aPackage = klass.getPackage();
            String name = klass.getCanonicalName();
            final String fullPackage = aPackage != null ? aPackage.getName() : "";
            final String adapterName = getAdapterName(fullPackage.isEmpty() ? name :
                    name.substring(fullPackage.length() + 1));
		   //通过类名获取class
            @SuppressWarnings("unchecked") final Class<? extends GeneratedAdapter> aClass =
                    (Class<? extends GeneratedAdapter>) Class.forName(
                            fullPackage.isEmpty() ? adapterName : fullPackage + "." + adapterName);
            Constructor<? extends GeneratedAdapter> constructor =
                    aClass.getDeclaredConstructor(klass);
            if (!constructor.isAccessible()) {
                constructor.setAccessible(true);
            }
            //返回反射处理的构造方法
            return constructor;
        } catch (ClassNotFoundException e) {
            return null;
        } catch (NoSuchMethodException e) {
            // this should not happen
            throw new RuntimeException(e);
        }
    }

3.2.2 检测传入的类OnLifecycleEvent注解方法

ClassesInfoCache.sInstance.hasLifecycleMethods(klass);检测是否含有注解,并创建和缓存callbackinfo

ClassesInfoCache.java

boolean hasLifecycleMethods(Class<?> klass) {
        //如果有缓存直接返回缓存
        Boolean hasLifecycleMethods = mHasLifecycleMethods.get(klass);
        if (hasLifecycleMethods != null) {
            return hasLifecycleMethods;
        }
		//获取传入类的方法
        Method[] methods = getDeclaredMethods(klass);
        //编列方法
        for (Method method : methods) {
            //获取OnLifecycleEvent注解
            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
            if (annotation != null) {
                ····
                //创建当生命周期被调用后需要调用的信息
                createInfo(klass, methods);
                return true;
            }
        }
        mHasLifecycleMethods.put(klass, false);
        return false;
    }

3.2.2 解析并缓存当生命周期被调用后需要调用的信息

ClassesInfoCache.java

private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) {
	    //获取父类
        Class<?> superclass = klass.getSuperclass();
        //创建方法引用和Lifecycle.Event
        Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
        if (superclass != null) {
            //父类不为空获取callbackinfo信息
            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()) {
                 //父接口不为空获取callbackinfo信息
                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.length > 2) {
                ····
            }
            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;
    }

3.2.3 将反射信息包装成ReflectiveGenericLifecycleObserver

获取观察者类型后创建了ReflectiveGenericLifecycleObserver,他封装了调用信息,和生命周期触发时的调用方法

Lifecycling.java

static LifecycleEventObserver lifecycleEventObserver(Object object) {
        ···
        int type = getObserverConstructorType(klass);
        ···
        return new ReflectiveGenericLifecycleObserver(object);
    }
ReflectiveGenericLifecycleObserver.java

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

四、生命周期监听与回调

4.1 生命周期的监听

被观察的Activity在创建的时候调用了ReportFragment.injectIfNeededIn(this)实现了一个隐藏的Fragment用于监听Activity的生命周期

ComponentActivity.java

protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSavedStateRegistryController.performRestore(savedInstanceState);
        ReportFragment.injectIfNeededIn(this);
        if (mContentLayoutId != 0) {
            setContentView(mContentLayoutId);
        }
    }
ReportFragment.java

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
        //获取fragmentmanager,添加自己到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();
        }
    }

4.2 生命周期的回调

当触发Activity生命周期时,会调用ReportFragment的生命周期

ReportFragment.java

public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        //调用回调
        dispatch(Lifecycle.Event.ON_CREATE);
    }
ReportFragment.java

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

        if (activity instanceof LifecycleOwner) {
            //如果是LifecycleOwner类型,获取getLifecycle,强转LifecycleRegistry并调用handleLifecycleEvent方法
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }
LifecycleRegistry.java

 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;
    }
LifecycleRegistry.java

private void sync() {
        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();
            }
        }
    }

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

触发ObserverWithState的dispatchEvent()方法,调用mLifecycleObserver.onStateChanged(owner, event);如果是反射调用的是ReflectiveGenericLifecycleObserver的onStateChanged

ObserverWithState.java

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 = getStateAfter(event);
            mState = min(mState, newState);
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }
ReflectiveGenericLifecycleObserver.java

@Override
public void onStateChanged(LifecycleOwner source, Event event) {
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
ClassesInfoCache.CallbackInfo.java

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);
        }
ClassesInfoCache.java

private static void invokeMethodsForEvent(List<MethodReference> handlers,
                LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
            if (handlers != null) {
                for (int i = handlers.size() - 1; i >= 0; i--) {
                    handlers.get(i).invokeCallback(source, event, mWrapped);
                }
            }
        }
ClassesInfoCache.MethodReference.java

void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
            //noinspection TryWithIdenticalCatches
            try {
            	//触发最终的调用
                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);
            }
        }

五、总结

1、监听Activity生命周期可以实现LifecycleObserver,使用@OnLifecycleEvent注解修饰需要被特定生命周期要调用的方法,也可是实现LifecycleEventObserver监听Activity生命周期
2、观察者被包装成ObserverWithState添加到map中
3、实现的是LifecycleEventObserver直接返回,是LifecycleObserver就解析注解
4、如果有GeneratedAdapter就直接返回,如果没有解析注解
5、注册ReportFragment监听Activity生命周期
6、调用ReportFragment生命周期触发反射缓存的method方法