LifeCycle源码解读

对于LifeCycle的简单使用可以看上一篇文章:LiveData+ViewModel+Repository搭建MVVM

这篇文章主要是为了阅读源码,尽量深入阅读,能力还是一般,见谅:

LifeCycle的作用

解决onCreate等生命周期方法,由于各种原因,后期越来越臃肿的问题。

关键类阐述

LifecycleRegistryOwner/LifecycleOwner

在Activity等组件生命周期发生变化的时候,发出相应的Event给LifecycleRegistry。

LifecycleRegistry

控制state的转换、接受分发Event事件。

LifecycleObserver

通过注解绑定Event和自定义的函数,实现对生命周期的监听并处理。

Event

@SuppressWarnings("WeakerAccess")
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
}
复制代码

源码分析

依赖库版本:implementation "android.arch.lifecycle:extensions:1.1.1"

项目地址:github.com/fengqingxiu…

入口

getLifecycle().addObserver(new ActivityLifecycleObserver(getApplicationContext()));
复制代码

进入addObserver

@Override
public void addObserver(@NonNull LifecycleObserver observer) { //这里的LifecycleObserver就是我们自定义的ActivityLifecycleObserverState initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;//把带着状态的observer封装成ObserverWithStateObserverWithState statefulObserver = new ObserverWithState(observer, initialState);ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);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--;
}
复制代码

进入ObserverWithState

static class ObserverWithState {State mState;GenericLifecycleObserver mLifecycleObserver;ObserverWithState(LifecycleObserver observer, State initialState) {//通过不同的observer返回不同的mLifecycleObservermLifecycleObserver = 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;}
}
复制代码

进入getCallback

@NonNull
static GenericLifecycleObserver getCallback(Object object) {if (object instanceof FullLifecycleObserver) {return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);}if (object instanceof GenericLifecycleObserver) {return (GenericLifecycleObserver) object;}final Class<?> klass = object.getClass();int type = getObserverConstructorType(klass);if (type == GENERATED_CALLBACK) {List<Constructor<? extends GeneratedAdapter>> constructors =sClassToAdapters.get(klass);if (constructors.size() == 1) {GeneratedAdapter generatedAdapter = createGeneratedAdapter(constructors.get(0), object);return new SingleGeneratedAdapterObserver(generatedAdapter);}GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];for (int i = 0; i < constructors.size(); i++) {adapters[i] = createGeneratedAdapter(constructors.get(i), object);}return new CompositeGeneratedAdaptersObserver(adapters);}return new ReflectiveGenericLifecycleObserver(object); //走到了这里
}
复制代码

进入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); //这里:通过反射实现事件分发}
}
复制代码

那么是在哪里调用onStateChanged的呢?下面我们继续分析:

LifecycleDispatcher

When initialized, it hooks into the Activity callback of the Application and observes Activities. It is responsible to hook in child-fragments to activities and fragments to report their lifecycle events. Another responsibility of this class is to mark as stopped all lifecycle providers related to an activity as soon it is not safe to run a fragment transaction in this activity.

第一次冷启动App的时候会通过ActivityThread创建,并且之后会在Activity创建的时候,添加ReportFragment去实现生命周期事件的分发,下面看下源码:

@SuppressWarnings("WeakerAccess")
@VisibleForTesting
static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {//省略...@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {if (activity instanceof FragmentActivity) {((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentCallback, true);}ReportFragment.injectIfNeededIn(activity); //这里添加了ReportFragment}//省略...
}
复制代码

