Fragment的生命周期详解

来源:互联网 发布:跳跃网络推荐账号 编辑:程序博客网 时间:2024/05/22 11:45
近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。
一、Fragment的事务
    再讲Fragment的生命周期之前,一定要讲一下FragmentTransaction也就是fragment的事务,这对我们理解生命周期有很重要的作用。
    那么什么是事务?根据用户的交互情况,对fragment进行添加(add)、移除(remove)、替换(replace),以及执行其他动作,提交给activity的每一套变化,被称为一个事务。事务当中存在一个堆栈的数据结构,它允许用户经由fragment的变化往回导航(就是和activity回跳类似,这和activity之间跳转实现都是一样的,均用堆栈实现)。用户可以通过添加FragmentTransaction.addToBackStack(null)函数(一定要在FragmentTrasaction.commit()之前调用),将此Fragment添加到后台堆栈。了解了事务之后我们再来看一下Fragment的生命周期。
二、Fragment生命周期

1、Fragment的生命周期

        

2、与Activity生命周期的对比

        

3、下面就说一下这几个增加的生命周期方法
(1)onAttach():
   当fragment与它所在的Activity关联起来的时候调用。
(2)onCreatView():
   当需要创建一个与Fragment关联的View时候会调用,这个方法会返回一个View,这个View会被添加到Activity的View树中,如果你不想Fragment显示一个View就返回null。
(3)onActivityCreate():
   当activity的onCreate()返回后调用此方法。
(3)onDestroyView():
   当与Fragment关联的那个View(在onCreatView()方法中创建的)与Fragment解除关联,从View树中移除的时候调用,在下次Fragment需要显示一个View的时候会重新调用onCreatView方法。
(4)onDetach():
   当Fragment与之前onAttach()是关联起来的那个Activity解除关系的时候调用。
4、与Activity类似,Fragment可以停留(长时间存在)的三个状态:
(1)Resumed:
     Fragment的运行状态,此时Fragment处于运行状态,并且可以与用户之间进行交互,类似Activity的Resumed状态。
(2)Paused:
    有其他Activity获取焦点,前台运行,Fragment所在的Activity失去焦点,部分的显示在前台Activity下面。
(3)Stopped:
     Fragment不再可见,此时的情形可能是Fragment所在的Activity已经stopped了,或者fragment从Activity中移除到Fragment回退栈中。一个Stopped状态的Fragment不没有被销毁,还在存活状态,它的状态和内部信息被系统记录和保存,只是不可见,不可交互,此时很可能会被系统回收。
5、与Activity类似,你可以利用Bundle来记录Fragment的状态,当Activity被销毁需要记录Fragment状态,并且在Activity重新创建的时候恢复Fragment的状态。你可以保存Fragment的状态在Fragment的onSaveInstanceState()回调方法中,在onCteate()、onCreateView()或者onActivityCreated()方法中进行恢复。
6、在生命周期中Activity与Fragment的最大不同之处是回退栈是相互独立的,Activity的回退栈是系统来管理的,Fragment的回退栈是被宿主Activity来管理的,也就是说你可以来进行控制(调用addToBackStack()).
        注意:在Fragment中你如果要获取一个Context对象,你可以调用getActivity()方法,但是调用getActivity()方法必须要在Fragment于Activity关联起来之后,否则getActivity()返回为null。
三、Fragment生命周期函数的场景演示
切换到该Fragment
11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart

11-29 14:26:35.120: D/AppListFragment(7649): onResume


屏幕灭掉:
11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop


屏幕解锁
11-29 14:33:13.240: D/AppListFragment(7649): onStart

11-29 14:33:13.275: D/AppListFragment(7649): onResume


切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop

11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView


切换回本身的Fragment:
11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart

11-29 14:33:55.825: D/AppListFragment(7649): onResume


回到桌面
11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState

11-29 14:34:26.880: D/AppListFragment(7649): onStop


回到应用
11-29 14:36:51.940: D/AppListFragment(7649): onStart

11-29 14:36:51.940: D/AppListFragment(7649): onResume


退出应用
11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy

11-29 14:37:03.165: D/AppListFragment(7649): onDetach


感兴趣的朋友请继续阅读 Activity的生命周期详解

原创粉丝点击