上一篇博客我们讲到了,Fragment的基本使用,相信大家都已经了解怎么去使用了。如果还有不懂得同学可以去看一下,传送门。现在我们来讲解一下Fragment的生命周期。

一、Fragment的事务

再讲Fragment的生命周期之前,一定要讲一下FragmentTransaction也就是fragment的事务,这对我们理解生命周期有很重要的作用。

那么什么是事务?根据用户的交互情况,对fragment进行添加(add)、移除(remove)、替换(replace),以及执行其他动作,提交给activity的每一套变化,被称为一个事务。事务当中存在一个堆栈的数据结构,它允许用户经由fragment的变化往回导航(就是和activity回跳类似,这和activity之间跳转实现都是一样的,均用堆栈实现)。用户可以通过添加FragmentTransaction.addToBackStack(null)函数(一定要在FragmentTrasaction.commit()之前调用),将此Fragment添加到后台堆栈。了解了事务之后我们再来看一下Fragment的生命周期。

二、Fragment生命周期

上篇有提到我们将Fragment看成是“小Activity”,相信熟知activity的同学都知道,掌握Activity的生命周期在安卓开发中是很有必要的。下面就为大家带来Fragment的生命周期图,并且通过几个小例子来深度理解Fragment生命周期。

android fragment基类 mvvm android fragmenttransaction_Android

一、我们先创建一个Fragment1(没有将它加入到后台堆栈中,即没有调用FragmentTransaction.addToBackStack(null)函数)并将它显示,查看Logcat:

android fragment基类 mvvm android fragmenttransaction_堆栈_02

我们发现,当Fragment1被创建的时候,调用的顺序为:

Fragment1:onAttach--》--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume

现在我们用Fragment2(也没有添加到后台堆栈),采用replace的方法将Fragment1替换掉,会出现什么样的情况:

android fragment基类 mvvm android fragmenttransaction_Android_03

观察Logcat,我们发现这个时候它的执行顺序是:

Fragment1:onPause--》onStop--》onDestroyView--》onDestroy--》onDetach

Fragment2:onAttach--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume

二、如果我们在创建Fragment1的时候,将它加入到后台堆栈中(即调用FragmentTransaction.addToBackStack(null)函数),那么结果会是怎么样子的呢?当然Fragment1的执行顺序还是和原来一样。

我们重点来看一下,用Fragment2(采用添加到后台堆栈),采用replace的方法将Fragment1替换掉,会出现什么样的情况:

android fragment基类 mvvm android fragmenttransaction_堆栈_04

这时候我们看到,它的执行顺序是:

Fragment1:onPause--》onStop--》onDestroyView。这里并没有执行onDestroy--》onDetach,这是因为我们将Fragment1添加到后台堆栈中了,所以并没有摧毁掉Fragment1

Fragment2:onAttach--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume

现在我们按下返回键,此时Fragment1将再次显示出来:

android fragment基类 mvvm android fragmenttransaction_Android_05

这时候我们看到,它的执行顺序是:

Fragment1:onCreateView--》onActivityCreated--》onStart--》onResume

Fragment2:onPause--》onStop--》onDestroyView--》onDestroy--》onDetach

三、这时候有同学会问了,如果我们启动Fragment2的时候,没有将他加入到后台堆栈中呢?按下返回键后,他的调用又是怎么样的呢?那么让我们来看一下:

android fragment基类 mvvm android fragmenttransaction_堆栈_06

我们可以看到执行顺序为:

Fragment1:onDestroy--》onDetach

为什么会这样呢?是不是很奇怪?为什么不调用Fragment1显示呢而是将它摧毁了?因为按下返回键之后,我们的Fragment2是通过replace的方式添加的,所以它就先执行remove然后在add Fragment到主界面当中。所以不存在Fragment1了,就调用了onDestroy--》onDetach

再次按下返回键:

android fragment基类 mvvm android fragmenttransaction_堆栈_07

我们可以看到执行顺序为:

