Android Lifecycle源码解析(一)

首先我们看HomeActivity中我们添加到一行代码

public class HomeActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//heregetLifecycle().addObserver(new HomeObserver());}
}

先看下类的继承关系

public class AppCompatActivity extends FragmentActivity
public class FragmentActivity extends SupportActivity

我们看下getLifecycle()是个什么东西?点击去看发现getLifecycle()方法是定义在SupportActivity,下面是其部分源码

SupportActivity

public class SupportActivity extends Activity implements LifecycleOwner, Component {...private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);public SupportActivity() {}protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);ReportFragment.injectIfNeededIn(this);}@CallSuperprotected void onSaveInstanceState(Bundle outState) {this.mLifecycleRegistry.markState(State.CREATED);super.onSaveInstanceState(outState);}public Lifecycle getLifecycle() {return this.mLifecycleRegistry;}...
}

可以看到getLifecycle返回的其实是个LifecycleRegistry对象;该类继承了Lifecycle抽象类;
Lifecycle类可以理解为具备获取生命周期状态的抽象类,为什么?看下面代码

public abstract class Lifecycle {@MainThreadpublic abstract void addObserver(@NonNull LifecycleObserver observer);@MainThreadpublic abstract void removeObserver(@NonNull LifecycleObserver observer);@MainThread@NonNullpublic abstract State getCurrentState();
}

Lifecycle声明了添加观察者,移除观察者,获取当前生命周期状态三个抽象方法
而LifecycleRegistry则是其子类,他是观察者和被观察者(HomeActivity)的纽带,能够管理多个观察者;HomeActivity的生命周期事件都是通过该类handleLifecycleEvent方法进行下发的,那么是谁将Activity的生命周期的事件转给LifecycleRegistry类中呢?答案是ReportFragment
这里有点像Glide框架中到设计一样使用一个空Fragment来感知Activity生命周期,避免图片加载出现内存泄漏
ReportFragment这家伙是在哪出现的?我们在SupportActivity类中的onCreate找到答案

class SupportActivity...protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);ReportFragment.injectIfNeededIn(this);}

ReportFragment

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class ReportFragment extends Fragment {private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"+ ".LifecycleDispatcher.report_fragment_tag";/****在Activity上附上一个空视图的ReportFragment**/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 activitiesandroid.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();}}private ActivityInitializationListener mProcessListener;private void dispatchCreate(ActivityInitializationListener listener) {if (listener != null) {listener.onCreate();}}...@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatchCreate(mProcessListener);dispatch(Lifecycle.Event.ON_CREATE);}@Overridepublic void onStart() {super.onStart();dispatchStart(mProcessListener);dispatch(Lifecycle.Event.ON_START);}...@Overridepublic void onDestroy() {super.onDestroy();dispatch(Lifecycle.Event.ON_DESTROY);// just want to be sure that we won't leak reference to an activitymProcessListener = null;}//可以看到Activtity的onCreate方法,以及ResportFragment中的onStart等各种生命周期方法都调用该方法,private void dispatch(Lifecycle.Event event) {Activity activity = getActivity();//v7中LifecycleRegistryOwner类不建议使用if (activity instanceof LifecycleRegistryOwner) {((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);return;}//因为SupportActivity实现了LifecycleOwner接口,所以会走此处分支if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();if (lifecycle instanceof LifecycleRegistry) {//关键点:生命周期事件转发给了LifecycleRegistry中了((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);}}}...
}

至此我们明白了Activity的生命周期事件是如何被转发到LifecycleRegistry中了,以一张流程图总结下

ActivityReportFragmentLifecycleRegistryonCreateinjectIfNeededIn(activity)onActivityCreatedispatch(state)handleLifecycleEventActivityReportFragmentLifecycleRegistry

接下来我们看下LifecycleRegistry类是如何处理事件的

LifecycleRegistry