进入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";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();}}static ReportFragment get(Activity activity) {return (ReportFragment) activity.getFragmentManager().findFragmentByTag(REPORT_FRAGMENT_TAG);}private ActivityInitializationListener mProcessListener;private void dispatchCreate(ActivityInitializationListener listener) {if (listener != null) {listener.onCreate();}}private void dispatchStart(ActivityInitializationListener listener) {if (listener != null) {listener.onStart();}}private void dispatchResume(ActivityInitializationListener listener) {if (listener != null) {listener.onResume();}}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatchCreate(mProcessListener);dispatch(Lifecycle.Event.ON_CREATE); //这里分发事件,我们自定义的观察者定义的注解其实就是Lifecycle.Event.ON_CREATE这一类}@Overridepublic void onStart() {super.onStart();dispatchStart(mProcessListener);dispatch(Lifecycle.Event.ON_START);}@Overridepublic void onResume() {super.onResume();dispatchResume(mProcessListener);dispatch(Lifecycle.Event.ON_RESUME);}@Overridepublic void onPause() {super.onPause();dispatch(Lifecycle.Event.ON_PAUSE);}@Overridepublic void onStop() {super.onStop();dispatch(Lifecycle.Event.ON_STOP);}@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;}private void dispatch(Lifecycle.Event event) {Activity activity = getActivity();if (activity instanceof LifecycleRegistryOwner) {((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); //这里将事件分发交接给了LifecycleRegistryOwnerreturn;}if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); //这里将事件分发交接给了LifecycleRegistry}}}void setProcessListener(ActivityInitializationListener processListener) {mProcessListener = processListener;}interface ActivityInitializationListener {void onCreate();void onStart();void onResume();}
}
复制代码

进入handleLifecycleEvent

