您的位置:首页 > 其它

深入理解Fragment生命周期

2017-03-30 15:01 253 查看
之前总结了 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() : 

<
c263
/span>和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 的方法 . 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: