美文网首页
Fragment的生命周期及详解

Fragment的生命周期及详解

作者: 郑在学_blog | 来源:发表于2017-10-26 12:12 被阅读0次
    先来一副Fragment生命周期的图解:
    Fragment生命周期

    OnAttach()

    作用:帮助Fragment与Activity进行交互。
    Activity传入Fragment:

    public void onAttach(Activity activity) {
        super.onAttach(activity);
        titles = ((MainActivity) activity).getTitles();//通过强转成宿主activity,就可以获取到传递过来的数据
    }
    

    Fragment把值传递给Activity,可以时候接口回调。
    1)在Fragment中定义接口。
    2)在Activity中实现接口。
    3)在OnAttach中获取Activity实例,然后调用实现了的接口。

    两个Fragment通信,通常为两个Fragment都绑定同一个Activity,可以使用Activity作为中介。

    onCreate()

    系统创建fragment的时候回调他,可以在其中初始化除了view之外的东西,例如实例化一些变量
    通常这些变量是当Fragment暂停或停止时需要保存的变量。
    如果我们要为Fragment启动一个后台线程,可以考虑将代码放于此处。
    参数是:Bundle savedInstance, 用于保存 Fragment 参数, Fragement 也可以 重写 onSaveInstanceState(BundleoutState) 方法, 保存Fragement状态;
    可以用于 文件保护
    他只调用一次。

    onCreateView()

    第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null。
    当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据显示listview,
    当然线程还是可以的。
    给当前的fragment绘制ui布局,可以使用线程更新UI,说白了就是加载fragment的布局的。
    这里一般都先判断是否为null。

    if(text==null){
          Bundle args=getArguments();
          text=args.getString("text");
        }
        if (view == null) {
          view = inflater.inflate(R.layout.hello, null);
        }
    

    onActivityCreated()

    当Activity中的onCreate方法执行完后调用。
    注意了:
    从这句官方的话可以看出:当执行onActivityCreated()的时候 activity的
    onCreate才刚完成。
    所以在onActivityCreated()调用之前 activity的onCreate可能还没有完成,
    所以不能再onCreateView()中进行 与activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。
    所以呢:这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完
    整初始化才能初始化的元素。
    如果在onCreateView里面初始化空间 会慢很多,比如listview等。

    onStart()

    和activity一致,启动Fragement 启动时回调,,此时Fragement可见。

    onResume()

    和activity一致 在activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。

    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。

    参考文章
    Android的Fragment的生命周期各状态和回调函数使用

    相关文章

      网友评论

          本文标题:Fragment的生命周期及详解

          本文链接:https://www.haomeiwen.com/subject/pzevuxtx.html