我理解的是LifecycleRegistry类和java中的Observable类有点像;因为Lifecycle的设计思想有部分就是使用了观察者模式,LifecycleRegistry类中可以注册或反注册多个观察者,一旦生命周期发生变更LifecycleRegistry会及时通知所有的观察者,这样就达到了观察者能够感知带生命周期组件的变化了。

/*** An implementation of {@link Lifecycle} that can handle multiple observers.* <p>* It is used by Fragments and Support Library Activities. You can also directly use it if you have* a custom LifecycleOwner.*/
public class LifecycleRegistry extends Lifecycle {private static final String LOG_TAG = "LifecycleRegistry";/*** Custom list that keeps observers and can handle removals / additions during traversal.** Invariant: at any moment of time for observer1 & observer2:* if addition_order(observer1) < addition_order(observer2), then* state(observer1) >= state(observer2),*/private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =new FastSafeIterableMap<>();/*** Current state*/private State mState;/*** The provider that owns this Lifecycle.* Only WeakReference on LifecycleOwner is kept, so if somebody leaks Lifecycle, they won't leak* the whole Fragment / Activity. However, to leak Lifecycle object isn't great idea neither,* because it keeps strong references on all other listeners, so you'll leak all of them as* well.*///使用弱引用避免Activity/Fragment内存泄漏private final WeakReference<LifecycleOwner> mLifecycleOwner;private int mAddingObserverCounter = 0;private boolean mHandlingEvent = false;private boolean mNewEventOccurred = false;// we have to keep it for cases:// void onStart() {//     mRegistry.removeObserver(this);//     mRegistry.add(newObserver);// }// newObserver should be brought only to CREATED state during the execution of// this onStart method. our invariant with mObserverMap doesn't help, because parent observer// is no longer in the map.private ArrayList<State> mParentStates = new ArrayList<>();/*** Creates a new LifecycleRegistry for the given provider.* <p>* You should usually create this inside your LifecycleOwner class's constructor and hold* onto the same instance.** @param provider The owner LifecycleOwner*/public LifecycleRegistry(@NonNull LifecycleOwner provider) {mLifecycleOwner = new WeakReference<>(provider);mState = INITIALIZED;}/*** Moves the Lifecycle to the given state and dispatches necessary events to the observers.** @param state new state*/@SuppressWarnings("WeakerAccess")@MainThreadpublic void markState(@NonNull State state) {moveToState(state);}/*** Sets the current state and notifies the observers.* <p>* Note that if the {@code currentState} is the same state as the last call to this method,* calling this method has no effect.** @param event The event that was received*/public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {State next = getStateAfter(event);moveToState(next);}private void moveToState(State next) {//1. 如果状态和当前状态一样,则不需要下发事件通知if (mState == next) {return;}//2. 更新最新生命周期事件状态mState = next;if (mHandlingEvent || mAddingObserverCounter != 0) {mNewEventOccurred = true;// we will figure out what to do on upper level.return;}//3. 表示当前正在处理事件mHandlingEvent = true;//4. 同步事件到各Observersync();//5. 同步结束,重置标志mHandlingEvent = false;}// happens only on the top of stack (never in reentrance),// so it doesn't have to take in account parentsprivate void sync() {//获取具备生命周期的组件,如果没有直接返回LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {Log.w(LOG_TAG, "LifecycleOwner is garbage collected, you shouldn't try dispatch "+ "new events from it.");return;}//如果未同步,那就同步状态直到完成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 boolean isSynced() {if (mObserverMap.size() == 0) {return true;}State eldestObserverState = mObserverMap.eldest().getValue().mState;State newestObserverState = mObserverMap.newest().getValue().mState;return eldestObserverState == newestObserverState && mState == newestObserverState;}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);//可以看到最终事件是在这里分发给了observerobserver.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();}}}...
}

通过上面代码我们知道handleLifecycleEvent事件最后传递给observer的dispatchEvent方法中了;那么这个observer是什么?
首先看下它的类型是ObserverWithState,它是在什么时候被创建的呢?答案是addObserver方法

