Android_Fragment的生命周期与返回栈BackStack

一、Fragment的生命周期初探

因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。

如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。

但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。

当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。

使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。

每当创建一个Fragment时,首先添加以下三个回调方法:

  • onCreate():系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。
  • onCreateView():当第一次绘制Fragment的UI时系统调用这个方法,该方法将返回一个View,如果Fragment不提供 UI也可以返回null。注意,如果继承自ListFragment,onCreateView()默认的实现会返回一个ListView,所以不用自己 实现。
  • onPause():当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。

将Fragment加载到Activity当中有两种方式:

  • 方式一:添加Fragment到Activity的布局文件当中
  • 方式二:在Activity的代码中动态添加Fragment(荐)

第一种方式虽然简单但灵活性不够。添加Fragment到Activity的布局文件当中,就等同于将Fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。

第二种方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式(加载、移除、替换)。

二、Fragment与Activity的生命周期对比

fragment生命周期示例

初次加载:(分成两部分来看)

点击一下home键(或接入电话),打印日志如下:

重新进入进入程序(或电话结束),打印日志如下:

点击back键退出程序,打印日志如下:

通过上面的日志,我们能够看出,Fragment和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,需要重点介绍一下:

  • onAttach方法:Fragment和Activity建立关联的时候调用(获得activity的传递的值)
  • onCreateView方法:为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局,可以使用线程更新UI)
  • onActivityCreated方法:当Activity中的onCreate方法执行完后调用(表示activity执行oncreate方法完成了的时候会调用此方法)
  • onDestroyView方法:Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局)
  • onDetach方法:Fragment和Activity解除关联的时候调用(脱离activity)

三、Fragment返回栈的管理

将Fragment添加到返回栈中:

假设现在我们有两个Fragment:Fragment01和Fragment02,我们现在从Fragment01的界面跳到 Fragment02,然后按Back键,发现程序是直接退出了,而不是返回到Fragment01。如果现在想实现以下功能:从Fragment01的 界面跳到Fragment02,然后按Back键,会返回到Fragment01。这个功能该怎么实现呢?这其实就利用到了返回栈的知识。

其实很简单,FragmentTransaction中提供了一个addToBackStack()方法,可以将一个事务添加到返回栈中。

我们先回顾一下之前动态加载Fragment的代码,然后在此基础之上,增加一行代码就可以将Fragment添加到返回栈中:(即第07行代码)

//步骤一:添加一个FragmentTransaction的实例
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//步骤二:用add()方法加上Fragment的对象
RightFragment rightFragment = new RightFragment();
transaction.add(R.id.right, rightFragment);
transaction.addToBackStack(null);//步骤三:调用commit()方法使得FragmentTransaction实例的改变生效
transaction.commit();

我们在事务提交之前调用了FragmentTransaction的addToBackStack()方法,它可以接受一个名字用于描述返回栈的状态,一般传入null即可。

例子

@Override
     public void onClick(View v) {
         // TODO Auto-generated method stub
 transaction = manager.beginTransaction(); 47         switch (v.getId()) {
         case R.id.button1:
             Fragment01 fragment01 = new Fragment01();
             transaction.replace(R.id.right, fragment01, "fragment01");
             transaction.addToBackStack("fragment01");// 添加到Activity管理的回退栈中。
             break;

         case R.id.button2:
             Fragment02 fragment02 = new Fragment02();
             transaction.replace(R.id.right, fragment02, "fragment02");
             transaction.addToBackStack("fragment02");// 添加到Activity管理的回退栈中。
             break;

         case R.id.button3:
             Fragment03 fragment03 = new Fragment03();
             transaction.replace(R.id.right, fragment03, "fragment03");
             transaction.addToBackStack("fragment03");// 添加到Activity管理的回退栈中。
             break;

         }
  transaction.commit();
     }

运行程序后,界面如下,没有任何fragment被加载:

点击按钮加载fragment01:

点击按钮加载fragment02(此时fragment01被替换,并被压到了栈当中):

注:如果fragment01在替换的时候没有被压到栈中,那就会被销毁,在执行完onDestroyView()方法后,会继续执行onDestroy()和onDetach()方法。

按Back键,fragment01重新返回到屏幕:(fragment02被销毁)

再按Back键,fragment01被销毁:

注:Fragment的返回栈由Activity管理;而Activity的返回栈由系统管理。

时间: 2024-08-10 17:02:36

Android_Fragment的生命周期与返回栈BackStack的相关文章

