文章目录

  • 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相关推荐

  1. Android Jetpack组件之 LiveData使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  2. Android Jetpack 组件之 Lifecycle源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  3. glide源码中包含了那种设计模式_推荐一个好用的拍照选图库,致敬Glide

    本文作者 作者:思忆_GeorgeQin 链接: https://juejin.cn/post/6907620425837051917 本文由作者授权发布. 1内容提要 本文内容较长,包含一个功能整个 ...

  4. Android Lifecycle源码解析(一)

    Android Lifecycle源码解析(一) 首先我们看HomeActivity中我们添加到一行代码 public class HomeActivity extends AppCompatActi ...

  5. android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)

    在上篇文章: warmcheng:Android生命周期组件 Lifecycle 使用详解​zhuanlan.zhihu.com 中,我们讲了 Lifecycle 的简单使用,本篇我们来研究下它的源码 ...

  6. LifeCycle源码解读

    对于LifeCycle的简单使用可以看上一篇文章:LiveData+ViewModel+Repository搭建MVVM 这篇文章主要是为了阅读源码,尽量深入阅读,能力还是一般,见谅: LifeCyc ...

  7. activity 点击后传递数据给fragment_Fragment 新特性 : Fragment Result API 使用以及源码分析

    原标题: Android Fragments: Fragment Result 原文地址: https://proandroiddev.com/android-fragments-fragment-r ...

  8. LiveData 源码解析(2.4.1 版本)

    文章目录 1.LiveData 简介 2.LiveData 配置与基本用法 2.1 依赖引入与配置 2.2 基本用法 2.2.1 LiveData 简单使用 2.2.2 LiveData 扩展 2.2 ...

  9. Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理

    一.Lifecycle 介绍 Lifecycle是一个生命周期感知组件,一般用来响应Activity.Fragment等组件的生命周期变化,并将变化通知到已注册的观察者.有助于更好地组织代码,让代码逻 ...

最新文章

  1. python gui打包exe pyinstaller打包运行失败 Failed to execute script pyi_rth_multiprocessing
  2. SQLite 附加数据库(http://www.w3cschool.cc/sqlite/sqlite-attach-database.html)
  3. swift5导航栏标题文字属性设置
  4. 连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库
  5. vue 移动到图片浮动_基于Vue实现图片在指定区域内移动
  6. 【洛谷P1795 无穷的序列_NOI导刊2010提高(05)】模拟
  7. dex2jar和jd-GUI的下载安装与使用
  8. 计算机操作系统|汤小丹|第四版|习题答案(三)
  9. 模型预测控制的缺点_一个模型预测控制(MPC)的简单实现
  10. IDW空间插值法matlab,基于IDW对PM2.5进行空间插值及可视化
  11. 计算机考研专业课靠什么意思,计算机考研专业课831什么意思???
  12. TypeScript 简介
  13. Unity 托管内存(Managed Memory)
  14. Mac 重启后,连接不上wifi
  15. 经典面试题【老鼠喝水】
  16. 英雄联盟爬取不同英雄皮肤
  17. android 角标框架,Android 实现桌面未读角标
  18. 《攻防世界》forgot栈空间题
  19. 从商品溯源到历史载录,区块链技术的革新
  20. kafka安装部署详解

热门文章

  1. cmnet是什么 cmnet是什么意思?cmnet和cmwap的区别在哪里
  2. 关于灰色关联分析以及灰色预测初步理解
  3. 探讨Vue 数据监测原理-第四节-Vue.Set() API 介绍应用
  4. android 爬虫获取邮箱,python爬虫源码学习:爬虫smtp邮件实时推送(2)
  5. springboot集成cas3.5.2
  6. win10安装mujoco
  7. cayina计算机主板怎么改路线,七彩虹计算机主板biOs设置(图文).doc
  8. 计算机专业top500,超级计算机TOP500最新名单公布
  9. 唐福林:新浪微博的Redis大数据之路
  10. SharePoint Server 2007 简体中文下载