一、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){ //进行网络数据刷新 } }