0%

Fragment的生命周期各状态和回调函数使用

一、回调函数

就像activitie一样,fragment也有它们自己的生命周期。理解fragment的生命周期,可以使你在它们被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态。

  1. onAttach()

    • fragment已经关联到activity
    • 这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,他只调用一次。
  2. onCreate()

    • 系统创建fragment的时候回调他,在他里面实例化一些变量
    • 这些个变量主要是:当你暂停停止的时候,你想保持的数据
    • 如果我们要为fragment启动一个后台线程,可以考虑将代码放于此处。参数是:Bundle savedInstance, 用于保存Fragment参数, Fragement也可以重写onSaveInstanceState(BundleoutState)方法, 保存Fragement状态;
    • 可以用于文件保护
    • 只调用一次。
  3. onCreateView()

    • 第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null。
    • 当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据显示listview。
    • 给当前的fragment绘制ui布局,可以使用线程更新UI,说白了就是加载fragment的布局的,这里一般都先判断是否为null,这样进行各判断省得每次都要加载,减少资源消耗。
    1
    2
    3
    4
    5
    6
    7
    if(text==null){
    Bundle args=getArguments();
    text=args.getString("text");
    }
    if (view == null) {
    view = inflater.inflate(R.layout.hello, null);
    }
  4. onActivityCreated()

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

    • 和activity一致,Fragement启动时回调,,此时Fragement可见。
  6. onResume()

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

    • 和activity一致 其他的activity获得焦点,这个仍然可见,第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁),通常用于 用户的提交(可能用户离开后不会回来了)
  8. onStop()

    • 和activity一致,fragment不可见的,可能情况:activity被stopped或fragment被移除但未加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除。
  9. onDestroyView()

    • Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局, 清除所有跟视图相关的资源。

    • 小技巧:ViewPager+Fragment,由于ViewPager的缓存机制,每次都会预加载3页。如:有四个 fragment 当滑动到第四页的时候 第一页执行onDestroyView(),但没有执行onDestroy。他依然和activity关联。当在滑动到第一页的时候又执行了onCreateView()。

    • 重复加载view解决方案:

      1
      2
      3
      4
      5
      6
      7
      8
      @Override
      public void onDestroyView() {
      Log.i("onDestroyView_Fragment");
      if(view!=null){
      ((ViewGroup)view.getParent()).removeView(view);
      }
      super.onDestroyView();
      }
  10. onDestroy()

    • 销毁fragment对象, 跟activity类似。
  11. onDetach()

    • Fragment和Activity解除关联的时候调用。 脱离activity。

二、Log调用输出

  1. 开始启动

    1
    2
    3
    4
    5
    6
    03-27 12:23:32.255: D/Fragment 1(704): onAttach 
    03-27 12:23:32.255: D/Fragment 1(704): onCreate
    03-27 12:23:32.255: D/Fragment 1(704): onCreateView
    03-27 12:23:32.274: D/Fragment 1(704): onActivityCreated
    03-27 12:23:32.274: D/Fragment 1(704): onStart
    03-27 12:23:32.286: D/Fragment 1(704): onResume
  2. 按下home按键

    1
    2
    03-27 12:25:23.174: D/Fragment 1(704): onPause 
    03-27 12:25:25.174: D/Fragment 1(704): onStop
  3. 重新返回应用

    1
    2
    03-27 12:26:21.505: D/Fragment 1(704): onStart 
    03-27 12:26:21.505: D/Fragment 1(704): onResume
  4. 销毁

    1
    2
    3
    4
    5
    03-27 12:27:54.384: D/Fragment 1(704): onPause 
    03-27 12:27:55.324: D/Fragment 1(704): onStop
    03-27 12:27:55.324: D/Fragment 1(704): onDestroyView
    03-27 12:27:55.324: D/Fragment 1(704): onDestroy
    03-27 12:27:55.324: D/Fragment 1(704): onDetach