之前总结了 Activity 和 Fragment 各种操作时的生命周期 : http://blog.csdn.net/qq_28261207/article/details/68068453
这篇深入的总结一下Fragment的生命周期 .
fragment生命周期 :
-
-
-
onAttach() :
fragment 已经关联到 activity . 这个是回调函数 , 走了这个回调函数 , 就可以进行与 activity 的通信了 .
这个方法只调用一次 .
-
-
-
onCreate() :
系统创建fragment的时候回调它 , 在这里面实例化一些变量 , 这些变量主要是当你暂停/停止的时候 , 想要保持的数据 .
如果要为 fragment 启动一个后台线程 , 可以在这个里面写 .
Bundle saveInstance : 用于保存 fragment 参数 ,
fragment 也可以重写 onSaveInstanceState ( BundleoutState ) , 保存 fragment 状态 .
可以用于文件保护 .
只调用一次 .
-
-
-
onCreateView() ;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main_dev, container, false);
}
加载 fragment 布局的 . 给当前的 fragment 绘制 ui 布局 .
要返回一个布局的 view , 也可以返回 null .
当系统用到 fragment 的时候 , fragment就要返回它的 view , 越快越好 , 所以不要在这里做耗时操作 , 比如从数据库加载大量数据显示 listview 等 , 当然线程还是可以的 .
这里加载布局时一般先判断是否为 null , 省的每次都要加载 , 减少资源消耗 :
if (view == null) {
view = inflater.inflate(R.layout.hello, null);
}
-
-
-
onActivityCreate() :
当 Activity 中的 onCreate 方法执行完后调用 .
执行 onActivityCreate() 的时候 , Activity 的 onCreate 才刚完成 , 所以在这个方法之前 , Activity 的 onCreate 可能还没有完成 , 所以不能在这个方法之前的方法 ( 例如 : onCreateView() ) 中进行与 Activity 有交互的 UI 操作 .
UI交互可以在这个方法里进行 .
这个方法可以用来作一些需要的初始化 . initData() 或者 initView() 等 . 如果放在上一个生命周期中会慢很多 , 可以放在这里 .
-
-
-
onStart() :
和 Activity 一致启动 , Fragment 启动时回调 , 此时 Fragment 可见 .
-
-
-
onResume() :
和 Activity 一致启动 .
这个时候 fragment 进入前台 , 可获取焦点 .
-
-
-
onPause() :
和activity一致 其他的activity获得焦点,这个仍然可见
第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁)
通常用于 用户的提交(可能用户离开后不会回来了)
-
-
-
onStop() :
和activity一致
fragment不可见的, 可能情况:activity被stopped了 OR fragment被移除但被加入到回退栈中
一个stopped的fragment仍然是活着的如果长时间不用也会被移除
-
-
-
onDestroyView() :
Fragment中的布局被移除时调用。
表示fragemnt销毁相关联的UI布局
清除所有跟视图相关的资源
以前以为这里没什么用处其实 大有文章可做,
相信大家都用过ViewPager+Fragment,由于ViewPager的缓存机制,每次都会加载3页。
例如:有四个 fragment 当滑动到第四页的时候 第一页执行onDestroyView(),但没有执行onDestroy。他依然和activity关联。当在滑动到第一页的时候又执行了 onCreateView()。 生命周期可以自己试一下。
那么问题来了。会出现重复加载view的局面,所以这么做(下面是先人的代码)
@Override
public void onDestroyView() {
Log.i("onDestroyView_Fragment");
if(view!=null){
((ViewGroup)view.getParent()).removeView(view);
}
super.onDestroyView();
}
-
-
-
onDestroy() :
销毁fragment对象
跟activity类似了。
-
-
-
onDetach() :
Fragment和Activity解除关联的时候调用。
脱离activity
-
-
-
当现实 Fragment 的时候 , 先执行 Activity 的方法 , 当销毁的时候 , 先执行 Fragment 的方法 .