背景介绍:
今天面试,面试官问了很多Java、android方面细节的事情,比如说String、StringBuffer、StringBuilder、CharSequenece之间的区别,lanuchMode的四种模式应用场景、多线程的内部处理机制。而令我最印象深刻的是ViewPager 中Fragment 与一般Fragment生命周期的区别 ?
虽然在项目中反复使用了viewPager、Fagment,但因为viewPager良好的封装性,使得在简单使用的时候不用了解更深层次的内部结构。但是,因为fagment真的太常用了,所以我们今天来聊一聊fragment复杂的生命周期。
一般Fragment生命周期
fragment依赖于activity,所以他们生命周期是对应,顺便说一下Application的生命周期是包含activity,activity生命周期包含fragment,现在我们看看下面官方给出的Fragment LifeCycle:
生命周期:
1.onAttach(Activity): fragment 第一步是与activity绑定,当你想在这个阶段做点什么,就可以在fagment中复写这个方法;
2.onCreate(Bundle) : fragment 的 onCreate()方法;
3.onCreateView(LayoutInflater, ViewGroup, Bundle): 这个方法用得比较多,一般用来inflate布局,还可以通过Bundle恢复数据;
4.onActivityCreate(Bundle): 当activity调用onCreate()并完成后,通知fragment调用这个方法;
5.onViewStateRestore(Bundle): 保存下来的视图层次结构恢复成功后调用这方法;
6. onStart(): 对应于activity的onStart()方法;
7.onResume(): 对应于activity 的onResume()方法,fragment开始可见,fragment只有处于这个阶段才可以被替换或增加fagment,也就是说fragmentManager对fragment的管理只能在这个阶段进行;
8.onPause(): fragment处于这个状态有两个原因;一是对应的activity处于这个状态,二是正在对fragment进行某种操作(比如删除fragment、替换fragment);
9.onStop(): 与onPause()相似,同样的两个原因;
10. onDestroyView(): 仅仅是清除视图;
11. onDestroy(): 调用此方法清除fragment的状态;
12. onDetach(): 解除绑定;
以上就是一般的fragment(不与viewpager绑定;在layout中作为自定义控件,或者是在代码中引用)的生命周期,它与activity有很密切的对应关系,可以总结为如下逻辑图:
ViewPager中fragment生命周期介绍:
因为在ViewPager中fragment的管理是由adapter负责的。
对于FragmentPagerAdapter,当前视图的上一页仅视图被销毁了,所以它的onCreateView()会被调用到。
对于FragmentStatePagerAdapter,当前视图的上一页实例被销毁了,所以getItem()会被再次调用,整个Fragment对应的生命周期函数会再走一遍。
运行一个实例来说明:
下面是相关的生命周期函数调用情况:
当刚启动一个Activity时,Activity和Fragment都将被创建:
当Activity进入后台后:
当Activity返回前台后:
当Activity被销毁后:
最后总结:viewpager 中 使用 FragmentPagerAdapter 管理fragment时 和fragment 压到返回栈时都是调用onDestroyView() ———> onCreateView()来重新生成,而其他情况下都需要重新跑一遍生命周期。
注:Fragment的返回栈由Activity管理;而Activity的返回栈由系统管理
最后放一张概括周全的总结图:
参考: 01 https://segmentfault.com/q/1010000003719990
03 A Visualization of the Android Activity & Fragment Lifecycle