上一篇博客我们讲到了,Fragment的基本使用,相信大家都已经了解怎么去使用了。如果还有不懂得同学可以去看一下,传送门。现在我们来讲解一下Fragment的生命周期。

 

  一、Fragment的事务

    再讲Fragment的生命周期之前,一定要讲一下FragmentTransaction也就是fragment的事务,这对我们理解生命周期有很重要的作用。

允许用户经由fragment的变化往回导航(就是和activity回跳类似,这和activity之间跳转实现都是一样的,均用堆栈实现)。用户可以通过添加FragmentTransaction.addToBackStack(null)函数(一定要在FragmentTrasaction.commit()之前调用),将此Fragment添加到后台堆栈。了解了事务之后我们再来看一下Fragment的生命周期。

 

 

  二、Fragment生命周期

    上篇有提到我们将Fragment看成是“小Activity”,相信熟知activity的同学都知道,掌握Activity的生命周期在安卓开发中是很有必要的。下面就为大家带来Fragment的生命周期图,并且通过几个小例子来深度理解Fragment生命周期。

      

android应用程序的生命周期 androidfragment生命周期_fragment的使用

 

 

没有将它加入到后台堆栈中,即没有调用FragmentTransaction.addToBackStack(null)函数)并将它显示,查看Logcat:

    

android应用程序的生命周期 androidfragment生命周期_fragment简介_02

    我们发现,当Fragment1被创建的时候,调用的顺序为:

Fragment1:onAttach--》--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume

 

  • 现在我们用Fragment2(也没有添加到后台堆栈),采用replace的方法将Fragment1替换掉,会出现什么样的情况:

    

android应用程序的生命周期 androidfragment生命周期_fragment简介_03

    观察Logcat,我们发现这个时候它的执行顺序是:

onPause--》onStop--》onDestroyView--》onDestroy--》onDetach

onAttach--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume

 

将它加入到后台堆栈中(即调用FragmentTransaction.addToBackStack(null)函数),那么结果会是怎么样子的呢?当然Fragment1的执行顺序还是和原来一样。

  • 我们重点来看一下,用Fragment2(采用添加到后台堆栈),采用replace的方法将Fragment1替换掉,会出现什么样的情况:  

这时候我们看到,它的执行顺序是:

    Fragment1:onPause--》onStop--》onDestroyView。这里并没有执行onDestroy--》onDetach,这是因为我们将Fragment1添加到后台堆栈中了,所以并没有摧毁掉Fragment1

onAttach--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume

    

  •   现在我们按下返回键,此时Fragment1将再次显示出来:

    

android应用程序的生命周期 androidfragment生命周期_fragment_04

    这时候我们看到,它的执行顺序是:

onCreateView--》onActivityCreated--》onStart--》onResume

onPause--》onStop--》onDestroyView--》onDestroy--》onDetach

 

三、这时候有同学会问了,如果我们启动Fragment2的时候,没有将他加入到后台堆栈中呢?按下返回键后,他的调用又是怎么样的呢?那么让我们来看一下:

    

android应用程序的生命周期 androidfragment生命周期_android开发_05

    我们可以看到执行顺序为:

onDestroy--》onDetach

因为按下返回键之后,我们的Fragment2是通过replace的方式添加的,所以它就先执行remove然后在add Fragment到主界面当中。所以不存在Fragment1了,就调用了onDestroy--》onDetach

 

  • 再次按下返回键:

android应用程序的生命周期 androidfragment生命周期_fragment简介_06

    我们可以看到执行顺序为:

Activity的onPause--》onPause--》Activity的onStop--》onStop--》Activity的onDestory--》onDestroyView--》onDestory--》onDetach