Fragment是在Android3.0的时候,新增的概念,距离现在应该有比较长的时间了.
Fragment在Android中的表述是碎片化视图.
1.Fragment的作用是是在一个Activity中描述一些行为或者一部分用户界面.并且可以使用多个Fragment在一个单独Activity中,形成多个UI面板,也可以在多个Activity中重复调用.
2.Fragment拥有Activity的大多数功能,可以达到几乎取代Activity的作用,并且Fragment和Activity相比,它可以不用再清单文件中注册.
3.在Activity运行过程中,可以通过碎片管理者FragmentManager,添加、移除或者替换Fragment(add()、remove()、replace())
4.Fragment有自己的生命周期,并且它们的生命周期直接被其所属的宿主activity的生命周期影响。
那么和Activity一样,Fragment也有自己独特的生命周期,如下:
onAttach() 当Fragment与Activity发生关联时调用.
onCreatView() 创建该Fragment的视图.
onActivityCreat() 当Activity的oncreat方法返回时调用.
onDestoryView() Fragment的视图被移除时调用.
onDetach() Fragment与Activity关联被取消时调用.
下面这张图,是Activity和Fragment的生命周期对比.
(1)onAttach()方法,一般用Fragment和Activity,或者Fragment之间利用接口回调,相互通信.
(2)onCreatView()方法,正常Fragment在使用时,为了使创建的Fragment进行正常的UI交互,需要利用onCreatView()方法,使其返回其的根部局View视图,一般来说,这个view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
(3)onActivityCreated()方法,由上图中可以看出,onActivityCreated()方法,一般在oncreat()方法之后调用,一般情况,我都在onActivityCreated()的生命周期中,进行组件的实例化.
(4)onDestoryView()方法,一般使用的比较少,只有当和Fragment相关的View视图被移除时调用.
(5)onDetach()方法,与onAttach()方法相对应,Fragment的生命周期最后一个环节,回调此方法,Fragment的生命周期比较完整,Fragment也从内存中,完整的消失,也不会占用内存.
Fragment的生命周期特殊之处:
当一个Fragment被嵌入到一个Activity中时,它的生命周期直接受其所属的宿主Activity的生命周期影响:
比如,当Activity被暂停时,其中所有Fragment也会被暂停;
当Activity被销毁时,所有隶属于Activity的Fragment也都会被销毁.
但是当Activity正在运行(onResumed)的过程中, 这时候可以使用FragmentManager对Fragment进行单独的操作,增加或者移除,之类的.
处理fragment的生命周期
对于fragment的生命周期, 大多数生命周期和管理activity生命周期很像.和activity一样, fragment可以处于3种状态:
Resumed
在运行中的activity中fragment可见.
Paused
另一个activity处于前台并拥有焦点, 但是这个fragment所在的activity仍然可见(前台activity局部透明或者没有覆盖整 个屏幕).
Stopped
要么是宿主activity已经被停止, 要么是fragment从activity被移除但被添加到后台堆栈中.
停止状态的fragment仍然活着(所有状态和成员信息被系统保持着). 然而, 它对用户不再可见,当Activity再次被调用时,该Fragment也会被调用,而如果Activity的进程被杀死,那么Fragment的进程也不在存在.
下面内容是在forever_crying的专栏上的一些测试,测试各个场景的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): onDestroyView11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach
正常的Fragment的生命周期,大致是这样的一个情况,这也是我现在能理解到的一个阶段.
另:本人博客会一直更新本人的学习安卓过程中的一些学习经验,如果有不足的地方,希望大家多多指教.