前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lifecycle详细分析

Lifecycle详细分析

原创
作者头像
杨充
修改2020-03-09 11:29:40
2790
修改2020-03-09 11:29:40
举报
文章被收录于专栏:lib库lib库

Lifecycle源码分析

目录介绍
  • 01.Lifecycle的作用是什么
  • 02.Lifecycle的简单使用
  • 03.Lifecycle的使用场景
  • 04.如何实现生命周期感知
  • 05.注解方法如何被调用
  • 06.addObserver调用分析
  • 07.知识点梳理和总结一下

00.使用AAC实现bus事件总线

  • 利用LiveData实现事件总线,替代EventBus。充分利用了生命周期感知功能,可以在activities, fragments, 或者 services生命周期是活跃状态时更新这些组件。支持发送普通事件,也可以发送粘性事件;还可以发送延迟消息,以及轮训延迟消息等等。
  • https://github.com/yangchong211/YCLiveDataBus

01.Lifecycle的作用是什么

  • Lifecycle 是一个专门用来处理生命周期的库,它能够帮助我们将 Activity、Fragment 的生命周期处理与业务逻辑处理进行完全解耦,让我们能够更加专注于业务;通过解耦让 Activity、Fragment 的代码更加可读可维护。

02.Lifecycle的简单使用

  • 直接看一下下面的案例,用法十分简单,代码如下
    • 可以通过 getLifecycle() 方法拿到 Lifecycle, 并添加 Observer 来实现对 Activity 生命周期的监听。public class FourActivity extends AppCompatActivity {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    protected void onCreate(Bundle savedInstanceState) {
代码语言:txt
复制
        super.onCreate(savedInstanceState);
代码语言:txt
复制
        setContentView(R.layout.activity_main);
代码语言:txt
复制
        BusLogUtils.d("------AppCompatActivity onCreate() called");
代码语言:txt
复制
        testLifecycle();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    protected void onResume() {
代码语言:txt
复制
        super.onResume();
代码语言:txt
复制
        BusLogUtils.d("------AppCompatActivity onResume() called");
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    protected void onDestroy() {
代码语言:txt
复制
        super.onDestroy();
代码语言:txt
复制
        BusLogUtils.d("------AppCompatActivity onDestroy() called");
代码语言:txt
复制
    }
代码语言:txt
复制
    private void testLifecycle() {
代码语言:txt
复制
        getLifecycle().addObserver(new LifecycleObserver() {
代码语言:txt
复制
            @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
代码语言:txt
复制
            void onCreate(){
代码语言:txt
复制
                BusLogUtils.d("------LifecycleObserver onCreate() called");
代码语言:txt
复制
            }
代码语言:txt
复制
            @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
代码语言:txt
复制
            void onResume(){
代码语言:txt
复制
                BusLogUtils.d("------LifecycleObserver onResume() called");
代码语言:txt
复制
            }
代码语言:txt
复制
            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
代码语言:txt
复制
            void onDestroy(){
代码语言:txt
复制
                BusLogUtils.d("------LifecycleObserver onDestroy() called");
代码语言:txt
复制
            }
代码语言:txt
复制
        });
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 然后打印日志记录如下所示
    • 可以发现Lifecycle是可以监听activity的生命周期的。
    • 在activity创建的时候,activity中生命周期onCreate方法优先LifecycleObserver中onCreate方法先执行;关闭的时候相反!//打开页面 2020-03-06 09:44:09.522 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------AppCompatActivity onCreate() called 2020-03-06 09:44:09.545 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------LifecycleObserver onCreate() called 2020-03-06 09:44:09.551 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------AppCompatActivity onResume() called 2020-03-06 09:44:09.552 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------LifecycleObserver onResume() called
代码语言:txt
复制
//关闭页面
代码语言:txt
复制
2020-03-06 09:44:14.265 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------LifecycleObserver onStop() called
代码语言:txt
复制
2020-03-06 09:44:14.265 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------AppCompatActivity onStop() called
代码语言:txt
复制
2020-03-06 09:44:14.266 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------LifecycleObserver onDestroy() called
代码语言:txt
复制
2020-03-06 09:44:14.266 11647-11647/com.ycbjie.yclivedatabus D/BusLogUtils: ------AppCompatActivity onDestroy() called
代码语言:txt
复制
```

03.Lifecycle的使用场景

  • Lifecycle 的应用场景非常广泛,我们可以利用 Lifecycle 的机制来帮助我们将一切跟生命周期有关的业务逻辑全都剥离出去,进行完全解耦。
    • 比如视频的暂停与播放,
    • Handler 的消息移除,
    • 网络请求的取消操作,
    • Presenter 的 attach&detach View
    • 暂停和恢复动画绘制
    • 并且可以以一个更加优雅的方式实现,还我们一个更加干净可读的 Activity & Fragment。
  • 关于网络请求的取消操作
  • 停止和开启视频缓冲
    • 使用支持生命周期的组件尽快开始视频缓冲,但是将播放推迟到应用程序完全启动。 还可以使用可识别生命周期的组件在应用程序销毁时终止缓冲。
  • 启动和停止网络连接
    • 使用可感知生命周期的组件可以在应用程序处于前台状态时实时更新(流式传输)网络数据,并在应用程序进入后台时自动暂停。
  • 暂停和恢复动画绘制
    • 当应用程序在后台运行时,使用生命周期感知组件处理暂停动画绘制,并在应用程序在前台运行后恢复绘制。

04.如何实现生命周期感知

  • 看到上面的简单案例,可以发现使用了注解@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)标注的方法,既可以执行生命周期的监听。
  • 那么追踪到Lifecycle.Event类,看看还有哪里使用到了该注解,截图如下所示,这里我们就先看一下ReportFragment类,看上去应该跟Fragment有关系!
    • image
      image
4.1 生命周期事件与状态
  • 上面案例中使用到了注解,那么它究竟有那些状态呢?
    • Lifecycle是一个抽象类,里面主要有两个功能,一个是Event生命周期,一个是State状态。
    • Lifecycle.Event表示生命周期的状态,与 Activity 生命周期类似。
    • Lifecycle.State表示当前组件的生命周期状态,public abstract class Lifecycle { @MainThread public abstract void addObserver(@NonNull LifecycleObserver observer); @MainThread public abstract void removeObserver(@NonNull LifecycleObserver observer); @MainThread @NonNull public abstract State getCurrentState();
代码语言:txt
复制
    @SuppressWarnings("WeakerAccess")
代码语言:txt
复制
    public enum Event {
代码语言:txt
复制
        ON_CREATE,
代码语言:txt
复制
        ON_START,
代码语言:txt
复制
        ON_RESUME,
代码语言:txt
复制
        ON_PAUSE,
代码语言:txt
复制
        ON_STOP,
代码语言:txt
复制
        ON_DESTROY,
代码语言:txt
复制
        ON_ANY
代码语言:txt
复制
    }
代码语言:txt
复制
    @SuppressWarnings("WeakerAccess")
代码语言:txt
复制
    public enum State {
代码语言:txt
复制
        DESTROYED,
代码语言:txt
复制
        INITIALIZED,
代码语言:txt
复制
        CREATED,
代码语言:txt
复制
        STARTED,
代码语言:txt
复制
        RESUMED;
代码语言:txt
复制
        public boolean isAtLeast(@NonNull State state) {
代码语言:txt
复制
            return compareTo(state) >= 0;
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • Event 与 State 的关系(摘自网络)
    • image
      image
4.2 ReportFragment类分析
  • 源码如下所示,这里只是摘取了部分和生命周期有关的源代码。
    • 重写了生命周期回调的方法,可以看到生命周期方法中调用了dispatch(Lifecycle.Event.XXX),是这个 ReportFragment 在发挥作用。
    • Lifecycle 利用了 Fragment 来实现监听生命周期,并在最终利用 dispatch 的方法来分发生命周期事件。
    • 在Fragment生命周期发生变化时调用dispatch方法来分发生命周期,在里面调用了LifecycleRegistry的handleLifecycleEvent方法。public class ReportFragment extends Fragment {
代码语言:txt
复制
    //这个方法很关键,搜索一下那些地方用到了这个方法
代码语言:txt
复制
    public static void injectIfNeededIn(Activity activity) {
代码语言:txt
复制
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
代码语言:txt
复制
        // FragmentActivity from support lib, so we use framework fragments for activities
代码语言:txt
复制
        android.app.FragmentManager manager = activity.getFragmentManager();
代码语言:txt
复制
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
代码语言:txt
复制
            //把Fragment加入到Activity中
代码语言:txt
复制
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
代码语言:txt
复制
            // Hopefully, we are the first to make a transaction.
代码语言:txt
复制
            manager.executePendingTransactions();
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onActivityCreated(Bundle savedInstanceState) {
代码语言:txt
复制
        super.onActivityCreated(savedInstanceState);
代码语言:txt
复制
        dispatchCreate(mProcessListener);
代码语言:txt
复制
        //分发状态
代码语言:txt
复制
        dispatch(Lifecycle.Event.ON_CREATE);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onStart() {
代码语言:txt
复制
        super.onStart();
代码语言:txt
复制
        dispatchStart(mProcessListener);
代码语言:txt
复制
        //分发状态
代码语言:txt
复制
        dispatch(Lifecycle.Event.ON_START);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onResume() {
代码语言:txt
复制
        super.onResume();
代码语言:txt
复制
        dispatchResume(mProcessListener);
代码语言:txt
复制
        //分发状态
代码语言:txt
复制
        dispatch(Lifecycle.Event.ON_RESUME);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onPause() {
代码语言:txt
复制
        super.onPause();
代码语言:txt
复制
        //分发状态
代码语言:txt
复制
        dispatch(Lifecycle.Event.ON_PAUSE);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onStop() {
代码语言:txt
复制
        //分发状态
代码语言:txt
复制
        super.onStop();
代码语言:txt
复制
        dispatch(Lifecycle.Event.ON_STOP);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onDestroy() {
代码语言:txt
复制
        super.onDestroy();
代码语言:txt
复制
        //分发状态
代码语言:txt
复制
        dispatch(Lifecycle.Event.ON_DESTROY);
代码语言:txt
复制
        // just want to be sure that we won't leak reference to an activity
代码语言:txt
复制
        mProcessListener = null;
代码语言:txt
复制
    }
代码语言:txt
复制
    //分发生命周期事件
代码语言:txt
复制
    private void dispatch(Lifecycle.Event event) {
代码语言:txt
复制
        // 获取宿主activity
代码语言:txt
复制
        Activity activity = getActivity();
代码语言:txt
复制
        if (activity instanceof LifecycleRegistryOwner) {
代码语言:txt
复制
            //后面在分析handleLifecycleEvent方法源码
代码语言:txt
复制
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
代码语言:txt
复制
            return;
代码语言:txt
复制
        }
代码语言:txt
复制
        if (activity instanceof LifecycleOwner) {
代码语言:txt
复制
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
代码语言:txt
复制
            if (lifecycle instanceof LifecycleRegistry) {
代码语言:txt
复制
                ////后面在分析handleLifecycleEvent方法源码
代码语言:txt
复制
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
   //...
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 然后再来看一下哪里用到了这个ReportFragment类,具体追踪到LifecycleDispatcher中的DispatcherActivityCallback内部类中的onActivityCreated方法,源码如下所示class LifecycleDispatcher {
代码语言:txt
复制
    static void init(Context context) {
代码语言:txt
复制
        if (sInitialized.getAndSet(true)) {
代码语言:txt
复制
            return;
代码语言:txt
复制
        }
代码语言:txt
复制
        ((Application) context.getApplicationContext())
代码语言:txt
复制
                .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
代码语言:txt
复制
    }
代码语言:txt
复制
    @SuppressWarnings("WeakerAccess")
代码语言:txt
复制
    @VisibleForTesting
代码语言:txt
复制
    static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
代码语言:txt
复制
        private final FragmentCallback mFragmentCallback;
代码语言:txt
复制
        DispatcherActivityCallback() {
代码语言:txt
复制
            mFragmentCallback = new FragmentCallback();
代码语言:txt
复制
        }
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
代码语言:txt
复制
            if (activity instanceof FragmentActivity) {
代码语言:txt
复制
                ((FragmentActivity) activity).getSupportFragmentManager()
代码语言:txt
复制
                        .registerFragmentLifecycleCallbacks(mFragmentCallback, true);
代码语言:txt
复制
            }
代码语言:txt
复制
            ReportFragment.injectIfNeededIn(activity);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 接着看一下handleLifecycleEvent(event)源码代码,可以发现根据Event状态来获取State状态,然后分发状态。后续还会分析到……public void handleLifecycleEvent(@NonNull Lifecycle.Event event) { State next = getStateAfter(event); moveToState(next); }
4.3 ComponentActivity类分析
  • fragment需要依赖宿主activity。通过搜索ReportFragment.injectIfNeededIn调用地方,发现 ComponentActivity 调用了该方法。(API 28 以下的版本是 SupportActivity )
    • 内部创建了一个 LifecycleRegistry 成员对象,并且该ComponentActivity类实现了 LifecycleOwner 。
    • 在 onCreate 方法里 调用了 ReportFragment.injectIfNeededIn(this); 注入了 ReportFragment。通过getLifecycle可以获取mLifecycleRegistry对象!
    • Lifecycle是一个抽象类,LifecycleRegistry是它的实现子类,主要是管理Observer,@RestrictTo(LIBRARY_GROUP) public class ComponentActivity extends Activity implements LifecycleOwner {
代码语言:txt
复制
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
代码语言:txt
复制
    @Override
代码语言:txt
复制
    @SuppressWarnings("RestrictedApi")
代码语言:txt
复制
    protected void onCreate(@Nullable Bundle savedInstanceState) {
代码语言:txt
复制
        super.onCreate(savedInstanceState);
代码语言:txt
复制
        ReportFragment.injectIfNeededIn(this);
代码语言:txt
复制
    }
代码语言:txt
复制
    @CallSuper
代码语言:txt
复制
    @Override
代码语言:txt
复制
    protected void onSaveInstanceState(Bundle outState) {
代码语言:txt
复制
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
代码语言:txt
复制
        super.onSaveInstanceState(outState);
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Lifecycle getLifecycle() {
代码语言:txt
复制
        return mLifecycleRegistry;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class LifecycleRegistry extends Lifecycle {}
代码语言:txt
复制
public abstract class Lifecycle {}
代码语言:txt
复制
```

05.注解方法如何被调用

  • OnLifecycleEvent 注解:
    • 看到有 RetentionPolicy.RUNTIME 修饰,表示运行时注解,在运行时通过反射去识别的注解。
    • 运行时注解一般和反射机制配合使用,相比编译时注解性能比较低,但灵活性好,实现起来比较简单。@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface OnLifecycleEvent { Lifecycle.Event value(); }
  • 之前在了解完生命周期监听的原理的同时,我们也看到了生命周期事件的接收者 LifecycleRegistry ,是它的 handleLifecycleEvent() 接收了事件,我们继续追踪。public void handleLifecycleEvent(Lifecycle.Event event) { mState = getStateAfter(event); if (mHandlingEvent || mAddingObserverCounter != 0) { mNewEventOccurred = true; // we will figure out what to do on upper level. return; } mHandlingEvent = true; sync(); mHandlingEvent = false; }
  • 其实从方法注释就能看出来了,就是它处理了状态并通知了 observer 。看下 getStateAfter() 方法:
    • getStateAfter() 这个方法根据当前 Event 获取对应的 State ,细看其实就是 【2.3.3】中那个图的代码实现。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); }
  • 接下去看 sync() 方法:private void sync() { 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(); } Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest(); if (!mNewEventOccurred && newest != null && mState.compareTo(newest.getValue().mState) > 0) { forwardPass(); } } mNewEventOccurred = false; }
  • sync 方法里对比了当前 mState 以及上一个 State ,看是应该前移还是后退,这个对应了生命周期的前进跟后退,打个比方就是从 onResume -> onPause (forwardPass),onPause -> onResume (backwardPass),拿 backwardPass() 举例吧。(forwardPass方法处理类似)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()))) { //调用 downEvent 获取更前面的 Event Event event = downEvent(observer.mState); pushParentState(getStateAfter(event)); //分发 Event observer.dispatchEvent(lifecycleOwner, event); popParentState(); } } }
代码语言:txt
复制
private static Event downEvent(State state) {
代码语言:txt
复制
  switch (state) {
代码语言:txt
复制
      case INITIALIZED:
代码语言:txt
复制
          throw new IllegalArgumentException();
代码语言:txt
复制
      case CREATED:
代码语言:txt
复制
          return ON_DESTROY;
代码语言:txt
复制
      case STARTED:
代码语言:txt
复制
          return ON_STOP;
代码语言:txt
复制
      case RESUMED:
代码语言:txt
复制
          return ON_PAUSE;
代码语言:txt
复制
      case DESTROYED:
代码语言:txt
复制
          throw new IllegalArgumentException();
代码语言:txt
复制
  }
代码语言:txt
复制
  throw new IllegalArgumentException("Unexpected state value " + state);
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 通过源码可以看到, backwardPass() 方法调用 downEvent 获取往回退的目标 Event。可能比较抽象,举个例子,在 onResume 的状态,我们按了 home,这个时候就是 RESUMED 的状态变到 STARTED 的状态,对应的要发送的 Event 是 ON_PAUSE,这个就是 backwardPass() 的逻辑了。如果前面的代码都是引子的话,最终看到了一丝分发的痕迹了—— observer.dispatchEvent(lifecycleOwner, event)。static class ObserverWithState { State mState; GenericLifecycleObserver mLifecycleObserver;
代码语言:txt
复制
    ObserverWithState(LifecycleObserver observer, State initialState) {
代码语言:txt
复制
        mLifecycleObserver = Lifecycling.getCallback(observer);
代码语言:txt
复制
        mState = initialState;
代码语言:txt
复制
    }
代码语言:txt
复制
    void dispatchEvent(LifecycleOwner owner, Event event) {
代码语言:txt
复制
        State newState = getStateAfter(event);
代码语言:txt
复制
        mState = min(mState, newState);
代码语言:txt
复制
        //这里
代码语言:txt
复制
        mLifecycleObserver.onStateChanged(owner, event);
代码语言:txt
复制
        mState = newState;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 可以看到最后调用了 GenericLifecycleObserver.onStateChanged() 方法,再跟。
    • 这个类的代码比较多,不过也不复杂。可以看到最后代码走到了invokeCallback() ,通过反射调用了方法。
    • 而这个方法是 createInfo() 方法中反射遍历我们注册的 Observer 的方法找到的被 OnLifecycleEvent 注解修饰的方法,并且按 Event 类型存储到了 info.mEventToHandlers 里。
    • 在 Observer 用注解修饰的方法,会被通过反射的方式获取,并保存下来,然后在生命周期发生改变的时候再找到对应 Event 的方法,通过反射来调用方法。class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver { //mWrapped 是 我们的 Observer private final Object mWrapped; //反射 mWrapped 获取被注解了的方法 private final CallbackInfo mInfo; @SuppressWarnings("WeakerAccess") static final Map<Class, CallbackInfo> sInfoCache = new HashMap<>();
代码语言:txt
复制
    ReflectiveGenericLifecycleObserver(Object wrapped) {
代码语言:txt
复制
        mWrapped = wrapped;
代码语言:txt
复制
        mInfo = getInfo(mWrapped.getClass());
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onStateChanged(LifecycleOwner source, Event event) {
代码语言:txt
复制
        invokeCallbacks(mInfo, source, event);
代码语言:txt
复制
    }
代码语言:txt
复制
    private void invokeCallbacks(CallbackInfo info, LifecycleOwner source, Event event) {
代码语言:txt
复制
        invokeMethodsForEvent(info.mEventToHandlers.get(event), source, event);
代码语言:txt
复制
        invokeMethodsForEvent(info.mEventToHandlers.get(Event.ON_ANY), source, event);
代码语言:txt
复制
    }
代码语言:txt
复制
    private void invokeMethodsForEvent(List<MethodReference> handlers, LifecycleOwner source,
代码语言:txt
复制
            Event event) {
代码语言:txt
复制
        if (handlers != null) {
代码语言:txt
复制
            for (int i = handlers.size() - 1; i >= 0; i--) {
代码语言:txt
复制
                MethodReference reference = handlers.get(i);
代码语言:txt
复制
                invokeCallback(reference, source, event);
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    //最后走到 invokeCallback 这里
代码语言:txt
复制
    private void invokeCallback(MethodReference reference, LifecycleOwner source, Event event) {
代码语言:txt
复制
        //noinspection TryWithIdenticalCatches
代码语言:txt
复制
        try {
代码语言:txt
复制
            switch (reference.mCallType) {
代码语言:txt
复制
                case CALL_TYPE_NO_ARG:
代码语言:txt
复制
                    reference.mMethod.invoke(mWrapped);
代码语言:txt
复制
                    break;
代码语言:txt
复制
                case CALL_TYPE_PROVIDER:
代码语言:txt
复制
                    reference.mMethod.invoke(mWrapped, source);
代码语言:txt
复制
                    break;
代码语言:txt
复制
                case CALL_TYPE_PROVIDER_WITH_EVENT:
代码语言:txt
复制
                    reference.mMethod.invoke(mWrapped, source, event);
代码语言:txt
复制
                    break;
代码语言:txt
复制
            }
代码语言:txt
复制
        } catch (InvocationTargetException e) {
代码语言:txt
复制
            throw new RuntimeException("Failed to call observer method", e.getCause());
代码语言:txt
复制
        } catch (IllegalAccessException e) {
代码语言:txt
复制
            throw new RuntimeException(e);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    private static CallbackInfo getInfo(Class klass) {
代码语言:txt
复制
        CallbackInfo existing = sInfoCache.get(klass);
代码语言:txt
复制
        if (existing != null) {
代码语言:txt
复制
            return existing;
代码语言:txt
复制
        }
代码语言:txt
复制
        existing = createInfo(klass);
代码语言:txt
复制
        return existing;
代码语言:txt
复制
    }
代码语言:txt
复制
    //通过反射获取 method 信息
代码语言:txt
复制
    private static CallbackInfo createInfo(Class klass) {
代码语言:txt
复制
        //...
代码语言:txt
复制
        Method[] methods = klass.getDeclaredMethods();
代码语言:txt
复制
        Class[] interfaces = klass.getInterfaces();
代码语言:txt
复制
        for (Class intrfc : interfaces) {
代码语言:txt
复制
            for (Entry<MethodReference, Event> entry : getInfo(intrfc).mHandlerToEvent.entrySet()) {
代码语言:txt
复制
                verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        for (Method method : methods) {
代码语言:txt
复制
            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
代码语言:txt
复制
            if (annotation == null) {
代码语言:txt
复制
                continue;
代码语言:txt
复制
            }
代码语言:txt
复制
            Class<?>[] params = method.getParameterTypes();
代码语言:txt
复制
            int callType = CALL_TYPE_NO_ARG;
代码语言:txt
复制
            if (params.length > 0) {
代码语言:txt
复制
                callType = CALL_TYPE_PROVIDER;
代码语言:txt
复制
                if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
代码语言:txt
复制
                    throw new IllegalArgumentException(
代码语言:txt
复制
                            "invalid parameter type. Must be one and instanceof LifecycleOwner");
代码语言:txt
复制
                }
代码语言:txt
复制
            }
代码语言:txt
复制
            Event event = annotation.value();
代码语言:txt
复制
            //...
代码语言:txt
复制
            MethodReference methodReference = new MethodReference(callType, method);
代码语言:txt
复制
            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
代码语言:txt
复制
        }
代码语言:txt
复制
        CallbackInfo info = new CallbackInfo(handlerToEvent);
代码语言:txt
复制
        sInfoCache.put(klass, info);
代码语言:txt
复制
        return info;
代码语言:txt
复制
    }
代码语言:txt
复制
    @SuppressWarnings("WeakerAccess")
代码语言:txt
复制
    static class CallbackInfo {
代码语言:txt
复制
        final Map<Event, List<MethodReference>> mEventToHandlers;
代码语言:txt
复制
        final Map<MethodReference, Event> mHandlerToEvent;
代码语言:txt
复制
        CallbackInfo(Map<MethodReference, Event> handlerToEvent) {
代码语言:txt
复制
            //...
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    static class MethodReference {
代码语言:txt
复制
        final int mCallType;
代码语言:txt
复制
        final Method mMethod;
代码语言:txt
复制
        MethodReference(int callType, Method method) {
代码语言:txt
复制
            mCallType = callType;
代码语言:txt
复制
            mMethod = method;
代码语言:txt
复制
            mMethod.setAccessible(true);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    private static final int CALL_TYPE_NO_ARG = 0;
代码语言:txt
复制
    private static final int CALL_TYPE_PROVIDER = 1;
代码语言:txt
复制
    private static final int CALL_TYPE_PROVIDER_WITH_EVENT = 2;
代码语言:txt
复制
}
代码语言:txt
复制
```

06.addObserver调用分析

  • 看一下Lifecycle中addObserver方法,发现它是一个抽象方法,那么就去找它的实现类,这里先来看一下LifecycleRegistry类中的addObserver方法实现代码@Override public void addObserver(@NonNull LifecycleObserver observer) { State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED; //构造ObserverWithState ObserverWithState statefulObserver = new ObserverWithState(observer, initialState); //将observer对象和statefulObserver对象添加到FastSafeIterableMap数据结构中 ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
代码语言:txt
复制
    if (previous != null) {
代码语言:txt
复制
        return;
代码语言:txt
复制
    }
代码语言:txt
复制
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
代码语言:txt
复制
    if (lifecycleOwner == null) {
代码语言:txt
复制
        // 它是null,我们应该被摧毁。快速回退
代码语言:txt
复制
        return;
代码语言:txt
复制
    }
代码语言:txt
复制
    boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
代码语言:txt
复制
    State targetState = calculateTargetState(observer);
代码语言:txt
复制
    mAddingObserverCounter++;
代码语言:txt
复制
    while ((statefulObserver.mState.compareTo(targetState) < 0
代码语言:txt
复制
            && mObserverMap.contains(observer))) {
代码语言:txt
复制
        pushParentState(statefulObserver.mState);
代码语言:txt
复制
        statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
代码语言:txt
复制
        popParentState();
代码语言:txt
复制
        // mState / subling may have been changed recalculate
代码语言:txt
复制
        targetState = calculateTargetState(observer);
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!isReentrance) {
代码语言:txt
复制
        // we do sync only on the top level.
代码语言:txt
复制
        sync();
代码语言:txt
复制
    }
代码语言:txt
复制
    mAddingObserverCounter--;
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 然后看一下ObserverWithState类,追溯代码到Lifecycling.getCallback(observer),看看里面做了什么static class ObserverWithState { State mState; GenericLifecycleObserver mLifecycleObserver;
代码语言:txt
复制
    ObserverWithState(LifecycleObserver observer, State initialState) {
代码语言:txt
复制
        mLifecycleObserver = Lifecycling.getCallback(observer);
代码语言:txt
复制
        mState = initialState;
代码语言:txt
复制
    }
代码语言:txt
复制
    void dispatchEvent(LifecycleOwner owner, Event event) {
代码语言:txt
复制
        State newState = getStateAfter(event);
代码语言:txt
复制
        mState = min(mState, newState);
代码语言:txt
复制
        mLifecycleObserver.onStateChanged(owner, event);
代码语言:txt
复制
        mState = newState;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 接着来看看Lifecycling类中getCallback方法
    • 判断该Observer是否是GenericLifecycleObserver,是的话返回本身;如果是FullLifecycleObserver,则直接创建一个FullLifecycleObserverAdapter对象
    • 判断是否包含注解处理器 查找是否包含“类名__LifecycleAdapter”的类 包含并且有OnLifecycleEvent注解则返回SingleGeneratedAdapterObserver/CompositeGeneratedAdaptersObserver
    • 如果以上提交都不满足就通过反射调用回调方法@NonNull static GenericLifecycleObserver getCallback(Object object) { if (object instanceof FullLifecycleObserver) { return new FullLifecycleObserverAdapter((FullLifecycleObserver) object); }
代码语言:txt
复制
    if (object instanceof GenericLifecycleObserver) {
代码语言:txt
复制
        return (GenericLifecycleObserver) object;
代码语言:txt
复制
    }
代码语言:txt
复制
    //获取传入对象object的Class对象
代码语言:txt
复制
    final Class<?> klass = object.getClass();
代码语言:txt
复制
    //获取类型是否包含注解处理器
代码语言:txt
复制
    int type = getObserverConstructorType(klass);
代码语言:txt
复制
    if (type == GENERATED_CALLBACK) {
代码语言:txt
复制
        ////这里是包含注解处理器 返回SingleGeneratedAdapterObserver 或者CompositeGeneratedAdaptersObserver
代码语言:txt
复制
        List<Constructor<? extends GeneratedAdapter>> constructors =
代码语言:txt
复制
                sClassToAdapters.get(klass);
代码语言:txt
复制
        if (constructors.size() == 1) {
代码语言:txt
复制
            GeneratedAdapter generatedAdapter = createGeneratedAdapter(
代码语言:txt
复制
                    constructors.get(0), object);
代码语言:txt
复制
            return new SingleGeneratedAdapterObserver(generatedAdapter);
代码语言:txt
复制
        }
代码语言:txt
复制
        GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
代码语言:txt
复制
        for (int i = 0; i < constructors.size(); i++) {
代码语言:txt
复制
            adapters[i] = createGeneratedAdapter(constructors.get(i), object);
代码语言:txt
复制
        }
代码语言:txt
复制
        return new CompositeGeneratedAdaptersObserver(adapters);
代码语言:txt
复制
    }
代码语言:txt
复制
    ///通过反射调用方法
代码语言:txt
复制
    return new ReflectiveGenericLifecycleObserver(object);
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 然后查看一下SingleGeneratedAdapterObserver类
    • 通过ObserverWithState#dispatchEvent方法最后调用的实际是SingleGeneratedAdapterObserver里面的onStateChanged方法
    • 在SingleGeneratedAdapterObserver里面调用了Adapter的callMethods方法
    • 这个是@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver {
代码语言:txt
复制
    private final GeneratedAdapter mGeneratedAdapter;
代码语言:txt
复制
    SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {
代码语言:txt
复制
        mGeneratedAdapter = generatedAdapter;
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
代码语言:txt
复制
        mGeneratedAdapter.callMethods(source, event, false, null);
代码语言:txt
复制
        mGeneratedAdapter.callMethods(source, event, true, null);
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 然后看一下CompositeGeneratedAdaptersObserver类
    • 通过ObserverWithState#dispatchEvent方法最后调用的实际是CompositeGeneratedAdaptersObserver里面的onStateChanged方法
    • 在CompositeGeneratedAdaptersObserver里面遍历mGeneratedAdapters,然后也是调用callMethods方法@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public class CompositeGeneratedAdaptersObserver implements GenericLifecycleObserver {
代码语言:txt
复制
    private final GeneratedAdapter[] mGeneratedAdapters;
代码语言:txt
复制
    CompositeGeneratedAdaptersObserver(GeneratedAdapter[] generatedAdapters) {
代码语言:txt
复制
        mGeneratedAdapters = generatedAdapters;
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
代码语言:txt
复制
        MethodCallsLogger logger = new MethodCallsLogger();
代码语言:txt
复制
        for (GeneratedAdapter mGenerated: mGeneratedAdapters) {
代码语言:txt
复制
            mGenerated.callMethods(source, event, false, logger);
代码语言:txt
复制
        }
代码语言:txt
复制
        for (GeneratedAdapter mGenerated: mGeneratedAdapters) {
代码语言:txt
复制
            mGenerated.callMethods(source, event, true, logger);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 最后看一下ReflectiveGenericLifecycleObserver类的代码
    • 反射调用回调函数,不过这里听过class对象,从ClassesInfoCache获取info信息。先从map里拿,拿不到通过createInfo函数扫描类里面的方法。具体分析可以看源码……class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver { private final Object mWrapped; private final CallbackInfo mInfo;
代码语言:txt
复制
    ReflectiveGenericLifecycleObserver(Object wrapped) {
代码语言:txt
复制
        mWrapped = wrapped;
代码语言:txt
复制
        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void onStateChanged(LifecycleOwner source, Event event) {
代码语言:txt
复制
        mInfo.invokeCallbacks(source, event, mWrapped);
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 当addObserver的时候最后实际传入的是一个包装好的ObserverWithState对象 然后调用onStateChanged方法来分发状态。使用处理器来提高性能,避免反射造成的性能消耗。

07.知识点梳理和总结一下

  • Lifecycle 库通过在 SupportActivity 的 onCreate 中注入 ReportFragment 来感知发生命周期;
  • Lifecycle 抽象类,是 Lifecycle 库的核心类之一,它是对生命周期的抽象,定义了生命周期事件以及状态,通过它我们可以获取当前的生命周期状态,同时它也奠定了观察者模式的基调;(我是党员你看出来了吗:-D)
  • LifecycleOwner ,描述了一个拥有生命周期的组件,可以自己定义,不过通常我们不需要,直接使用 AppCompatActivity 等即可;
  • LifecycleRegistry 是Lifecycle的实现类,它负责接管生命周期事件,同时也负责Observer` 的注册以及通知;
  • ObserverWithState ,是 Observer 的一个封装类,是它最终 通过 ReflectiveGenericLifecycleObserve 调用了我们用注解修饰的方法;
  • LifecycleObserver ,Lifecycle 的观察者,利用它我们可以享受 Lifecycle 带来的能力;
  • ReflectiveGenericLifecycleObserver,它存储了我们在 Observer 里注解的方法,并在生命周期发生改变的时候最终通过反射的方式调用对应的方法。

参考博客

开源LiveData事件总线:https://github.com/yangchong211/YCLiveDataBus

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Lifecycle源码分析
    • 00.使用AAC实现bus事件总线
      • 01.Lifecycle的作用是什么
        • 02.Lifecycle的简单使用
          • 03.Lifecycle的使用场景
            • 04.如何实现生命周期感知
              • 05.注解方法如何被调用
                • 06.addObserver调用分析
                  • 07.知识点梳理和总结一下
                    • 参考博客
                      • 开源LiveData事件总线:https://github.com/yangchong211/YCLiveDataBus
                      相关产品与服务
                      事件总线
                      腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档