Android系列之Fragment(二)Fragment的生命周期和返回栈

Android系列之Fragment(二)Fragment的生命周期和返回栈 - Android - 次元立方网 - 电脑知识与技术互动交流平台 [正文] 上一章节中(Android系列之Fragment(一)----Fragment加载到Activity当中),我们对Fragment的生命周期进行了简单介绍,这一章节将对生命周期和返回栈进行详细介绍. 一.Fragment的生命周期初探: 因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activ

Android系列之Fragment(二)----Fragment的生命周期和返回栈

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3983234.html 联系方式:[email protected] [正文] 上一章节中(Android系列之Fragment(一)----Fragment加载到Activity当中),我们对Fragment的生命周期进行了简单介绍,这一章节将对生命周期和返回栈进行详细介绍. 一.Fragmen

Android基础笔记(八)- Activity生命周期与任务栈

Activity的生命周期 横竖屏切换问题 任务栈的概念 Activity的4种启动模式 Activity的生命周期 Activity整个的生命周期如下所示,这张图是从Android API上扒下来了,我觉得API上关于生命周期已经讲解的很详细了,我也就不啰嗦了,就简要的说下自己的一些总结: 做工作中,你可能感兴趣的三个关键环 ① 完整生命周期 ② 可见生命周期 ③ 可交互生命周期 如图所示,图中的周期都是大的包括小的: 在实际工作中的使用 ①onResume可见, 可交互..把动态刷新的操作启

Acitivty生命周期

Acitivty 有七个生命周期: onCreate:当第一次调用一个Activity就会执行onCreate方法 onStart:当Activity处于可见状态的时候就会调用onStart方法 onResume:当Activity可以得到用户焦点的时候就会调用onResume方法,由被覆盖状态回到前台或解锁屏调用此方法. onRestart:当Activity没有被销毁的时候重新调用这个Activity就会调用onRestart方法 onPause:当Activity被遮挡住的时候就会调用on

7、C_存储类 & 作用域 & 生命周期 & 链接属性

概念解析 存储类 存储类就是存储类型,也就是描述C语言变量在何种地方存储. 内存有多种管理方法:栈.堆.数据段.bss段..text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中. 譬如:局部变量分配在栈上,所以它的存储类就是栈:显式初始化为非0的全局变量分配在数据段,显式初始化为0和没有显示初始化(默认为0)的全局变量分配在bss段. 作用域 作用域是描述这个变量起作用的代码范围. 基本来说,C语言变量的作用域规则是代码块作用域.意思就是这个变量起作用的范围是当前的代码块

更新阶段的生命周期

更新阶段的生命周期 componentWillReceiveProps(object nextProps) :当挂载的组件接收到新的props时被调用.此方法应该被用于比较this.props 和 nextProps以用于使用this.setState()执行状态转换.(组件内部数据有变化,使用state,但是在更新阶段又要在props改变的时候改变state,则在这个生命周期里面) shouldComponentUpdate(object nextProps, object nextState

死磕 Fragment 的生命周期

死磕 Fragment 的生命周期 本文原创,转载请注明出处. 欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文. 本文例子中 github 地址: github 项目链接 曾经在北京拥挤的13号线地铁上,一名背着双肩包穿着格子衫带着鸭舌帽脚踏帆布鞋的程序员讲了一句: "我觉得 Fragment 真的太难用了".从而引起一阵躁动激烈的讨论. 正方观点: Fragment 真的太好用了.要知道因为 Activi

活动的生命周期系列(一)返回栈

生命周期对程序员很重要,特别当我们了解,就可以写出更流畅的程序,更好的来避规性能瓶颈,让我们的APP拥有更好的用户体验.接下来我们来分享一下"返回栈". 安卓的活动中重叠的,当我们打开一个新的活动时,会覆盖上一个活动.然后点"back"时会销毁最上面的活动,下面的一个活动就会显示出来.看到这里我想大家都大概有点明白了,最新的活动永远在最上面,销毁的活动总是自上到下.这就是"栈"的机制"后进先出". android是用任务(ta

匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置

匹夫细说C#:不是"栈类型"的值类型,从生命周期聊存储位置 c#语言规范 阅读目录 0x00 前言: 0x01 堆vs栈? 0x02 谁"能"使用栈? 0x03 结论 0x04 后记补充 回到目录 0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到"类型",话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的<C#堆vs栈>系列,觉得也挺有趣,挺不错