Fragment生命周期与Fragment执行hide、show后的生命周期探讨

一、Fragment 生命周期中的每个方法的意义与作用:

    1.setUserVisibleHint()(此方法不属于生命周期方法):设置Fragment 用户可见或不可见时调用此方法,此方法在Fragment所有生命周期执行之前执行。当Fragment 可见状态改变时,将调用此方法。

            获取Fragment的状态可见或不可见,通过调用getUserVisibleHint()方法获取。当Fragment是可见时则进行懒加载操作的。

            方法及参数:setUserVisibleHint(boolean isVisibleToUser)

                                         (懒加载操作:只让用户看到的页面才会加载它需要展示的数据,即当Fragment可见时再进行数据加载,以提高效率)

    2.onAttach():将Fragment 对象与Activity关联时,调用onAttach(Context ) 方法(方法onAttach(Activity)高版本已弃用,为兼容低版本用到,高版本适用),

                           调用此方法时,Fragment与Activity已完成绑定。

                           方法及参数:onAttacth(Context context)

    3.onCreate():初始化Fragment,可通过savedInstanceState 获取之前保存的值。

                          方法及参数: onCreate(Bundle savedInstanceState)

    4.onCreateView() :初始化Fragment布局,加载布局和findViewById操作通常在此方法中完成,单不建议执行耗时的操作,如获取数据库数据。

                          方法及参数:onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)

    5.onActivityCreated():当Fragement 所在的Activity被启动完成后回调此方法,执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,

       所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。

                         方法及参数:onActivityCreated(Bundle savedInstanceState)

    6.onStart():启动Fragment 时被回调,Fragment有不可见变为可见状态。此方法在Activity的onStart执行完立即执行,这个方法执行完Fragment界面就立即显示出来,但是还没有获取焦点,用户是不能操作的。

                        方法及参数:onStart()

   7.onResume():调用onStart() 防范后面一定会调用此方法,恢复Fragment时回调,执行此方法时,Fragment处于活动状态,用户可与之交互。

                        方法及参数:onResume()

   8.onPause():暂停Fragment,执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。等同于Activity的Paused的状态,当Activity的onPause被调用时,Fragment的onPause同时被调用。

                       方法及参数:onPause()

   9.onSaveInstanceState()(此方法不属于生命周期方法):保存当前Fragment的状态。该方法会自动保存Fragment的状态,比如EditText键入的文本,即使Fragment被回收又重新创建,一样能恢复EditText之前键入的文本。

 10.onStop():执行该方法时,Fragment完全不可见,等同于Activity的Stopped状态,当Activity的onStop被调用时,Fragment的onStop()同时被调用。

                      方法及参数:onStop()

  11.onDestory():销毁Fragment,通常按back键退出或者Fragment被回收时调用此方法。

                     方法及参数:onDestory()

  12.onDetach():解除与Activity的绑定,在onDestory 方法之后调用。

                     方法及参数:onDetach()

二、Fragment生命周期执行流程:

   1.Fragment 创建:setUserVisableHint() -> onAttach() ->onCreate() ->onCreateView() -> onActivityCreated() -> onStart() -> onResume()

   2.Fragment变为不可见状态(锁屏、回到桌面、被Activity完全覆盖):onPause() -> onSaveInstanceState() -> onStop()

   3.Fragment变为部分可见状态(打开Dialog样式的Activity):onPause() -> onSaveInstanceState()

   4.Fragment由不可见变为活动状态:onStart() -> OnResume()

   5.Fragment由部分可见变为活动状态:onResume()

   6.退出应用:onPause()  -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()(注意退出不会调用onSaveInstanceState方法,因为是人为退出,没有必要再保存数据)

   7.Fragment被回收又重新创建:被回收执行onPause() -> onSaveInstanceState() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()

   8.重新创建执行:onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() -> onStart() -> onResume() -> setUserVisibleHint()

   9.横竖屏切换:与Fragment被回收又重新创建一样。

三、Fragment 执行hide、show生命周期执行:

        当使用hide、show方法来控制Fragment使用时,Fragment生命周期将不执行,在onResume以及onPause方法处理的事情将由onHiddenChange进行管理,当Fragment调用hide隐藏时,

   该方法会被调用,传入参数为true,表示该Fragment被隐藏了,当Fragment调用了show方法后,该方法传入的参数为false,表示该Fragment正在显示。

        onHiddenChange 回调时机:

         当使用add()+show()、hide()跳转到新的Fragment时,旧的Fragment回调 onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()。

  @Override
 public void onHiddenChanged(boolen hidden){
    super.onHiddenChanged(hidden);
    if(hidden){//不在最前端界面显示,相当于调用了onPause()       
 

    }else{//重新显示到最前端 ,相当于调用了onResume()

      //进行网络数据刷新  此处执行必须要在 Fragment与Activity绑定了 即需要添加判断是否完成绑定,否则将会报空(即非第一个显示出来的fragment,虽然onCreateView没有被调用,
//但是onHiddenChanged也会被调用,所以如果你尝试去获取活动的话,注意防止出现空指针)
} }

下面是针对判断Fragment是否与Activity进行绑定做出相关修改:

public void onAttach(Context context) {
        super.onAttach(context);
        fragmentAndActivity++;//执行此方法 则说明会员Fragment 与Activity 绑定了,
       
    }

public void onHiddenChanged(boolean hide){
        super.onHiddenChanged(hide);
        if(hide){

        }
        else if(hide==false&&fragmentAndActivity>0){
                  //进行网络数据刷新
         }

}

 

posted @ 2018-03-27 16:30  zty_Love  阅读(8458)  评论(0编辑  收藏  举报