/*** 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); //获取下一个statemoveToState(next);
}
复制代码

这里借用官方的一张图(LifeCycle-States):

大概意思就是可以通过不同的Event知道不同的State。例如:当你的Event是ON_RESUME的时候就代表他当前的State是STARTED,所以Next State就是RESUMED,接着分析getStateAfter:

//对照着表其实很简单,events是ON_CREATE和ON_STOP的下一个状态指向都是CREATED,所以返回CREATED,其他的类似。
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);
}
复制代码

所以getStateAfter获取的是下一个State,也就是下一个生命周期。

进入moveToState

private void moveToState(State next) {//判断当前State是不是等于我们上面获取的if (mState == next) {return;}//不一样则重新赋值mState = next;if (mHandlingEvent || mAddingObserverCounter != 0) {mNewEventOccurred = true;// we will figure out what to do on upper level.return;}mHandlingEvent = true;sync(); //同步mHandlingEvent = false;
}// happens only on the top of stack (never in reentrance),
// so it doesn't have to take in account parents
private 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;}//当前的State和最早的State或最新的State进行比较,mObserverMap这个集合存放的是ObserverWithState,而ObserverWithState有我们的状态。 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); //继承Activity走这里}Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();if (!mNewEventOccurred && newest != null&& mState.compareTo(newest.getValue().mState) > 0) {forwardPass(lifecycleOwner); //继承FramgentActivity走这里,因为Activity的子类SupportActivity实现了LifecycleOwner,而且SupportActivity是FragmentActivity的父类}}mNewEventOccurred = false;
}private void forwardPass(LifecycleOwner lifecycleOwner) {Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =mObserverMap.iteratorWithAdditions();//第一个while循坏遍历我们存储观察者的集合while (ascendingIterator.hasNext() && !mNewEventOccurred) {Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();ObserverWithState observer = entry.getValue();//第二个是要处理各个状态经过的eventwhile ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred&& mObserverMap.contains(entry.getKey()))) {pushParentState(observer.mState);//upEvent返回所要经历的Event,例如:当前是STARTED, 那么他的经过的Event就是ON_RESUMEobserver.dispatchEvent(lifecycleOwner, upEvent(observer.mState)); //在这里分发事件popParentState();}}
}private void backwardPass(LifecycleOwner lifecycleOwner) {Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =mObserverMap.descendingIterator();//第一个while循坏遍历我们存储观察者的集合while (descendingIterator.hasNext() && !mNewEventOccurred) {Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();ObserverWithState observer = entry.getValue();//第二个是要处理各个状态经过的eventwhile ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred&& mObserverMap.contains(entry.getKey()))) {//downEvent返回下一个EventEvent event = downEvent(observer.mState);pushParentState(getStateAfter(event));//upEvent返回所要经历的Event,例如:当前是STARTED, 那么他的经过的Event就是ON_RESUMEobserver.dispatchEvent(lifecycleOwner, event); //在这里分发事件popParentState();}}
}
复制代码

进入dispatchEvent

static 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;}
}
复制代码

附上一个简单的流程图(图片来源于参考文章)

参考文章

  • Android新组件Lifecycle详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft SQL Server 2005 Service Pack 2 已经可以下载

下载地址为http://www.microsoft.com/downloads/details.aspx?FamilyIDd07219b2-1e23-49c8-8f0c-63fa18f26d3a&DisplayLangzh-cn嘿嘿,这么快就SP2了 转载于:https://www.cnblogs.com/lazerjulysky/archive/2007/03/04/663279.html

单点登录(sso)入门

单点登录的英文名叫做Single Sign On&#xff0c;简称SSO。 在以前&#xff0c;一般我们就单系统&#xff0c;所有的功能都在同一个系统上。 后来&#xff0c;我们为了合理利用资源和降低耦合性&#xff0c;于是把单系统拆分成多个子系统。 比如阿里系的淘宝和天猫&#xff0c;…

Cocopods的升级错误解决

2019独角兽企业重金招聘Python工程师标准>>> 写在前面&#xff1a; 这篇笔记的由来&#xff0c;是因为在这个周五下班后想起了之前 GitHub 上一个关于 iOS Charts 的 demo 仍处于未完待续的状态。便想着完成了它&#xff0c;遂打开了该工程&#xff0c;开始用 pod 更…

XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)

Dare Obasanjo Microsoft Corporation 2002 年 5 月 20 日 本文是有望长期发表的系列文章的第一篇&#xff0c;这些文章专门阐释由 Microsoft 支持的 W3C XML 技术的更微妙的内容。尽管 XML 的核心仍相当简单&#xff0c;但是围绕它的技术已经变得日益复杂&#xff0c;而且其中…

帆软报表(finereport)点击事件对话框打开

点击事件对话框打开iframe var iframe $("<iframe id001 name001 width100% height100% scrollingyes frameborder0>") // iframe参数的命名及宽高等iframe.attr("src", "http://192.168.100.17:8075/WebReport/ReportServer?reportlet1.cpt&…

部署虚拟环境

创建虚拟环境 导入Virtualenv虚拟环境模块 pip install virtualenv python -m pip install virtualenv 创建虚拟环境 cd 项目文件夹 virtualenv 虚拟环境名 激活虚拟环境 cd 虚拟环境文件夹 运行 Scripts 目录下的 activate 脚本 Scripts\activate 退出当前虚拟环境 Scripts\d…

走马观花:Visual Studio Code Name Orcas Mar07CTP /体验DLINQ

不知道什么叫“Orcas”&#xff1f;简单说应该就是下一版本的Visual Studio 吧。现在atlas&#xff0c;LINQ&#xff0c;WF之类东西&#xff0c;对于VS2005是单独安装的&#xff0c;Orcas应该是全内置吧。还有很多功能的增强&#xff0c;可以参考英文说明。闲话不说&#xff0c…

各种学习资源

C&#xff1a;http://huangdingjun.blog.163.com/ 网易博客 有好多关于C的博文 http://hi.baidu.com/dudiaodaoke/home独钓刀客 vim&#xff1a;http://easwy.com/blog/ vim linux 牛人 http://www.swaroopch.com/notes/Vim_zh-cn:%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E7%BC…

智课雅思词汇---二十六、形容词后缀-ble

智课雅思词汇---二十六、形容词后缀-ble 一、总结 一句话总结&#xff1a; assemble 英 [əsemb(ə)l] 美 [əsɛmbl] vt. 集合&#xff0c;聚集&#xff1b;装配&#xff1b;收集vi. 集合&#xff0c;聚集[ 过去式 assembled 过去分词 assembled 现在分词 assembling ] 词根词…

[导入]C#实现Des加密和解密

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/24/1540018.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/25/816385.html

帆软报表(finereport)图表钻取详细类别 当前页对话框展示

添加参数栏&#xff0c;季度下拉框的控件命名为 jd 这里添加雷达图做案例 编辑→特效→ 添加JavaScript 参数&#xff1a;wd 值&#xff1a;分类名 #取雷达图所点击的点 参数&#xff1a;jd 值&#xff1a;公式$jd #取参数下拉所选参数 JavaScript详细: var if…

聊聊storm的PartialKeyGrouping

序 本文主要研究一下storm的PartialKeyGrouping 实例 Testpublic void testPartialKeyGrouping() throws InvalidTopologyException, AuthorizationException, AlreadyAliveException {String spoutId "wordGenerator";String counterId "counter";Strin…

ArcGIS Server安装的几个问题

今天安装 了ArcGIS Server &#xff0c;本来一直不愿意装这么“重”的东西&#xff0c;不过新事物还是要看看。安装没有出很大的问题&#xff0c;基本上一次成功&#xff0c;比很久前&#xff08;大概要到03年了吧&#xff09;第一次装ArcIMS要好多了&#xff0c;那次可是重装…

大数据之MySql笔记-0916

2019独角兽企业重金招聘Python工程师标准>>> 复习: 1.MySQL部署 拓展题: rm -rf $MYSQL_HOME/arch/* binlog日志 恢复 主从同步 rm -rf $MYSQL_HOME/data/* 数据 $MYSQL_HOME/scripts/mysql_install_db \ --usermysqladmin \ --basedir/usr/local/mysql \ --dat…

delphi调用c#写的webservice中文出现乱码的问题

解决方法&#xff1a;HTTPRIO1的属性---HttpWebNode--UseUtf8InHeader设置为true 代码片断&#xff1a; function TLoginManager.Get_LoginManagerSoap: ILoginManagerSoap; const defSvcLoginManager; defPrtLoginManagerSoap; var RIO: THTTPRIO; begin Result: nil…

浮浮沉沉的上海

来到上海已经快有一年&#xff0c;抱着学习的心态来的&#xff0c;却发现忘掉了更多&#xff0c;最近一直在回顾&#xff0c;总想把冷却的技能重新拾回来&#xff0c;却也发现不简单。刚刚从餐北斗辞职&#xff0c;也正如朋友所说&#xff0c;趁早走&#xff0c;再迟一点&#…

GridView的操作大全

一、GridView和DataGrid的异同 GridView 是 DataGrid的后继控件&#xff0c;在.net framework 2 中&#xff0c;虽然还存在DataGrid&#xff0c;但是GridView已经走上了历史的前台&#xff0c;取代DataGrid的趋势已是势不可挡。GridView和DataGrid功能相似&#xff0c;都是在we…

Sql Server设置用户只能查看并访问特定数据库

1.新建登录用户 以管理员身份登陆数据库&#xff08;权限最高的身份如sa&#xff09;&#xff0c;点击安全性->登录名&#xff0c;右键新建登录名&#xff0c;输入登录名和密码&#xff0c;取消强制实施密码策略。 2.将服务器角色设置为public 注意&#xff1a;很重要的一…

arcgis jsapi接口入门系列(6):样式

2019独角兽企业重金招聘Python工程师标准>>> symbol: function () {//线样式//样式详情请看官方文档let style {//线颜色&#xff0c;支持多种格式&#xff1a;//CSS color string&#xff1a;例如"dodgerblue";//HEX&#xff1a;例如"#33cc33"…

ORM(四)应用.脚本管理工具

ORM(四)应用.脚本管理工具数据脚本的维护,不知道各位有什么好的工具推荐没有,由于以前一直是用手工来进行脚本的维护操作,很麻烦,而且容易出错.大多数时候,都在原来的基础上进行直接修改.今天有点时间就完成了一个简陋的工具,也是对ORM组件的应用.下面是程序的运行界面http://f…