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里边也找到了该类。
至此,整个框架对于生命周期的管理流程已经全部分析结束。