fragment生命周期(总结)

前言:

这篇文章和上一篇文章一样,基本上都是总结,没有给出实际的log日志和片段代码,我觉得这些东西需要自己去实践证实,而不是看到别人贴的代码就认为是对的,上一篇文章是activity的生命周期(总结),后续会一直整理我有道笔记里面总结的一些问题,都是比较实际性的总结,希望对大家有帮助。

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方法之后调用。
setUserVisibleHint():
设置Fragment可见或者不可见时会调用此方法。在该方法里面可以通过调用getUserVisibleHint()获得Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。

Fragment生命周期执行流程:

1、Fragment创建:
setUserVisibleHint()->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();
5、Fragment退出
onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(注意退出不会调用onSaveInstanceState方法,因为是人为退出,没有必要再保存数据);
6、Fragment被回收又重新创建:
被回收执行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),重新创建执行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();
横竖屏切换:与Fragment被回收又重新创建一样。

onHiddenChanged的回调时机

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

FragmentPagerAdapter+ViewPager的注意事项

1、 使用FragmentPagerAdapter+ViewPager时,切换回上一个Fragment页面时(已经初始化完毕),不会回调任何生命周期方法以及onHiddenChanged(),只有setUserVisibleHint(boolean isVisibleToUser)会被回调,所以如果你想进行一些懒加载,需要在这里处理。
2、 在给ViewPager绑定FragmentPagerAdapter时,
new FragmentPagerAdapter(fragmentManager)的FragmentManager,一定要保证正确,如果ViewPager是Activity内的控件,则传递getSupportFragmentManager(),如果是Fragment的控件中,则应该传递getChildFragmentManager()。只要记住ViewPager内的Fragments是当前组件的子Fragment这个原则即可。
3、 你不需要考虑在“内存重启”的情况下,去恢复的Fragments的问题,因为FragmentPagerAdapter已经帮我们处理啦。

setUserVisibleHint()不调用的问题

通常情况下都是因为PagerAdapter不是FragmentPagerAdapter造成的,FragmentPagerAdapter内部实现了对setUserVisibleHint()方法的调用,所以需要懒加载的结构最好使用FragmentPagerAdapter +Fragment的结构,少用PagerAdapter。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值