与活动类似,Fragment也有自己的生命周期。理解Fragment的生命周期有助于在Fragment销毁时能恰当地保存其实例,然后在重新创建时能够将其恢复至之前的状态。
下面的“试一试”将研究Fragment的各种状态。

(1) 使用上一节创建的项目,向Fragment1.java文件中添加如下所示的粗体代码:

  1. package net.learn2develop.Fragments;
  2. import android.app.Activity;
  3. import android.app.Fragment;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.util.Log;
  9. public class Fragment1 extends Fragment {
  10.    
  11.    @Override
  12.    public void onAttach(Activity activity) {
  13.      super.onAttach(activity);
  14.      Log.d("Fragment 1", "onAttach");
  15.    }
  16.    
  17.    @Override
  18.    public void onCreate(Bundle savedInstanceState) {
  19.     super.onCreate(savedInstanceState);
  20.     Log.d("Fragment 1", "onCreate");
  21.    }
  22.    
  23.    @Override
  24.    public View onCreateView(LayoutInflater inflater,
  25.    ViewGroup container, Bundle savedInstanceState) {
  26.      Log.d("Fragment 1", "onCreateView");
  27.      
  28.      // Inflate the layout for this fragment
  29.      return Inflater.inflate(R.layout.fragment1,
  30.        container, false);
  31.    }
  32.    
  33.    @Override
  34.    public void onActivityCreated(Bundle savedInstanceState) {
  35.      super.onActivityCreated(savedInstanceState);
  36.      Log.d("Fragment 1", "onActivityCreated");
  37.    }
  38.    
  39.    @Override
  40.    public void onStart() {
  41.     super.onStart();
  42.     Log.d("Fragment 1", "onStart");
  43.    }
  44.    
  45.    @Override
  46.    public void onResume() {
  47.     super.onResume();
  48.     Log.d("Fragment 1", "onResume");
  49.    }
  50.    
  51.    @Override
  52.    public void onPause() {
  53.     super.onPause();
  54.     Log.d("Fragment 1", "onPause");
  55.    }
  56.    
  57.    @Override
  58.    public void onStop() {
  59.     super.onStop();
  60.     Log.d("Fragment 1", "onStop");
  61.    }
  62.    
  63.    @Override
  64.    public void onDestroyView() {
  65.     super.onDestroyView();
  66.     Log.d("Fragment 1", "onDestroyView");
  67.    }
  68.    
  69.    @Override
  70.    public void onDestroy() {
  71.     super.onDestroy();
  72.     Log.d("Fragment 1", "onDestroy");
  73.    }
  74.    
  75.    @Override
  76.    public void onDetach() {
  77.     super.onDetach();
  78.     Log.d("Fragment 1", "onDetach");
  79.    }
  80. }
  81.         
(2) 按下Ctrl+F11组合键将Android模拟器切换至landscape模式。
(3) 在Eclipse中按下F11键,在Android模拟器中调试应用。
(4) 当应用在模拟器中加载时,LogCat窗口中输出的内容如下所示(Window|Show View|LogCat):

  1. 04-02 06:55:38.953: DEBUG/Fragment 1(6818): onAttach
  2. 04-02 06:55:38.953: DEBUG/Fragment 1(6818): onCreate
  3. 04-02 06:55:38.963: DEBUG/Fragment 1(6818): onCreateView
  4. 04-02 06:55:38.983: DEBUG/Fragment 1(6818): onActivityCreated
  5. 04-02 06:55:38.983: DEBUG/Fragment 1(6818): onStart
  6. 04-02 06:55:39.003: DEBUG/Fragment 1(6818): onResume

(5) 按下模拟器上的Home按钮。LogCat窗口中输出的内容如下所示:

  1. 04-02 04:03:45.543: DEBUG/Fragments(2606): onPause
  2. 04-02 04:03:47.394: DEBUG/Fragments(2606): onStop

(6) 在模拟器上单击屏幕右上角的Apps按钮再次启动应用。这一次,LogCat窗口中输出的内容如下所示:

  1. 04-02 04:04:32.703: DEBUG/Fragments(2606): onStart
  2. 04-02 04:04:32.703: DEBUG/Fragments(2606): onResume

(7) 最后,单击模拟器上的Back按钮。现在会看到如下输出:

  1. 04-02 07:23:07.393: DEBUG/Fragment 1(7481): onPause
  2. 04-02 07:23:07.393: DEBUG/Fragment 1(7481): onStop
  3. 04-02 07:23:07.393: DEBUG/Fragment 1(7481): onDestroyView
  4. 04-02 07:23:07.403: DEBUG/Fragment 1(7481): onDestroy
  5. 04-02 07:23:07.413: DEBUG/Fragment 1(7481): onDetach

示例说明
与活动类似,Android中的Fragment也拥有自己的生命周期。如你所见,当创建Fragment时,它会经历如下状态:

  1. onAttach()
  2. onCreate()
  3. onCreateView()
  4. onActivityCreated()

当Fragment变为可见时,它会经历如下状态:

  1. onStart()
  2. onResume()

当Fragment进入后台模式时,它会经历如下状态:

  1. onPause()
  2. onStop()

当Fragment销毁时(当托管Fragment的活动销毁时),它会经历如下状态:

  1. onPause()
  2. onStop()
  3. onDestroyView()
  4. onDestroy()
  5. onDetach()

与活动类似,可以在如下状态中使用Bundle对象恢复Fragment实例:

  1. onCreate()
  2. onCreateView()
  3. onActivityCreated()

