说在前面
本次推出 Android Architecture Components 系列文章,目前写好了四篇,主要是关于 lifecycle,livedata 的使用和源码分析,其余的 Navigation, Paging library,Room,WorkMannager 等春节结束之后会更新,欢迎关注我的公众号,有更新的话会第一时间会在公众号上面通知。
-
Android lifecycle 使用详解
-
Android LiveData 使用详解
-
Android lifecyle 源码解剖
-
Android livedata 源码解剖
前两篇博客,我们已经讲解了 lifecycle ,liveData, ViewModel 的使用,这一篇博客,让我们一起来看一下 lifecycle 的原理。
从自定义的 lifecycle 说起
首先我们先来复习一下,如果要自定义 lifecycle,我们要这样做。
1public class CustomLifecycleActivity extends FragmentActivity implements LifecycleOwner { 2 3 private LifecycleRegistry mLifecycleRegistry; 4 5 private static final String TAG = "CustomLifecycleActivity"; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState);10 setContentView(R.layout.activity_custom_lifecycle);11 mLifecycleRegistry = new LifecycleRegistry(this);12 mLifecycleRegistry.markState(Lifecycle.State.CREATED);13 getLifecycle().addObserver(new GenericLifecycleObserver() {14 @Override15 public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {16 Log.d(TAG, "onStateChanged: event = " + event);17 }18 });1920 }2122 @Override23 protected void onStart() {24 super.onStart();25 mLifecycleRegistry.markState(Lifecycle.State.STARTED);26 }2728 @Override29 protected void onResume() {30 super.onResume();31 mLifecycleRegistry.markState(Lifecycle.State.RESUMED);32 }3334 @Override35 protected void onDestroy() {36 super.onDestroy();37 mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);38 }3940 @NonNull41 @Override42 public Lifecycle getLifecycle() {43 return mLifecycleRegistry;44 }45}
-
第一步:先实现 LifecycleOwner 接口,并返回 mLifecycleRegistry
-
第二步:在 Activity 生命周期变化的时候,调用 mLifecycleRegistry.markState() 方法标记相应的状态
-
如果想添加 observer,调用 addObserver 方法添加观察者,这样会在 activity 生命周期变化的时候,回调 observer 的 onchange 方法。
我们先来看一下 getLifecycle() 方法, getLifecycle() 它返回的是一个 Lifecycle 的实例,sdk 中默认的实现类为 LifecycleRegistry。
接下来,我们一起来看一下它的 observer 方法。
1public void addObserver(@NonNull LifecycleObserver observer) { 2 // 判断是否是 DESTROYED,如果是将初始状态置为 DESTROYED,否则为 INITIALIZED 3 State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED; 4 // ObserverWithState 包装 5 ObserverWithState statefulObserver = new ObserverWithState(observer, initialState); 6 // 将 observer 作为key,在缓存的 mObserverMap 中查找是否存在 7 ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver); 8 9 // 存在,直接返回回去,证明该 observer 已经添加过了。否则,证明还没有添加过该 observer10 if (previous != null) {11 return;12 }1314 LifecycleOwner lifecycleOwner = mLifecycleOwner.get();15 if (lifecycleOwner == null) {16 // it is null we should be destroyed. Fallback quickly17 return;18 }1920 // 这里 mAddingObserverCounter 为 0 ,mHandlingEvent 为 false21 boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;22 State targetState = calculateTargetState(observer);23 mAddingObserverCounter++;24 while ((statefulObserver.mState.compareTo(targetState) < 025 && mObserverMap.contains(observer))) {26 pushParentState(statefulObserver.mState);27 statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));28 popParentState();29 // mState / subling may have been changed recalculate30 targetState = calculateTargetState(observer);31 }3233 if (!isReentrance) {34 // we do sync only on the top level.35 sync();36 }37 mAddingObserverCounter--;38}
在 addObserver 方法中,它主要干这几件事情
-
首先,先初始化状态, 判断当前 mState 是否是 DESTROYED,如果是将初始状态置为 DESTROYED,否则为 INITIALIZED,接着用 ObserverWithState 包装 observer 和 初始化状态 initialState
-
将 observer 作为 key,在缓存的 mObserverMap 中查找是否存在,如果存在,证明该 observer 已经添加过,直接返回回去,不必再进行处理。
-
addObserver 方法中第 21 行 , isReentrance 一般情况下为 false,什么情况 为 true,暂时未想到,
接下来我们先来看 calculateTargetState 方法。
1private State calculateTargetState(LifecycleObserver observer) { 2 // 取出 mObserverMap 的上一个 entry,previous 3 Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer); 4 5 // 如果不为空,获取它的状态 6 State siblingState = previous != null ? previous.getValue().mState : null; 7 // 判断 mParentStates 是否为 null,不为 null,去最后的一个状态,否则,为 null 8 State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1) 9 : null;10 // 取最小的状态11 return min(min(mState, siblingState), parentState);12}
-
首先,取出 mObserverMap 中上一个的 entry,该 LifecycleRegistry 实例如果是第一次调用 addObserver 实例的话,那么是 null,否则是上一个 observer 的 entry
-
根据 previous 是否为 null,设置 siblingState 的值
-
判断 mParentStates 是否为 null,不为 null,取 mParentStates 最后一次的状态
-
取 mState, siblingState 最小的状态 a,再取 a 与 parentState 的状态 b
1public enum State { 2 3 DESTROYED, 4 5 INITIALIZED, 6 7 CREATED, 8 9 STARTED,1011 RESUMED;1213 public boolean isAtLeast(@NonNull State state) {14 return compareTo(state) >= 0;15 }16}
State 中,他们排序的顺序是 DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED。
我们知道,我们在 activity 的 onCreate 方法中初始化 LifecycleRegistry,并标记它的状态为 CREATED。当我们第一次在 onCreate 方法调用 addObserver 的时候,在 calculateTargetState 方法中,若是首次调用 previous 为 null,则 siblingState,parentState 为 null, 而 mState 为 CREATED,所以最终的状态为 CREATED,即 State targetState = calculateTargetState(observer); 中 targetState 为 CREATED
1 // 取最小的状态2 return min(min(mState, siblingState), parentState);
看完 calculateTargetState 方法,我们回过头再来看一下 addObserver 方法。
1public void addObserver(@NonNull LifecycleObserver observer) { 2 3 4 // 省略若干行 5 6 // 这里 mAddingObserverCounter 为 0 ,mHandlingEvent 为 false 7 boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent; 8 State targetState = calculateTargetState(observer); 9 mAddingObserverCounter++;10 while ((statefulObserver.mState.compareTo(targetState) < 011 && mObserverMap.contains(observer))) {12 pushParentState(statefulObserver.mState);13 statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));14 popParentState();15 // mState / subling may have been changed recalculate16 targetState = calculateTargetState(observer);17 }1819 if (!isReentrance) {20 // we do sync only on the top level.21 sync();22 }23 mAddingObserverCounter--;24}
这里 statefulObserver.mState 为 DESTROYED 或者 INITIALIZED,肯定比 CREATED 小。而 mObserverMap.contains(observer) 必定为 true,除非我们手动移除掉 mObserverMap。因而,会走进 while循环。
1private void pushParentState(State state) {2 mParentStates.add(state);3}45private ArrayList<State> mParentStates = new ArrayList<>();
pushParentState(statefulObserver.mState); 很简单,只是将 statefulObserver 的状态添加到 mParentStates 集合中。
继续往下走,接着会调用 statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
1private static Event upEvent(State state) { 2 switch (state) { 3 case INITIALIZED: 4 case DESTROYED: 5 return ON_CREATE; 6 case CREATED: 7 return ON_START; 8 case STARTED: 9 return ON_RESUME;10 case RESUMED:11 throw new IllegalArgumentException();12 }13 throw new IllegalArgumentException("Unexpected state value " + state);14}
upEvent 方法也很简单,只是返回它的下一个 event。这里因为他们的 state为 INITIALIZED,所以它会返回 ON_CREATE。
1void dispatchEvent(LifecycleOwner owner, Event event) { 2 State newState = getStateAfter(event); 3 mState = min(mState, newState); 4 mLifecycleObserver.onStateChanged(owner, event); 5 mState = newState; 6} 7 8static State getStateAfter(Event event) { 9 switch (event) {10 case ON_CREATE:11 case ON_STOP:12 return CREATED;13 case ON_START:14 case ON_PAUSE:15 return STARTED;16 case ON_RESUME:17 return RESUMED;18 case ON_DESTROY:19 return DESTROYED;20 case ON_ANY:21 break;22 }23 throw new IllegalArgumentException("Unexpected event value " + event);24}
这里 event 为 ON_CREATE,所以 newState 也为 CREATED。 mState = min(mState, newState); mState newState,两者状态相同,所以 mState 也为 CREATED。接着回调 mLifecycleObserver 的 onStateChanged 方法。所以,这里,会收到我们的 onCreate 事件,与我们的预想相符。
但是我们并没有在 onStart,onResume, onPause , onStop 和 onDestroy 方法中调用 mLifecycleRegistry.handleLifecycleEvent 方法,它又是怎样促发 Observer 的 onStateChanged 方法的。这里先不揭晓,我们先来看一下 26.1.0 以后的 AppCompatActivity,待会你就明白了,会感叹 google 真的牛逼!
从 26.1.0以后 AppCompatActivity 的设计说起
我们知道,在 26.1.0 以后,如果我们要使用 lifecycle,我们只需要调用以下的方法即可。
SupportActivity
1getLifecycle().addObserver(new GenericLifecycleObserver() {23 @Override4 public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {5 Log.d(TAG, "onStateChanged: event =" + event);6 }7});
跟踪 getLifecycle() 方法,它会跳转到 SupportActivity 的 getLifecycle 方法 中。
1public class SupportActivity extends Activity implements LifecycleOwner, Component { 2 3 private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 4 5 protected void onCreate(@Nullable Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 ReportFragment.injectIfNeededIn(this); 8 } 910 @Override11 public Lifecycle getLifecycle() {12 return mLifecycleRegistry;13 }1415}
在 SupportActivity 中,它默认为我们初始化 mLifecycleRegistry,作为一个成员变量。接着,他在 onCreate 方法中调用了 ReportFragment.injectIfNeededIn(this); 方法。
1public class ReportFragment extends Fragment { 2 private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle" 3 + ".LifecycleDispatcher.report_fragment_tag"; 4 5 public static void injectIfNeededIn(Activity activity) { 6 // ProcessLifecycleOwner should always correctly work and some activities may not extend 7 // FragmentActivity from support lib, so we use framework fragments for activities 8 android.app.FragmentManager manager = activity.getFragmentManager(); 9 if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {10 manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();11 // Hopefully, we are the first to make a transaction.12 manager.executePendingTransactions();13 }14 }
在 injectIfNeededIn 方法中,它会判断我们是否已经添加 ReportFragment,没有的话,添加进去。
1public class ReportFragment extends Fragment { 2 private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle" 3 + ".LifecycleDispatcher.report_fragment_tag"; 4 5 private ActivityInitializationListener mProcessListener; 6 7 private void dispatchCreate(ActivityInitializationListener listener) { 8 if (listener != null) { 9 listener.onCreate();10 }11 }1213 private void dispatchStart(ActivityInitializationListener listener) {14 if (listener != null) {15 listener.onStart();16 }17 }1819 private void dispatchResume(ActivityInitializationListener listener) {20 if (listener != null) {21 listener.onResume();22 }23 }2425 @Override26 public void onActivityCreated(Bundle savedInstanceState) {27 super.onActivityCreated(savedInstanceState);28 dispatchCreate(mProcessListener);29 dispatch(Lifecycle.Event.ON_CREATE);30 }3132 @Override33 public void onStart() {34 super.onStart();35 dispatchStart(mProcessListener);36 dispatch(Lifecycle.Event.ON_START);37 }3839 @Override40 public void onResume() {41 super.onResume();42 dispatchResume(mProcessListener);43 dispatch(Lifecycle.Event.ON_RESUME);44 }4546 @Override47 public void onPause() {48 super.onPause();49 dispatch(Lifecycle.Event.ON_PAUSE);50 }5152 @Override53 public void onStop() {54 super.onStop();55 dispatch(Lifecycle.Event.ON_STOP);56 }5758 @Override59 public void onDestroy() {60 super.onDestroy();61 dispatch(Lifecycle.Event.ON_DESTROY);62 // just want to be sure that we won't leak reference to an activity63 mProcessListener = null;64 }65 }
然后,它在 onCreat ,onStart, onResume, onPause, onStop, onDestroy 方法中分别调用 dispatch 方法进行分发生命周期。
1private void dispatch(Lifecycle.Event event) { 2 Activity activity = getActivity(); 3 if (activity instanceof LifecycleRegistryOwner) { 4 ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); 5 return; 6 } 7 8 if (activity instanceof LifecycleOwner) { 9 Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();10 if (lifecycle instanceof LifecycleRegistry) {11 ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);12 }13 }14}
在 dispatch 方法中,会先判断 activity 是不是实现了 LifecycleRegistryOwner ,如果是,直接分发,不过不是,判断是否实现 LifecycleOwner,获取它的 lifecycle,调用它 的 handleLifecycleEvent 进行分发。
1public class SupportActivity extends Activity implements LifecycleOwner, Component {23 private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this
而很明显,高版本的 SupportActivity 实现了 LifecycleOwner 接口,并写 LifecycleOwner.getLifecycle() 是 LifecycleRegistry
普通的 Activity
对于 26.1.0 以后的版本,你会发现,对于普通的 Activity,如果你想要使用 lifecycle,你只需要实现 LifecycleOwner 接口即可。当生命周期变化的时候,它也可以回调 Observer 的 onStateChanged 方法。
回到我们前面的问题:
我们并没有在 onStart,onResume, onPause , onStop 和 onDestroy 方法中调用 mLifecycleRegistry.handleLifecycleEvent 方法,它又是怎样促发 onStateChanged 方法的
我们猜想它也是通过 ReportFragment 实现的。但是在 Activity 的 onCreate 方法中,我们并没有发现它有添加 ReportFragment,我们在 As 全局搜一下,看哪些地方使用到 ReportFragment。如下图
从图中可以看到,有几个地方使用到他。我们先来看一下 LifecycleDispatcher
1class LifecycleDispatcher { 2 3 private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle" 4 + ".LifecycleDispatcher.report_fragment_tag"; 5 6 private static AtomicBoolean sInitialized = new AtomicBoolean(false); 7 8 static void init(Context context) { 9 if (sInitialized.getAndSet(true)) {10 return;11 }12 // 在 init 方法中,监听全局 activity 的创建,从而来添加 fragment13 ((Application) context.getApplicationContext())14 .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());15 }1617 @SuppressWarnings("WeakerAccess")18 @VisibleForTesting19 static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {20 private final FragmentCallback mFragmentCallback;2122 DispatcherActivityCallback() {23 mFragmentCallback = new FragmentCallback();24 }2526 @Override27 public void onActivityCreated(Activity activity, Bundle savedInstanceState) {28 if (activity instanceof FragmentActivity) {29 ((FragmentActivity) activity).getSupportFragmentManager()30 .registerFragmentLifecycleCallbacks(mFragmentCallback, true);31 }32 ReportFragment.injectIfNeededIn(activity);33 }3435 @Override36 public void onActivityStopped(Activity activity) {37 if (activity instanceof FragmentActivity) {38 markState((FragmentActivity) activity, CREATED);39 }40 }4142 @Override43 public void onActivitySaveInstanceState(Activity activity, Bundle outState) {44 if (activity instanceof FragmentActivity) {45 markState((FragmentActivity) activity, CREATED);46 }47 }48 }4950 // 省略若干代码5152}
可以看到,它 在 init 方法中,通过 context.getApplicationContext() .registerActivityLifecycleCallbacks 监听全局 activity 的创建,在 activity oncreate 的时候,调用 ReportFragment.injectIfNeededIn(activity) ,从而来添加 fragment,进而分发相应的事件。
那 LifecycleDispatcher 的 init 方法又是在哪里调用的呢? 我们全局搜索一下
1public class ProcessLifecycleOwnerInitializer extends ContentProvider {2 @Override3 public boolean onCreate() {4 LifecycleDispatcher.init(getContext());5 ProcessLifecycleOwner.init(getContext());6 return true;7 }
可以看到它是在 ProcessLifecycleOwnerInitializer 的 onCreate 方法中调用的。而 ProcessLifecycleOwnerInitializer 是一个 ContentProvider。我们知道 ContentProvider 一般是在 AndroidManifest 中生命的。
果然,在 extensions-1.1.1.aar 中,我们惊喜地发现,它在 Manifest 里面注册了。
1<manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="android.arch.lifecycle.extensions" > 3 4 <uses-sdk android:minSdkVersion="14" /> 5 6 <application> 7 <provider 8 android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer" 9 android:authorities="${applicationId}.lifecycle-trojan"10 android:exported="false"11 android:multiprocess="true" />12 </application>1314</manifest>
而 ContentProvider 的 onCreate 方法优先于 Application 的 onCreate 执行,所以在 Application 之前我们就调用了 ProcessLifecycleOwnerInitializer init 方法,监听了 Activity 的创建,当 Actiivty 创建的时候,会尝试为 Activity 添加 ReportFragment。而 ReportFragment 会在 Activity 生命周期变化的时候帮助我们分发生命周期。
ContentProvider 的 onCreate 方法优先于 Application 的 onCreate 执行,可以查看这一篇博客 Android系统中的Application和四大组件一些方法的启动顺序和一些坑
总结
ok,我们来梳理一下。
对于 26.1.0 以后的 SupportActivity
它在 Activity onCreate 的时候添加了 ReportFragment,这个 ReportFragment 相当于一个代理,它在 onActivityCreated 的时候 dispatch(Lifecycle.Event.ON_CREATE) 进行分发生命周期,onStart, onResume, onPause, onStop, onDestroy 的时候也是如此。而 在 dispatch 中 它调用了 LifecycleRegistry handleLifecycleEvent 的方法。而 LifecycleRegistry 方法中经过一系列处理,它又调用了 observer 的 onStateChange 方法,去通知相应的 observer。
对于普通的 Activity
它利用了 ContentProvide 的特征,它是在 Application onCreate 之前初始化的,他在 ProcessLifecycleOwnerInitializer oncreate 的时候监听 Activity 的创建,在 Activity 创建的时候,判断是否已经添加过 ReportFragment,没有的话,添加进去。这是一个很巧妙的设计,隐式初始化了 lifecycle。
用流程图表示如下:
该图片引用自 Android 架构组件(一)——Lifecycle
Lifecycle 设计借鉴
-
利用 ProcessLifecycleOwnerInitializer contentProvider 来隐式加载
想一下,如果 ProcessLifecycleOwnerInitializer 不利用 contentProvider 来隐式加载的话,对于 普通的 Activity,旧版本等,如果想使用 lifecycle,那必须在基类中,手动调用 ReportFragment.injectIfNeededIn(activity) 的方法。
-
利用 fragment 来分发生命周期
利用 fragment 来分发生命周期有两个优点
-
将逻辑从 Activity 中剥离出来,减少耦合,方便复用
-
可以做到在 Activity onCreate 之后才回调 observer 的 CREATED Event 事件。如果是通过 Application registerActivityLifecycleCallbacks 方法来分发生命周期的话,因为 ActivityLifecycleCallbacks 的 onActivityCreated 是在 Activity oncreate 之前调用的。