public class LifecycleRegistry extends Lifecycle {private static final String LOG_TAG = "LifecycleRegistry";private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =new FastSafeIterableMap<>();/*** Current state*/private State mState;//使用弱引用避免Activity/Fragment内存泄漏private final WeakReference<LifecycleOwner> mLifecycleOwner;...private ArrayList<State> mParentStates = new ArrayList<>();...@Overridepublic void addObserver(@NonNull LifecycleObserver observer) {State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;//创建一个带状态的Observer,可以理解为是observer的包装器ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);//将observer以及带状态的observer保存到map中ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);//如果observer存在则无需添加,直接返回if (previous != null) {return;}//生命周期组件校验LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {// it is null we should be destroyed. Fallback quicklyreturn;}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 recalculatetargetState = calculateTargetState(observer);}if (!isReentrance) {// we do sync only on the top level.sync();}mAddingObserverCounter--;}//带状态的Observerstatic class ObserverWithState {State mState;GenericLifecycleObserver mLifecycleObserver;ObserverWithState(LifecycleObserver observer, State initialState) {//此处划重点,感兴趣可以进去仔细研究mLifecycleObserver = Lifecycling.getCallback(observer);mState = initialState;}void dispatchEvent(LifecycleOwner owner, Event event) {State newState = getStateAfter(event);mState = min(mState, newState);mLifecycleObserver.onStateChanged(owner, event);mState = newState;}}
}

可以看到在ObserverWithState的dispatchEvent方法最终将事件委托给mLifecycleObserver,
运行demo可以看到这个mLifecycleObserver类型其实是ReflectiveGenericLifecycleObserver类型;其实也好蛮理解,因为我们的观察者的方法标注了注解,而要想调用它,其实此处是通过反射来查找观察者的带生命周期注解的方法,一旦状态改变时,通过反射直接调用就行;
因为反射代价较大,所以不太建议此种写法,建议通过注解处理器,动态生成辅助类来提高性能,这个后面再说

class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {private final Object mWrapped;private final CallbackInfo mInfo;ReflectiveGenericLifecycleObserver(Object wrapped) {mWrapped = wrapped;mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());}@Overridepublic void onStateChanged(LifecycleOwner source, Event event) {mInfo.invokeCallbacks(source, event, mWrapped);}
}

GenericLifecycleObserver的实现类有五种,感兴趣可以看看

推荐写法

上面一开始写法涉及到反射,为提高性能我们使用注解处理器方式来实现,google已经为我们想好了

1. 集成

annotationProcessor "android.arch.lifecycle:compiler:1.1.1" //java
kapt "android.arch.lifecycle:compiler:1.1.1" //如果用kotlin

重新clean,rebuild下可以看到,注解处理器帮我创建了辅助类,通过调用辅助类来提高运行期性能

辅助类代码

public class HomeObserver_LifecycleAdapter implements GeneratedAdapter {final HomeObserver mReceiver;HomeObserver_LifecycleAdapter(HomeObserver receiver) {this.mReceiver = receiver;}@Overridepublic void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,MethodCallsLogger logger) {boolean hasLogger = logger != null;if (onAny) {return;}if (event == Lifecycle.Event.ON_CREATE) {if (!hasLogger || logger.approveCall("onCreate", 1)) {mReceiver.onCreate();}return;}if (event == Lifecycle.Event.ON_RESUME) {if (!hasLogger || logger.approveCall("onResume", 1)) {mReceiver.onResume();}return;}if (event == Lifecycle.Event.ON_DESTROY) {if (!hasLogger || logger.approveCall("onDestroy", 1)) {mReceiver.onDestroy();}return;}}
}

给大家的问题

  1. ReflectiveGenericLifecycleObserver使用了反射机制类调用方法,为了减少反射带来的性能问题,它做了哪些优化?
  2. 我们写的HomeObserver中onCreate方法的参数有哪些限制?为什么
  3. 使用推荐写法时Lifecycling.getCallback(observer);返回的类型是什么?为什么?
  4. 使用推荐写法时到底有没使用到反射?

