Android Lifecycle源码解析(一)
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中了,以一张流程图总结下
接下来我们看下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;}}
}
给大家的问题
- ReflectiveGenericLifecycleObserver使用了反射机制类调用方法,为了减少反射带来的性能问题,它做了哪些优化?
- 我们写的HomeObserver中onCreate方法的参数有哪些限制?为什么
- 使用推荐写法时Lifecycling.getCallback(observer);返回的类型是什么?为什么?
- 使用推荐写法时到底有没使用到反射?
Android Lifecycle源码解析(一)相关推荐
- Lifecycle 源码解析(2.4.1 版本)
文章目录 1.Lifecycle 简介 2.Lifecycle 配置与基本用法 2.1 依赖引入与配置 2.2 基本用法 2.2.1 Lifecycle 简单使用 2.2.2 普通 Activity ...
- 【Android】Android Broadcast源码解析
Android Broadcast源码解析 一.静态广播的注册 静态广播是通过PackageManagerService在启动的时候扫描已安装的应用去注册的. 在PackageManagerServi ...
- Android xUtils3源码解析之图片模块
本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...
- 【Android】Android Parcelable 源码解析
Android Parcelable 源码解析 大家都知道,要想在Intent里面传递一些非基本类型的数据,有两种方式,一种实现Parcelable,另一种是实现Serializable接口.今天先不 ...
- Android xUtils3源码解析之注解模块
本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...
- Android xUtils3源码解析之数据库模块
本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...
- [Android] Handler源码解析 (Java层)
之前写过一篇文章,概述了Android应用程序消息处理机制.本文在此文基础上,在源码级别上展开进行概述 简单用例 Handler的使用方法如下所示: Handler myHandler = new H ...
- android sdk 源码解析
AndroidSdkSourceAnalysis:https://github.com/LittleFriendsGroup/AndroidSdkSourceAnalysis 第一期 Class 分析 ...
- Android LayoutInflater源码解析:你真的能正确使用吗?
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 好久没写博客了,最近忙着换工作,没时间写,工作刚定下来.稍后有时间会写一下换工作经历.接下来进入本篇主题,本来没想写LayoutInflater的 ...
最新文章
- linux网络编程socket,Linux网络编程入门
- 【PHP 面试知识梳理】
- Wireshark零基础使用教程(超详细)
- 服务器性能监控论文,服务器性能监控系统(本科毕业论文)
- python 更新pip报错 解决方法大全
- uni-app知识点整理(1)- uni-app简介、环境搭建、项目创建、项目目录文件
- svg 地图_用于Power BI的SVG省市地图(带数据标签,含下载)
- MATLAB强化学习实战(十) 多智能体的路径跟随控制
- 个人邮箱地址格式,如何能够正确的书写?
- python拦截游戏封包_【求助】关于pygame封包问题
- 网站关键词优化工具,网站关键词排名优化工具免费
- android跑马灯监听,android跑马灯成效
- 10计算机网络需要密码是多少钱,Win10宽带连接不用每次都要输入密码的办法
- 干掉Google Base? 微软欲推Fremont服务 (转自donews.com)
- java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...
- oracle导入多个dmp文件到一个用户,Oracle dmp文件导入(还原)到不同的表空间和不同的用户下...
- 真机调试Error type 3 Error: Activity class {com.example.xxxxxx/com.example.xxxx}does not exist
- 计算机如何高效识别图像?
- Linux系统ORACLE 19C OEM监控管理
- 有人云网络IO控制器 对接私有服务器