一、fragment生命周期
![](https://img.haomeiwen.com/i6645140/fa31a45f0f0a380e.png)
onInflate:在xml文件中用标签语言直接定义时会掉用此方法。
onAttach:fragment被添加到activity中会回调,此方法一次生命周期中只会被调用一次。执行该方法时,fragment已经和activity绑定完成。该方法有一个activity类型参数,代表所绑定的activity,在此方法内可以执行mActivity=activity等此类操作。
onCreate:创建fragment时回调,一次生命周期只会调用一次。可通过savedInstanceState获取之前的保存值。
onCreateView:每次创建、绘制fragment的view组件时回调,会将显示的view返回。性能角度考虑不建议执行耗时操作如数据库数据加载等。
onActivityCreate:当activity启动完成后调用。也就是当activity执行完onCreate方法后并返回。也就是说执行到这个方法后activity才是初始完,在这个方法内fragment才能开始和activity进行交互的UI操作,如若提前进行交互会导致报空。
onStart:启动fragment时被调用。fragment从不可见状态变成可见状态。
onResume:onStart后肯定会调用这个方法,onStart时变为可见,而此方法作用是使fragment可以和用户交互。
“9”:此后进入运行状态。
“10”:一种是activity转到后台,或者fragment被删除替换;二是fragment被加入back栈
onPause:发生“10”中的情况,fragment被暂停时调用。所谓暂停就是说可见,不能与用户交互。
“13”:进入暂停状态。同时onSaveInstanceState()方法被调用,保存当前Fragment的状态值。即使Fragment被回收又重新创建,一样能恢复。
onStop:执行该方法时,Fragment完全不可见。
onDestroyView:销毁与Fragment有关的视图,但未与Activity解除绑定。从fragment的back栈中找回时依然可以通过onCreateView()方法重新创建视图。通常在ViewPager+Fragment的方式下会调用此方法。
onDestroy:销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。
onDetach:解除与Activity的绑定。在onDestroy方法之后调用。onDestroy方法后必定会调用此方法。
解释:
1. 不可见状态:锁屏、回到桌面、被Activity完全覆盖
2. 部分可见状态:打开Dialog样式的Activity
3. 退出应用:onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(退出不会调用onSaveInstanceState方法);
4. 被回收又重新创建/横竖屏切换:被回收执行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),重新创建执行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();(setUserVisibleHint()属于懒加载,严格上说不属于生命周期,其重要程度可以看成一个生命周期中的一环节)
5. 除了onCreateView,其他的生命周期方法如果重写,必须调用父类对于该方法的实现。 因为fragment受到activity生命周期影响。
6. fragment嵌套在activity中,受到activty生命周期影响。当然fragment也可以嵌套在 fragment中,这时其生命周期将会不可控,所以不建议。
7. 官方文档说创建Fragment时至少需要实现三个方法:onCreate( ),onCreateView( ),OnPause( );
8. Fragment的生命周期有:三种状态:
Resumed:在允许中的Fragment可见
Paused:所在Activity可见,但是得不到焦点
Stoped: ①调用addToBackStack(),Fragment被添加到Bcak栈 ②该Activity转向后台,或者该Fragment被替换/删除
一、与activity生命周期相比:
![](https://img.haomeiwen.com/i6645140/207007a2cd2eceac.jpg)
人们学习新的知识总要结合旧的知识进行对比,接受新的认识时也伴随着旧认识的结合。fragment本就依赖于activity,且我们首先掌握的肯定是activity。
与activity比较,从图中可以看到区别在于:
1. onAttach(Activity)
当Activity与Fragment发生关联时调用
2. onCreateView(LayoutInflater,ViewGroup,Bundle);
创建该Fragment的视图,与onCreate有区别
3. onActivityCreate(bundle);
当Activity的onCreate();方法返回时调用,这里看不明白没关系,下面我们细细讨论
4. onDestoryView();
与onCreateView相对应,当改Fragment被移除时调用
5. onDetach();
与onAttach()相对应,当Fragment与Activity的关联被取消时调用
网友评论