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

对于Activity的生命周期。我在之前的文章 Activity生命周期-基于实验的最新总结  中已经说的非常具体了,因此本篇文章仅仅是从实践角度来讲一下Fragment的生命周期以及Fragment与Activity生命周期的相应关系,像大多数介绍Fragment生命周期的文章一样。先上两张图:

好,言归正传

这里从实例的角度来说明一下Activity与Fragment生命周期的关系

如果我们的Activity为MainActivity,在Activity中有两个Fragment:一个叫做HomeFragment(默认打开的页面),一个叫做UserInfoFragment

如今通过场景模拟的方式来看一下他们的关系

场景1首次启动应用,而Activity默认打开的页面为HomeFragment

场景2关闭电源键(屏幕灭掉)

场景3 屏幕解锁

场景4 第一次切换到UserInfoFragment

场景5
HomeFragment与UserInfoFragment来回切换

若加入Fragment的方法例如以下:

	private void showFragment(String tag) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (!TextUtils.isEmpty(curFragmentTag)) {
Fragment f = fm.findFragmentByTag(curFragmentTag);
if (f != null) {
ft.hide(f);
}
}
Fragment fragment = fm.findFragmentByTag(tag);
if (fragment == null) {
ft.add(R.id.main_layout, getFragmentInstance(tag), tag);
} else {
ft.show(fragment);
}
ft.commit();
curFragmentTag = tag;
}

则:

若将加入fragment的方法从add变成replace,则每次切换都会:(如果从HomeFragment切换到UserInfoFragment)

事实上。这里就引出了一个问题:

假设使用replace的话,每次切换的时候。Fragment都会被又一次实例化,又一次载入一遍数据,这样会很消耗性能和用户的数据流量,replace通常是在上一个Fragment不再

使用的情况下採用。假设我们不想重复实例化Fragment,则能够使用add方法,切换时hide当前的Fragment。然后再add还有一个Fragment。再次切换的时候,仅仅须要hide当前的Fragment。然后show还有一个。

场景6 按home键回到桌面(如果当前切换到HomeFragment)

场景7 从桌面返回到应用

事实上发现流程跟关闭打开电源键一样

场景8 退出应用(前提是HomeFragment和UserInfoFragment的实例都已经创建,并且是採用add方法加入)

总结:

管理fragment的生命周期有些像管理activity的生命周期。Fragment能够生存在三种状态:

Resumed:

Fragment在一个执行中的activity中而且可见。

Paused:

还有一个activity处于最顶层,可是fragment所在的activity并没有被全然覆盖(顶层的activity是半透明的或不占领整个屏幕)。

Stoped:

Fragment不可见。可能是它所在的activity处于stoped状态或是fragment被删除并加入到后退栈中了。此状态的fragment仍然存在于内存中。

相同类似于activity,你能够把fragment的状态保存在一个Bundle中。在activity被recreated时就需用到这个东西。

你能够在onSaveInstanceState()方法中保存状态并在onCreate()或onCreateView()或onActivityCreated()中恢复。

Fragment与Activity的生命周期中最大的不同就是存储到后退栈中的过程。Activity是在停止时自己主动被系统压入停止栈。而且这个栈是被系统管理的;而fragment是被压入activity所管理的一个后退栈,而且仅仅有你在删除fragment后并明白调用addToBackStack()方法时才被压入。

然而。管理fragment的生命周期与管理activity的生命周期极其相似。你所须要去思考的是activity的生命周期怎样影响fragment的生命周期。

相关链接:

Activity的四种启动模式-图文并茂

Activity生命周期-基于实验的最新总结

最新文章

  1. 解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
  2. 001-编译hadoop-2.5.2总结
  3. css设置文字不换行,超过的部分用“...”代替
  4. ThinkPHP第二十天(getField用法、常用管理员表结构、树形结构前小图标CSS)
  5. docker搭建基础的tomcat应用
  6. HTML 5 在Web SQL 使用演示样本
  7. Extjs表单控件入门
  8. git链接GitHub命令及基本操作
  9. C#设计模式(3)-工厂方法模式
  10. GenericServlet 、Servlet和httpServler
  11. Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
  12. [20181007]12cR2 Using SQL Patch.txt
  13. 使用SQL*Plus连接数据库
  14. use of objects can be less efficient than a procedural approach
  15. everything不显示移动硬盘中路径
  16. python通过xlwt模块直接在网页上生成excel文件并下载
  17. Spring Boot系列学习文章(二) -- 配置多数据源
  18. PAT 1064 Complete Binary Search Tree[二叉树][难]
  19. jxl(Java Excel API) 使用方法 【1】
  20. java后台读取/解析 excel表格

热门文章

  1. [BZOJ1041]圆上的整点
  2. Obsolete---标记方法 类过期
  3. HTML 5的基本标签
  4. 酷派 5267 刷入第三方 recovery教程 刷机 ROOT
  5. SQL Server 一个简单的游标
  6. jQuery顺序加载图片(初版)
  7. Eclipse之注释部分代码
  8. 利用string 字符串拷贝
  9. Window8.1下安装Matplotlib库
  10. Dijkstra的双栈算术表达式求值算法 C++实现