• 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){
                      //进行网络数据刷新
             }
    
    }
  • 相关阅读:
    马克思主义哲学是否只是“抄袭”和断章取义了别人的思想
    马克思的思想说到底都是抄袭
    答郭沫若的《卖淫妇的饶舌》(节录)--马克思思想批判
    联系的普遍性
    辩证
    (实用篇)使用PHP生成PDF文档
    discuz!
    Access是什么?
    putty 与winscp 区别
    xshell 与 putty
  • 原文地址:https://www.cnblogs.com/zty-Love/p/8656151.html
Copyright © 2020-2023  润新知