Fragment生命周期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment生命周期相关的知识,希望对你有一定的参考价值。

参考技术A Fragment的生命周期函数流程如下:

onAttach()---->onCreate---->onCreateView----->onActivityCreated--->onstart---->onResume--->onPause---->onStop------->onDestroyView------>onDestroy----->onDetach

onAttach---》在Fragment和Activity建立关联时调用(Activity传递到此方法内)
onCreateView---->当Fragment创建视图时调用
onActivityCreated----->在相关联的Activity的onCreate方法已返回时调用
onDestroyView----->当Fragment视图被移除时调用
onDetach---->在Fragment与Activity取消关联时调用

以下几种情况看下Fragment的生命周期变化:

1、打开页面:onCreate-->onCreateView--->onActivityCreated--->onStart---->onResume
2、按下主屏幕键(home键):onPause--->onStop
3、重新打开页面:onStart--->onResume
4、按下返回键:onPause---->onStop---->onDestroyView--->onDestroy---->onDetach

当Activity加入Fragment,Activity与Fragment的生命周期变化是:

1、打开页面
Fragment  onCreate--->Fragment   onCreateView---->Activity  onCreate--->Fragment  onActivityCreated--->Activity onStart----> Fragment  onStart ----->  Activity  onResume--->Fragment  onResume
2、按下home键
Fragment  onpause  ---->Activity  onPause---->Fragment  onStop  ---->Activity onStop
3、重新打开页面
Activity onRestart---->Activity  onStart --->Fragment  onStart---->Activity onResume--->Fragment  onResume
4、按后退键
Fragment onPause---->Activity  onPause---->Fragment  onStop ---->Activity  onStop ----->Fragment onDestroyView---->Fragment onDestroy---->Fragment  onDetach ---->Activity onDestroy

Fragment 生命周期与 Activity 生命周期的一个关键区别就在于,Fragment 的生命周期方法是由托管Activity而不是操作系统调用的。Activity 中生命周期方法都是 protected,而 Fragment 都是 public,也能印证了这一点,因为 Activity 需要调用 Fragment 那些方法并管理它。

onAttach ---->onCreate---->onCreateView ---->onActivityCreated-->onstart-->onResume-->onPause-->onStop--->onDestroyView---->onDestroy----->onDetach

Fragment 生命周期:

Fragment每个生命周期方法的意义、作用(注意红色的不是生命周期方法):
setUserVisibleHint():设置Fragment可见或者不可见时会调用此方法。在该方法里面可以通过调用getUserVisibleHint()获得Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。
onAttach():执行该方法时,Fragment与Activity已经完成绑定,该方法有一个Activity类型的参数,代表绑定的Activity,这时候你可以执行诸如mActivity = activity的操作。
onCreate():初始化Fragment。可通过参数savedInstanceState获取之前保存的值。
onCreateView():初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,但是不建议执行耗时的操作,比如读取数据库数据列表。
onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。
onStart():执行该方法时,Fragment由不可见变为可见状态。
onResume():执行该方法时,Fragment处于活动状态,用户可与之交互。
onPause():执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。
onSaveInstanceState():保存当前Fragment的状态。该方法会自动保存Fragment的状态,比如EditText键入的文本,即使Fragment被回收又重新创建,一样能恢复EditText之前键入的文本。
onStop():执行该方法时,Fragment完全不可见。
onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。通常在ViewPager+Fragment的方式下会调用此方法。
onDestroy():销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。
onDetach():解除与Activity的绑定。在onDestroy方法之后调用。

Fragment生命周期执行流程(注意红色的不是生命周期方法):
Fragment创建:setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume();
Fragment变为不可见状态(锁屏、回到桌面、被Activity完全覆盖):onPause()->onSaveInstanceState()->onStop();
Fragment变为部分可见状态(打开Dialog样式的Activity):onPause()->onSaveInstanceState();
Fragment由不可见变为活动状态:onStart()->OnResume();
Fragment由部分可见变为活动状态:onResume();
退出应用:onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(注意退出不会调用onSaveInstanceState方法,因为是人为退出,没有必要再保存数据);
Fragment被回收又重新创建:被回收执行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),重新创建执行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();
横竖屏切换:与Fragment被回收又重新创建一样。

官方生命周期图

 

 

以上是关于Fragment生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Fragment生命周期

Fragment的生命周期

深刻的理解Fragment生命周期 都在做什么,fragment生命周期

Fragment的生命周期

Fragment的生命周期

Fragment和Activity生命周期以及横竖屏切换对生命周期的影响