参考Android Jetpack架构组件之 Lifecycle(源码篇)android
关于Lifecycle的使用考上一篇文章Android Jetpack框架之 Lifecycles(使用篇),从使用的方法中咱们知道Lifecycle的实现主要依赖:LifecycleObserver、LifecycleOwner;经过像Owner注册Observer实现感知Owner的生命周期,下面一块儿看看源码是如何巧妙设计的;架构
// 实现LifecycleObserver class MyObserver(var lifecycle: Lifecycle, var callback: CallBack) : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public fun connectOnCreate() { p("connectOnCreate") } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public fun connectOnResume() { p("connectOnResume") } } // LifecycleObserver 是一个空接口 public interface LifecycleObserver { }
上面过程作了三件事情:app
@OnLifecycleEvent:运行注解框架
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface OnLifecycleEvent { Lifecycle.Event value(); }
// 生命周期Event public enum Event { /** * Constant for onCreate event of the {@link LifecycleOwner}. */ ON_CREATE, /** * Constant for onStart event of the {@link LifecycleOwner}. */ ON_START, /** * Constant for onResume event of the {@link LifecycleOwner}. */ ON_RESUME, /** * Constant for onPause event of the {@link LifecycleOwner}. */ ON_PAUSE, /** * Constant for onStop event of the {@link LifecycleOwner}. */ ON_STOP, /** * Constant for onDestroy event of the {@link LifecycleOwner}. */ ON_DESTROY, /** * An {@link Event Event} constant that can be used to match all events. */ ON_ANY } //5个对应的生命周期状态 public enum State { DESTROYED, INITIALIZED, CREATED, STARTED, RESUMED; public boolean isAtLeast(@NonNull State state) { return compareTo(state) >= 0; } }
经过Lifecycle.Event和State的查看,系统提供了Activity每一个生命周期对应的Event,而Event有会有对应的State,此时 以大体猜测到上面的执行过程:ide
LifecycleOwner源码分析
class LifeCyclerActivity : AppCompatActivity() { ... var myObserver = MyObserver(lifecycle, object : CallBack { // 建立LifecyclerObserver override fun update() { ... } }) lifecycle.addObserver(myObserver) // 添加观察者 } }
从上面的使用状况看出,使用的活动须要调用getLifecycle()方法,返回LifecycleRegistry,这里的getLifecycle()方法实际上是接口LifecycleOwner接口中的方法,this
@SuppressWarnings({"WeakerAccess", "unused"}) public interface LifecycleOwner { /** * Returns the Lifecycle of the provider. * * @return The lifecycle of the provider. */ @NonNull Lifecycle getLifecycle(); }
此时LifecycleActivity虽然没有实现接口,由于他继承的AppCompatActivity继承了SupportActivity,而SupportActivity实现了接口spa
@RestrictTo(LIBRARY_GROUP) public class SupportActivity extends Activity implements LifecycleOwner { private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); //建立 @Override public Lifecycle getLifecycle() { // 重写方法返回LifecycleRegistry return mLifecycleRegistry; } }
SupportActivity除了执行上述操做外,在onCrate的方法中还有一句重要的代码,初始化了一个ReportFragment.net
protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ReportFragment.injectIfNeededIn(this); } ReportFragment public class ReportFragment extends Fragment { private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle" + ".LifecycleDispatcher.report_fragment_tag"; public static void injectIfNeededIn(Activity activity) { //初始化Fragment android.app.FragmentManager manager = activity.getFragmentManager(); if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); 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); 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); } } } }
上面代码中作了两件事:设计
在dispatch()方法中根据LifecyclerOwner和LifecyclerRegistryOwner实例分别处理,由于LifecyclerRegistryOwner也是继承LifecyclerOwner,而在咱们SupportActivity中的getLifecycler()中返回的是LifecycleRegistry,因此此处回调的都是LifecycleRegistry的handleLifecycleEvent;