深入理解Fragment生命周期

之前总结了 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 的方法 . 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值