如今非常多应用的开发都是基于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生命周期-基于实验的最新总结

【Android归纳】Fragment生命周期-基于实验的最新总结的更多相关文章

  1. 重温Android和Fragment生命周期

    重温下Android和Fragment生命周期,理解生命周期方法的作用,什么时候调用,可以做一些什么操作. 1.Android生命周期 1.1 生命周期图 1.2 生命周期函数说明 onCreate: ...

  2. Android中Fragment生命周期和基本用法

    1.基本概念 1. Fragment是什么? Fragment是可以让你的app纵享丝滑的设计,如果你的app想在现在基础上性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fra ...

  3. Android Activity Fragment 生命周期

    从开源项目中看到 这个,就情不自禁的收藏了~ https://github.com/xxv/android-lifecycle

  4. Android之——Fragment生命周期(日志截图版)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46867159

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

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

  6. Android Fragment 生命周期及其API使用(建议使用自定义View替换Fragment)

    我为什么不主张使用Fragment Fragment:( Fragment就相当于一个有生命周期的View,它的生命周期被所在的Activity的生命周期管理 ) 生命周期回调说明: onAttach ...

  7. Android Activity生命周期以及Fragment生命周期的区别与分析

    Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...

  8. Android Fragment 生命周期及其正确使用(建议使用自定义View替换Fragment)

    使用Fragment 官方例子中显示: 例如:一个学生Fragment,需要传入studentId,进行http请求显示,那么setArguments后防止杀掉Fragment后,参数为0,显示不了数 ...

  9. Android之Fragment学习笔记②(Fragment生命周期)

    一. Fragment生命周期图                                  二.Fragment生命周期方法介绍 Fragment的生命周期和activity生命周期很像,其生 ...

随机推荐

  1. Could not create the view: An unexpected exception was thrown. Myeclipse空间报错

    我的路径D:\MyEclipse 10\.metadata\.plugins\org.eclipse.core.runtime\.settings 我也遇到过这个问题,就是工作空间的问题好像是删除你工 ...

  2. myeclipse2014 破解步骤

    1.打开破解文件夹Myeclipse 2014 patch,运行run.bat文件 2.在破解界面中,usercode随便输入, systemid 在右边的SystemId按钮处,点击. 将自动生成一 ...

  3. Oracle 数据导入导出(imp/exp)

    环境:windows下,oracle11g 1.启动oracle服务 net start OracleDBConsoleorclnet start OracleOraDb11g_home1TNSLis ...

  4. JAVA面试题基础部分(二)

    10.使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.例如,对于如下 ...

  5. C++ Rand()各种实现

    参考链接:http://www.cplusplus.com/reference/cstdlib/rand/ 使用实例: v1 = rand() % 100; // v1 in the range 0 ...

  6. Visual Studio 推荐插件以及一些设置

    Microsoft Visual Studio 作为微软自家的 IDE 集成 NuGet 包管理器,是的引用一些不同版本组件DLL十分方便. 集成编译环境,强大的 Debug 断点.附加功能 项目模板 ...

  7. 【第一课】kaggle初识

    Evernote Export Crowdflower搜索结果相关性 文件和数据描述 train.csv训练数据集包括: id:产品ID查询:使用的搜索词 product_description:完整 ...

  8. HTML 1.1页面js修改文字颜色

    昨天的报告页面,想要实现根据不同文字内容改变字体颜色,效果图: 调试了半天出不来效果,最后请教了前端,上代码: <!DOCTYPE html> <html lang="en ...

  9. 下拉框处理(select)

    在UI自动化测试过程中,经常会遇到一些下拉框,我们有三种可选方式来操作下拉框. 第一种方法 基于webdriver的两次click,很容易出现问题,不建议使用.(由于部分下拉框在点击一次后,失去焦点再 ...

  10. Clocksource tsc unstable

    内核在启动过程中会根据既定的优先级选择时钟源.优先级的排序根据时钟的精度与访问速度. 其中CPU中的TSC寄存器是精度最高(与CPU最高主频等同),访问速度最快(只需一条指令,一个时钟周期)的时钟源, ...