Fragment与Activity生命周期交织
最近正好复习到这个地方了,又将之前的笔记整理了下,那今天就迁移这一篇吧。写完这个又得去做仿真了。。
首先Fragment完整生命周期的官图镇楼 (图片来自官网)
先从静态加载Fragment的过程谈起
以上是静态加载Fragment的时候,Fragment和Activity生命周期方法交织调用的顺序图,真是超长。但是我们也可看出一些原则:
1. 在来到前台之前,即onResume之前,总是Fragment先完成其方法的调用,然后是Activity调用自己的声明周期方法。或者也可以说,在onResume之前,总是Fragment先准备好,但是在来到前台的那一刻,Activity却抢在了Fragment的前面。
2. 在离开前台的时候,总是Fragment先离开。
再看看动态加载Fragment时的情况
对于动态加载的Fragment,细分为两种情况,一种是随Activity启动的时候使用动态加载,另一种是activity启动之后使用动态加载。
随Activity启动的时候使用动态加载
可想而知,这个动态加载一版发生在Activity的onCreate方法中,此时Activity已经created,所以Fragment的生命周期会一直顺序执行到onActivityCreated,然后根据我们上面的原则,来到前台之前总是Fragment先准备好,所以此时紧跟着onActivityCreated,还会执行onStart方法,然后才是Activity的onStart和onResume,最后Fragment的onResume。
Activity启动之后使用动态加载
这种情况最简单,因为这个时候Activity已经是前台状态,就不存在二者生命周期的交织了,直接就是Fragment顺序执行生命周期方法一直到onResume。
接下来我们看一下使用replace操作时Fragment的生命周期是怎么样的
replace操作时Fragment的生命周期变化(有backstack)
从上面的流程图可以看出,当一个Fragment被压栈时,只会销毁其视图,而不会销毁其实例(内存紧张的时候可能会kill掉)。但是当一个Fragment被出栈时,会将其完全销毁,包括视图和实例以及和Activity的关联。
以上流程图基于7.1的sdk,按照在demo中的实际打印顺序绘制。由于对网上有些人讲的有些疑问,所以特地写了个demo测试了下,发现有些说法果然有问题,可能是sdk版本不同吧。还不知道怎么在****传源码,有需要的话请留言,我打包发给你。