服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android中Fragment的生命周期与返回栈的管理

Android中Fragment的生命周期与返回栈的管理

2021-06-18 15:16Francesco Azzola Android

这篇文章主要介绍了Android中Fragment的生命周期与返回栈的管理,举例讲解了Fragment中addToBackStack()方法的使用,需要的朋友可以参考下

既然我们已经知道了fragment很好用,那么我们也需要知道它的工作原理。fragment只能存在于(作为容器的)activity中,每一个fragment都有自己的视图结构,可以像我们之前那样载入布局。fragment的生命周期更加复杂,因为它有更多的状态,如图:

Android中Fragment的生命周期与返回栈的管理

我们来看一下fragment完整的生命周期。

在fragment生命周期开始,oninflate方法被调用。要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用。我们可以在这个方法中保存一些在xml布局文件中定义的配置参数和一些属性。
这一步过后就轮到onattach被调用了。这个方法在fragment绑定到它的父activity中的时候被调用,我们可以在这里保存它和activity之间的引用。
之后oncreate会被调用。这是最重要的步骤之一。fragment就是在这一步中产生的,可以用这个方法来启动其它线程来检索数据,比如从远程服务器中启动。
oncreateview这个方法是在fragment创建自己的视图结构的时候被调用,在这个方法中我们会载入fragment的布局文件,就像我们在listview控件中载入布局一样。在这个过程中,我们不能保证父activity是否已经创建,所以有一些操作我们不能在这里完成。
可以看到,在onactivitycreated后activity才算是建立完成。到这一步,我们的activity就创建成功并激活了。我们可以随时使用它了。
下一步就是onstart了,在这里我们做的事和activity中的onstart一样,在这个方法中fragment虽然可以显示,但是还不能和用户进行交互,只有在onresume后fragment才能开始和用户进行交互操作。在这个过程后,fragment就已经启动并运行起来了。
也许会暂停activity。activity的onpause方法会被调用。这时候fragment的onpause方法也会被调用。
系统也可能会销毁fragment的视图显示,发生这种情况时ondestroyview方法就被调用了。
之后,如果系统需要完全销毁整个fragment的话,ondestroy方法就会被调用了。这时候我们就需要释放掉所有可用的连接了,因为这个时候fragment马上就要被杀掉了。虽然是在准备销毁的过程中,但是fragment仍然绑定在父activity中。
最后一步就是把fragment从activity中解绑,即调用ondetach方法。

fragment返回栈的管理
将fragment添加到返回栈中:

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

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

我们这里在一段动态加载fragment的代码基础之上,增加一行代码就可以将fragment添加到返回栈中:

?
1
2
3
4
5
6
7
8
//步骤一:添加一个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即可。

例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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:

Android中Fragment的生命周期与返回栈的管理

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

Android中Fragment的生命周期与返回栈的管理

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

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

Android中Fragment的生命周期与返回栈的管理

再按back键,fragment01被销毁:

Android中Fragment的生命周期与返回栈的管理

注:fragment的返回栈由activity管理;而activity的返回栈由系统管理。

延伸 · 阅读

精彩推荐
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28