Android Architecture LifeCycle

Android官网最近推出了一个新的app程序框架,虽然目前正处于alpha阶段,还未正式发布,但其中的实现原理和想法还是有必要先进行学习的,首先就来看看新框架对于LifeCycle的处理。

相信Android开发者最头疼的问题之一就是android提供的组件(Activity,Fragment)包含了大量的生命周期,并且系统会自动对生命周期进行管理,稍不留神(应用退到后台或者资源紧缺)就会对相应组件进行回收,导致组件状态丢失。

在新的框架中,提供了一套对于生命周期进行管理的方法,接下来看看具体的实现过程。

一、实现示例

按照官网上的示例,我们首先需要实现了LifecycleObserver的类:

然后在继承于LifecycleActivity的Activity中addObserver();

就这样,MyLocationListener就已经和MainActivity的生命周期进行了绑定。

二、LifecycleRegistry是什么

可以看到getLifecycle()返回的就是LifecycleRegistry,LifecycleRegistry继承于Lifecycle,Lifecycle是个抽象类,提供了注册和删除LifecycleObserver的方法,同时提供了进行生命周期描述的Enum类。从方法的命名中可以想到,有点类似于采用了观察者模式,对于注册的对象在特定条件进行回调。

接下来看看LifecycleRegistry是如何实现addObserver()的;

可以看到,首先实现一个ObserverWithState的对象,然后调用该对象的sync()方法;

sync()方法的作用其实就是当绑定的Activity或Fragment生命周期改变时,触发绑定的listener进行回调。

那么mCallback是如何绑定到对应的Listener的呢?

三、GenericLifecycleObserver

mCallback的类名是GenericLifecycleObserver,是通过Lifecycling.getCallback()方法实现的。

可以看到真正示例化的方法是getGeneratedAdapterConstructor(klass)这方法;

看到Class.forName()方法,就知道采用的是反射来找到相应的类,不过通过getAdapterName()已经修改了要反射的类名,但我们并没有写过结束带"_LifecycleAdapter"字符串的类,去哪里能找到这类呢?

别忘了我们在dependencies中引入了这一句,会不会是通过apt生成的?

annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha3"

顺藤摸瓜,果然在build目录对应文件夹下会生成MyLocationListener_LifecycleAdapter类。

再看看它的实现,原来我们先前声明的@OnLifecycleEvent都会生成对应的代码。

到目前我们已经理顺了事件处理的流程。但另外一个问题来了,这些事件是从哪里发出来的呢?

四、Event触发源

我们知道Event处理是通过调用LifecycleRegistry的handleLifecycleEvent()来实现的,顺藤摸瓜,哪里会调用handleLifecycleEvent()方法呢?

在android.arch.lifecycle.ReportFragment中,我们找到了调用handleLifecycleEvent()方法的地方。ReportFragment继承Fragment,通过Fragment的生命周期来达到对绑定Listener生命周期的管理。这好像有点似曾相识,不错,在Glide里边,Activity或Fragment也是通过这样的方法,通过示例化一个没有ui的fragment,对相应事件的生命周期进行管理。

那么ReportFragment是插入到相应的Activity或Fragment当中的呢?

找到LifecycleDispatcher这个类,原来是通过监听ActivityLifecycleCallbacks来实现对应的绑定的,在onActivityCreated()的回调中插入ReportFragment。

到这里大概流程都已经全部走通了,Event的触发源就是通过绑定的ReportFragment在对应生命周期的回调中触发的。

那么最后一个问题,LifecycleDispatcher的init()方法何时执行的呢?

五、LifecycleDispatcher何时启动

启动的地方是一个叫LifecycleRuntimeTrojanProvider的类,该类继承于ContentProvider,并且该类除了在onCreate()方法里有实现,其他的都没意义。

为什么要继承ContentProvider呢,因为ContentProvider会在程序启动的时候默认先执行,这样在程序启动的最开始,对于生命周期的管理就已经开始了。

我们在最终生成的manifest.xml里边也找到了该类。

至此,整个框架对于生命周期的管理流程已经全部分析结束。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,790评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,411评论 2 45
  • 偶感凉意 枯叶为你披上 深浅深的黄披肩 那就是一幅爱着你的画面 充满笑声的秋 秋风时不时来给你一个吻 枯叶上 我看...
    琴柠阅读 153评论 0 0
  • 论文:https://arxiv.org/pdf/1506.01497v3.pdf代码:https://githu...
    薛子育阅读 907评论 0 0
  • 刚刚过去的中秋节又刺激了我一把。 说说我身边的人吧。 我老公的弟弟和弟媳回家过节。弟弟是国防生,毕业很幸运地分到了...
    纪小畅阅读 357评论 1 0