Android Architecture Components 源码分析

Android Architecture Components 源码分析

本文已授权我就是马云飞公众号独家发布。

说是源码分析有点,其实就是简单的根据源码梳理一遍整体的LiveData,ViewModel和Lifecycle各个部分是如何工作的,由于本人水平有限,如果文中有错误的地方,欢迎指正。

Android Architecture Components 源码分析系列文章

  1. Android Architecture Components 第一篇,介绍生命周期的感知。
  2. Android Architecture Components 第二篇,介绍ViewModel的控制。
  3. Android Architecture Components 第三篇,介绍LiveDate和LifeRegistry的协同操作。

最近这几天一直在研究官方的MVVM的实现,使用起来其实难度并不大,并且如果结合DataBinding和Dagger2 代码写的都要飞起来了,不要太好。不过我们不能仅仅停留在使用的层面上,了解每个部分是如何工作的,探索官方的实现方式,这样技术才能进步,看源码的过程中我们可以带着几个问题去探索:

  1. Lifecycle是如何感知到Activity/Fragment的生命周期的?
  2. ViewModel的生命周期是如何控制。
  3. LiveData中的数据是如何根据Lifecycle生命周期进行通知的?

预计会写三篇文章,分别介绍上面的技术关键点,首先先来介绍Lifecycle是如何感知Activity/Fragment生命周期的。

MVP时代感知生命周期的做法

众所周知,在使用MVP的时候,需要关联View的生命周期,在那个时候,生命周期的控制经历了几个阶段,从最开始官方Demo中的attach和detach,通过Activity或者Fragment中生命周期函数去关联Presenter,之后又有判断View是否是Active的来决定是否去更新UI,这都是通过简单的代码控制Presenter中更新UI的动作是否执行。再后来就是RxLifecycle,也是因为Retrofit和RxJava的兴起,我们可以将Presenter中的动作变成一个流事件,这样可以根据RxJava的特性通过解除订阅的方式来控制Presenter中的更新UI的动作。这又会分为两种,根据RxJava的版本不同,RxJava1和RxJava2的解除订阅的方式不一样。当然每个写MVP的童鞋都会有自己的生命周期控制的方式,不过个人觉得还是通过RxLifecycle的方式会更好一些,因为可以细微控制到每一个生命周期函数,更进一步的,组里的一个童鞋参考RxLifecycle的方式加进去了一些其他的生命周期,比如Dialog的显示和消失,当Dialog消失的时候取消订阅,这都是我们可以细粒化去控制的,那么在新的MVVM中的生命周期的控制是如何实现的呢?

MVVM时代感知生命周期的做法

其实在官方的MVVM没有出现之前,相信肯定会有民间大神自己实现了的MVVM,虽然我没有找到相关的发表的文章,不过我看见过通过自己编写代码实现的MVVM,简单来说就是有一个MVVMViewModel接口,里面包含了所有的生命周期回调的方法,然后在Activity/Fragment的各个生命周期函数中调用。这样就实现了生命周期的传递,当然了这只是简单的介绍能够实现MVVM的其中一种方式,通过函数的传递性来控制生命周期。接下来就是本文的重点了, 官方的MVVM是如何实现的生命周期控制的那?

官方MVVM感知生命周期的做法

首先如果从我们自己写的MVVM的代码中是找不到生命周期控制的部分的。昨天偶然间看到了使用ContentProvider初始化你的ibrary ,作者说到的ContentProvider初始化,然后看了一眼编译过的apk

果然多了一个ContentProvider,其实生命周期的控制就是通过这个Provider来实现的。

可以看到,第一个LifecycleDispatcher.init()就是初始化生命周期控制的方法。下面的那个是整个项目的LifecycleOwner,暂时不去研究它。
接下来看初始化的时候都做了什么?

通过一个AtomicBoolean来控制初始化一次,之后就获取ApplicationContext并设置ActivityLifecycleCallback回调。这个函数其实在之前我们就使用过,比如退出app啊,或者是一些简单的打点操作的时候会使用。接下来看看DispatcherActivityCallback是什么?

构造函数创建了一个FragmentCallback,用于设置Fragment生命周期的回调,然后在onActivityCreated的时候注入了一个ReportFragment到当前的Activity。看一下Reporefragment是做什么用的。

首先将这个Fragment添加到当前的Activity中,这样这个Fragment就拥有和Activity一样的生命周期,之后在当前Fragment的生命周期函数中通过dispatch对应的Lifecycle.Event,把当前的生命周期分发到对应的LifecycleOwner中。

通过给Activity/Fragment添加额外的fragment,来获取当前的Activity/Fragment的生命周期的这种方式,在之后同样会遇到,是一种很巧妙的方式解决了生命周期的监听。在ReportFragmt中还看到了mProcessListener这个对象是用于控制整个项目的生命周期的。有兴趣的同学可以仔细看一下,并不难。

这是Activity的生命周期传递,同样的Fragment跟Activity并无区别,代码都在LifecycleDispatcher中。

总结

通过添加额外的fragment的形式来获取当前的Activity/Fragment的生命周期。然后判断当前的Activity/Fragment是否是LifecycleRegistryOwner,如果是的话,那么就分发当前的生命周期事件到当前的Owner中,这样就实现了生命周期传递。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容