源码之 LifeCycleOwner
文章目录
- 1、疑问
- 2、分析
- Activity 和 Fragment 都实现了 LifecycleOwner 接口
1、疑问
- 如何通过实现 LifeCycleOwner 接口,使 LiveData 能观察到 Activity/Fragment 的生命周期变化?
2、分析
- 以 ComponentActivity 为例
@RestrictTo(LIBRARY_GROUP)
public class ComponentActivity extends Activity implements LifecycleOwner {...private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);// 1@Override@SuppressWarnings("RestrictedApi")protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);ReportFragment.injectIfNeededIn(this);// 2}@CallSuper@Overrideprotected void onSaveInstanceState(Bundle outState) {mLifecycleRegistry.markState(Lifecycle.State.CREATED);// 3super.onSaveInstanceState(outState);}@Overridepublic Lifecycle getLifecycle() {return mLifecycleRegistry;// 4}...
}
- 2:onCreate 方法,调用了 ReportFragment.injectIfNeededIn
- 3:onSaveInstanceState,调用了 LifecycleRegistry.markState
2:onCreate——ReportFragment.injectIfNeededIn
@RequiresApi(29)
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {static void registerIn(Activity activity) {activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());}@Overridepublic void onActivityCreated(@NonNull Activity activity,@Nullable Bundle bundle) {}@Overridepublic void onActivityPostCreated(@NonNull Activity activity,@Nullable Bundle savedInstanceState) {dispatch(activity, Lifecycle.Event.ON_CREATE);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {}@Overridepublic void onActivityPostStarted(@NonNull Activity activity) {dispatch(activity, Lifecycle.Event.ON_START);}@Overridepublic void onActivityResumed(@NonNull Activity activity) {}@Overridepublic void onActivityPostResumed(@NonNull Activity activity) {dispatch(activity, Lifecycle.Event.ON_RESUME);}@Overridepublic void onActivityPrePaused(@NonNull Activity activity) {dispatch(activity, Lifecycle.Event.ON_PAUSE);}@Overridepublic void onActivityPaused(@NonNull Activity activity) {}@Overridepublic void onActivityPreStopped(@NonNull Activity activity) {dispatch(activity, Lifecycle.Event.ON_STOP);}@Overridepublic void onActivityStopped(@NonNull Activity activity) {}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity,@NonNull Bundle bundle) {}@Overridepublic void onActivityPreDestroyed(@NonNull Activity activity) {dispatch(activity, Lifecycle.Event.ON_DESTROY);}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {}
}
在生命周期的回调中,都调用了 dispatch 方法
调用了 LifeCycleRegister.handleLifecycleEvent 方法
moveToState:负责更新到最新状态
sync:根据当前状态和 mObserverMap 中的 eldest 和 newest 的状态做对比 ,判断当前状态是向前 forwardPass 还是向后 backwardPass,在这两个方法内部都调用了其静态内部类 ObserverWithState.dispatchEvent 方法
在 ObserverWithState.dispatchEvent 方法中,会调用 LifecycleEventObserver.onStateChanged 方法
现在,我们需要去追溯在这里,LifecycleEventObserver 接口具体的实现类是谁?
- ObserverWithState 的初始化的唯一地方在 LifecycleRegistry.addObserver 方法中
- LifecycleRegistry.addObserve,在 LiveData.observe 中被调用
- 由上诉可得出,ObserverWithState.mLifecycleObserver 指的是 LifecycleBoundObserver。故最后会执行到 LifecycleBoundObserver.onStateChanged 方法
- activeStateChanged 最后会调用到 considerNotify 分发数据
让我们再看看3:ComponentActivity.onSaveInstanceState
- 后续执行过程同上
源码之 LifeCycleOwner相关推荐
- Android Jetpack组件之 LiveData使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack 组件之 Lifecycle源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- glide源码中包含了那种设计模式_推荐一个好用的拍照选图库,致敬Glide
本文作者 作者:思忆_GeorgeQin 链接: https://juejin.cn/post/6907620425837051917 本文由作者授权发布. 1内容提要 本文内容较长,包含一个功能整个 ...
- Android Lifecycle源码解析(一)
Android Lifecycle源码解析(一) 首先我们看HomeActivity中我们添加到一行代码 public class HomeActivity extends AppCompatActi ...
- android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)
在上篇文章: warmcheng:Android生命周期组件 Lifecycle 使用详解zhuanlan.zhihu.com 中,我们讲了 Lifecycle 的简单使用,本篇我们来研究下它的源码 ...
- LifeCycle源码解读
对于LifeCycle的简单使用可以看上一篇文章:LiveData+ViewModel+Repository搭建MVVM 这篇文章主要是为了阅读源码,尽量深入阅读,能力还是一般,见谅: LifeCyc ...
- activity 点击后传递数据给fragment_Fragment 新特性 : Fragment Result API 使用以及源码分析
原标题: Android Fragments: Fragment Result 原文地址: https://proandroiddev.com/android-fragments-fragment-r ...
- LiveData 源码解析(2.4.1 版本)
文章目录 1.LiveData 简介 2.LiveData 配置与基本用法 2.1 依赖引入与配置 2.2 基本用法 2.2.1 LiveData 简单使用 2.2.2 LiveData 扩展 2.2 ...
- Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理
一.Lifecycle 介绍 Lifecycle是一个生命周期感知组件,一般用来响应Activity.Fragment等组件的生命周期变化,并将变化通知到已注册的观察者.有助于更好地组织代码,让代码逻 ...
最新文章
- python gui打包exe pyinstaller打包运行失败 Failed to execute script pyi_rth_multiprocessing
- SQLite 附加数据库(http://www.w3cschool.cc/sqlite/sqlite-attach-database.html)
- swift5导航栏标题文字属性设置
- 连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库
- vue 移动到图片浮动_基于Vue实现图片在指定区域内移动
- 【洛谷P1795 无穷的序列_NOI导刊2010提高(05)】模拟
- dex2jar和jd-GUI的下载安装与使用
- 计算机操作系统|汤小丹|第四版|习题答案(三)
- 模型预测控制的缺点_一个模型预测控制(MPC)的简单实现
- IDW空间插值法matlab,基于IDW对PM2.5进行空间插值及可视化
- 计算机考研专业课靠什么意思,计算机考研专业课831什么意思???
- TypeScript 简介
- Unity 托管内存(Managed Memory)
- Mac 重启后,连接不上wifi
- 经典面试题【老鼠喝水】
- 英雄联盟爬取不同英雄皮肤
- android 角标框架,Android 实现桌面未读角标
- 《攻防世界》forgot栈空间题
- 从商品溯源到历史载录,区块链技术的革新
- kafka安装部署详解
热门文章
- cmnet是什么 cmnet是什么意思?cmnet和cmwap的区别在哪里
- 关于灰色关联分析以及灰色预测初步理解
- 探讨Vue 数据监测原理-第四节-Vue.Set() API 介绍应用
- android 爬虫获取邮箱,python爬虫源码学习:爬虫smtp邮件实时推送(2)
- springboot集成cas3.5.2
- win10安装mujoco
- cayina计算机主板怎么改路线,七彩虹计算机主板biOs设置(图文).doc
- 计算机专业top500,超级计算机TOP500最新名单公布
- 唐福林:新浪微博的Redis大数据之路
- SharePoint Server 2007 简体中文下载