Android Lifecycle源码解析(一)相关推荐

  1. Lifecycle 源码解析(2.4.1 版本)

    文章目录 1.Lifecycle 简介 2.Lifecycle 配置与基本用法 2.1 依赖引入与配置 2.2 基本用法 2.2.1 Lifecycle 简单使用 2.2.2 普通 Activity ...

  2. 【Android】Android Broadcast源码解析

    Android Broadcast源码解析 一.静态广播的注册 静态广播是通过PackageManagerService在启动的时候扫描已安装的应用去注册的. 在PackageManagerServi ...

  3. Android xUtils3源码解析之图片模块

    本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...

  4. 【Android】Android Parcelable 源码解析

    Android Parcelable 源码解析 大家都知道,要想在Intent里面传递一些非基本类型的数据,有两种方式,一种实现Parcelable,另一种是实现Serializable接口.今天先不 ...

  5. Android xUtils3源码解析之注解模块

    本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...

  6. Android xUtils3源码解析之数据库模块

    本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...

  7. [Android] Handler源码解析 (Java层)

    之前写过一篇文章,概述了Android应用程序消息处理机制.本文在此文基础上,在源码级别上展开进行概述 简单用例 Handler的使用方法如下所示: Handler myHandler = new H ...

  8. android sdk 源码解析

    AndroidSdkSourceAnalysis:https://github.com/LittleFriendsGroup/AndroidSdkSourceAnalysis 第一期 Class 分析 ...

  9. Android LayoutInflater源码解析:你真的能正确使用吗?

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 好久没写博客了,最近忙着换工作,没时间写,工作刚定下来.稍后有时间会写一下换工作经历.接下来进入本篇主题,本来没想写LayoutInflater的 ...

最新文章

  1. linux网络编程socket,Linux网络编程入门
  2. 【PHP 面试知识梳理】
  3. Wireshark零基础使用教程(超详细)
  4. 服务器性能监控论文,服务器性能监控系统(本科毕业论文)
  5. python 更新pip报错 解决方法大全
  6. uni-app知识点整理(1)- uni-app简介、环境搭建、项目创建、项目目录文件
  7. svg 地图_用于Power BI的SVG省市地图(带数据标签,含下载)
  8. MATLAB强化学习实战(十) 多智能体的路径跟随控制
  9. 个人邮箱地址格式,如何能够正确的书写?
  10. python拦截游戏封包_【求助】关于pygame封包问题
  11. 网站关键词优化工具,网站关键词排名优化工具免费
  12. android跑马灯监听,android跑马灯成效
  13. 10计算机网络需要密码是多少钱,Win10宽带连接不用每次都要输入密码的办法
  14. 干掉Google Base? 微软欲推Fremont服务 (转自donews.com)
  15. java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...
  16. oracle导入多个dmp文件到一个用户,Oracle dmp文件导入(还原)到不同的表空间和不同的用户下...
  17. 真机调试Error type 3 Error: Activity class {com.example.xxxxxx/com.example.xxxx}does not exist
  18. 计算机如何高效识别图像?
  19. Linux系统ORACLE 19C OEM监控管理
  20. 有人云网络IO控制器 对接私有服务器

热门文章

  1. 【机器学习算法专题(蓄力计划)】十八、机器学习中SVM算法中的硬间隔和软间隔
  2. 五十六、从高中碾转相除法、更相减损术算法谈起
  3. 机器学习这四个东西,你知道吗?
  4. 40万总奖金!顶级云服务免费用!2021全球高性能云计算创新大赛报名中!
  5. 巧断梯度:单个loss实现GAN模型(附开源代码)
  6. 第二届Byte Cup来袭,赢得2万美元奖金,登上字节跳动面试直通车
  7. 2018【比特杯】编程大赛
  8. pagehelper 不分页几种情况的解决方法
  9. JavaScript基础学习之运算符(三)
  10. 分析约瑟夫问题(循环单链表)