Fragment与Activity生命周期交织

最近正好复习到这个地方了,又将之前的笔记整理了下,那今天就迁移这一篇吧。写完这个又得去做仿真了。。
首先Fragment完整生命周期的官图镇楼 (图片来自官网)

官方tutorial

先从静态加载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)

带backstack的replace操作

从上面的流程图可以看出,当一个Fragment被压栈时,只会销毁其视图,而不会销毁其实例(内存紧张的时候可能会kill掉)。但是当一个Fragment被出栈时,会将其完全销毁,包括视图和实例以及和Activity的关联。

以上流程图基于7.1的sdk,按照在demo中的实际打印顺序绘制。由于对网上有些人讲的有些疑问,所以特地写了个demo测试了下,发现有些说法果然有问题,可能是sdk版本不同吧。还不知道怎么在CSDN传源码,有需要的话请留言,我打包发给你。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值