Fragment所经历的大多数状态都类似于活动。然而,有些新状态却是其所独有的:
  1. onAttached()—当Fragment关联到活动上时调用
  2. onCreateView()—为Fragment创建视图时调用
  3. onActivityCreated()—当活动的onCreate()方法返回时调用
  4. onDestroyView()—当Fragment的视图被删除时调用
  5. onDetach()—当Fragment脱离活动时调用

意一下活动与Fragment之间的一个主要差别。它动进入后台时,它会被放到后台栈中。这样当用户按下Back按钮时,活动就可以重新执行。但对于
Fragment来说,当进入到后台时,它们并不会被放到后台栈中。相对于将Fragment放到后台栈中来说,需要显式地在Fragment事务中调用
addToBackStack()方法,如下所示:

  1.  if (d.getWidth() > d.getHeight())
  2.    {
  3.      //---landscape mode---
  4.      Fragment1 fragment1 = new Fragment1();
  5.      fragmentTransaction.replace(
  6.        R.id.fragmentContainer, fragment1);
  7.    }
  8.    else
  9.    {
  10.      //---portrait mode---
  11.      Fragment2 fragment2 = new Fragment2();
  12.      fragmentTransaction.replace(
  13.        R.id.fragmentContainer, fragment2);
  14.    }
  15.    
  16.    //---add to the back stack---
  17.    fragmentTransaction.addToBackStack(null);
  18.    fragmentTransaction.commit();
上述代码确保当Fragment被添加到活动中后,用户可以单击Back按钮将其删除。

理解Fragment的生命周期的更多相关文章

  1. Fragment的生命周期&同一Activity下不同Fragment之间的通信

    Android开发:碎片Fragment完全解析(2) Fragment的生命周期 和Activity一样,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我们通过代码的方 ...

  2. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期

    Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表: Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity ...

  3. 【Android】11.4 Fragment及其生命周期

    分类:C#.Android.VS2015: 创建日期:2016-02-22 一.简介 Android从3.0开始引入了fragment的概念,主要是为了支持在大屏幕上实现更为动态和灵活的UI设计,比如 ...

  4. 死磕 Fragment 的生命周期

    死磕 Fragment 的生命周期 本文原创,转载请注明出处.欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文.本篇文章已 ...

  5. Fragment的生命周期

    Fragment的生命周期: 1. onAttach():Fragment对象跟Activity关联时 2. onCreate():Fragment对象的初始创建时 3. onCreateView() ...

  6. Fragment的生命周期(三)

    自定义lifecycleoffragment布局文件 在main_activity布局中引用自定义的fragment布局 到logcat中查看程勋运行的结果 代码如下: 自定义的fragment布局: ...

  7. fragment的生命周期及其各个周期方法的作用

    先上生命周期图: Fragment的生命周期图: 与Activity的生命周期对比图: 由于Fragment是嵌在Activity中使用的,故其生命周期也是依赖于Activity的周期的,或者说Fra ...

  8. Activity与Fragment的生命周期

    今天看到一张图,详细描述了Activity和Fragment的生命周期,好资源共享咯!

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

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. unity3d-碰撞检测

    碰撞检测 游戏中很多时候都要判断碰撞检测,比如子弹打中敌机.当碰撞后.就要发生爆炸. 或者敌机减血, 我们先看一张图片,看皮球从天空下落.与地面碰撞的过程 碰撞检测条件 游戏中两个对象发生碰撞是需要条 ...

  2. input text文本框内部最后面放一个按钮

    .ContSpan { border: 1px solid #; display: inline-block; } .ContSpan span { cursor: pointer; backgrou ...

  3. jQ live用法

    我们给元素绑定单击事件.用得最多的都是$("#id").click(function(){}); 但我们动态添加的元素.这样绑定是不行的.必须借助live  $("#id ...

  4. MySQL用户授权 和 bin-log日志 详解和实战(http://www.cnblogs.com/it-cen/p/5234345.html)

    看 了上一篇博文的发布时间,到目前已经有三个月没更新博文了.这三个月经历了很多事情,包括工作.生活和感情等等.由于个人发展的原因,这个月准备换工作 啦.在这段时间,我会把Web大型项目中所接触到的技术 ...

  5. JNDI—目录接口名

    1:什么是JNDI? Java名称与目录接口:java Naming and Directory Interface未开发人员提供的查找和访问各种名称和目录的 服务和接口 2:全局的上下文配置文件: ...

  6. promise-async-await

    通常而言,这3个关键字 都是用来「优雅」的处理ajax异步请求的 //es6的时候promise诞生,很好的解决了嵌套回调地狱,改良方案为链式回调. // es2017的时候诞生了async.awai ...

  7. mongodb mongotemplate聚合

    1.group by并且计算总数 @Test public void insertTest() { //测试数据 //insertTestData(); Aggregation agg = Aggre ...

  8. n是否是2的幂

    实例五:n是否是2的幂 方法一:result=n&(n-1) 如果result=0 则n是2的幂方法二:result=n&((~n)+1) 如果result=n 则n是2的幂 原数   ...

  9. uva11354 LCA+最小生成树+dp

    源自大白书 题意 有n座城市通过m条双向道路相连,每条道路都有一个危险系数.你的任务是回答若干个询问,每个询问包含一个起点s和一个终点t,要求找到一条从s到t的路,使得途径所有的边的大最大危险系数最小 ...

  10. python 文件不存在时才能写入,读写模式xt

    想向一个文件中写入数据,但是前提必须是这个文件在文件系统上不存在.也就是不允许覆盖已存在的文件内容. 可以在open() 函数中使用x 模式来代替w 模式的方法来解决这个问题.比如: >> ...