Fragment2:Activity的onPause--》onPause--》Activity的onStop--》onStop--》Activity的onDestory--》onDestroyView--》onDestory--》onDetach

三、源码下载

这是生命周期测试的源码,如果对上面所讲述的还是不清楚,那么可以下载源码,自己运行一下。点我下载。

【Android归纳】Fragment生命周期-基于实验的最新总结

如今非常多应用的开发都是基于FragmentActivity中嵌套Fragment进行开发的,所以,假设我们可以清晰地知道他们的生命周期,那么会使我们的开发变的easy. 对于Activity的生命周 ...

Android开发之---Activity生命周期

Android开发中,有四大组件:Activity.Service.Content Provider.Broadcast Receiver,可以说,activity的使用是最频繁的了,这里来梳理一下与 ...

Android开发——View的生命周期总结

0.前言 今天看到一个概念是View的生命周期,有点懵逼,听说过Activity的生命周期,Fragment的生命周期,对View的生命周期好像没什么概念啊.难道layout.draw这些也算是生命周 ...

【Android开发-8】生命周期,Activity中打开另外一个Activity

前言:生命中有很多人陪伴自己走过一生中的某段旅程,仅仅是有些人仅仅是某阶段出现,有些人却陪伴自己非常久.就像小学.中学.高中.大学,那些以前以为会长久拥有的,当经历过天涯各地地忙碌于生活,或如意.或失 ...

Android官方文档翻译——Fragment生命周期

网上有的博客写得太乱 不如自己翻译官方文档 Lifecycle 生命周期 Though a Fragment's lifecycle is tied to its owning activity, i ...

【Android开发笔记】生命周期研究

启动 onCreate onStart onResume 退出键 onPause onStop onDestroy 锁屏 & 按住 home键 & 被其他Activity覆盖(Sing ...

Android零基础入门第86节:探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用.Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的 ...

随机推荐

mybatis框架下解决数据库中表的列的字段名和实体类属性不相同的问题

导包.... 实体类中的属性,getter,setter,tostring,构造等方法就不写了 private int id; private String orderNo; private floa ...

windows8.1下php环境搭建及基本配置(php+apache+mysql)

一.php下载安装:php-5.6.1-Win32-VC11-x64.zip.解压,操作: 1.复制php.ini-production,更名为php.ini 2.在环境变量PATH末尾添加:D:\p ...

Javascript 控制style 小结

style.top 如: c.style.top=scrollTop; 在IE各版本中可以,Safari, chrome, Firefox都不work, 需要在后面 + "px";

PHP验证码类

通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数 ...

THUWC2018滚粗记

THUWC2018滚粗记 前言 又是一篇滚粗记, 不过可能还要写过很多很多篇滚粗记, 才会有一篇不是滚粗记的东西啦 总而言之,我现在还是太菜了 还要过一大段时间我才会变强啦 Day -inf 联赛考完 ...

VS2013 密钥– 所有版本

Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9Visual Studio Premium 2013 KEY(密钥): ...

【BZOJ 2119】股市的预测(SAM)

SAM很好用的啊... 传送门 双倍经验:L-Gap Substrings 基本做法类似,这道题的差分改掉,map 改掉就好了QWQ noteskey 反正就是先差分一下,然后把首项丢掉(没有比较的对 ...

jquery实现点击文字后变成文本框且可修改

$(function() { //获取class为caname的元素 $(".caname").click(function() { var td = $(this); var t ...

[转]java nio解决半包 粘包问题

java nio解决半包 粘包问题 NIO socket是非阻塞的通讯模式,与IO阻塞式的通讯不同点在于NIO的数据要通过channel放到一个缓存池ByteBuffer中,然后再从这个缓存池中读出数 ...

C语言入门教程-(2)基本程序结构

1.简单的C语言程序结构 要建造房屋,首先需要打地基.搬砖搭建框架(这大概就是为什么叫搬砖的原因).学习计算机语言的时候也一样,应该从基本的结构开始学起.下面,我们看一段简单的源代码,这段代码希望大家 ...