序言
Fragment从Android v3.0版本开始引入的,随着界面布局的复杂化,处理起来也更加的复杂,引入Fragment可以把Activity拆分成多个部分。一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期控制。
Fragment生命周期流程图
正文
1. 生命周期简介
Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。Fragment状态与Activity类似,也存在如下4种状态:
- 运行:当前Fmgment位于前台,用户可见,可以获得焦点。
- 暂停:其他Activity位于前台,该Fragment依然可见,只是不能获得焦点。
- 停止:该Fragment不可见,失去焦点。
- 销毁:该Fragment被完全删除,或该Fragment所在的Activity被结束。
2. 生命周期状态
Fragment的生命周期与Activity的生命周期十分相似,如下图所示:
Activity和Fragment生命周期对比流程图
从上图可以看出,Activity中的生命周期方法,Fragment中基本都有,但是Fragment比Activity多几个方法。各生命周期方法的含义如下:
- onAttach() :
当Fragment与Activity发生关联时调用。
- onCreate():
创建Fragment时被回调。
- onCreateView():
每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View 组件。
- onActivityCreated():
当 Fragment 所在的Activity被启动完成后回调该方法。
- onStart():
启动 Fragment 时被回调,此时Fragment可见。
- onResume():
恢复 Fragment 时被回调,获取焦点时回调。
- onPause():
暂停 Fragment 时被回调,失去焦点时回调。
- onStop():
停止 Fragment 时被回调,Fragment不可见时回调。
- onDestroyView():
销毁与Fragment有关的视图,但未与Activity解除绑定。
- onDestroy():
销毁 Fragment 时被回调。
- onDetach():
与onAttach相对应,当Fragment与Activity关联被取消时调用。
3. 生命周期调用
1)创建Fragment
onAttach() —> onCreate() —> onCreateView() —> onActivityCreated() —> onStart() —> onResume()
2)按下Home键回到桌面 / 锁屏
onPause() —> onStop()
3)从桌面回到Fragment / 解锁
onStart() —> onResume()
4)切换到其他Fragment
onPause() —> onStop() —> onDestroyView()
5)切换回本身的Fragment
onCreateView() —> onActivityCreated() —> onStart() —> onResume()
6) 按下Back键退出
onPause() —> onStop() —> onDestroyView() —> onDestroy() —> onDetach()
参考
结语
至此,Fragment的生命周期介绍完毕。Fragment具有与Activity很相似的生命周期,依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。
源码注释
onAttach
当 fragment 首次附加到其上下文时调用。之后将调用onCreate(Bundle)。
onCreate
调用它来进行 fragment 的初始创建。这是在onAttach(Context)之后和onCreateView(LayoutInflater, ViewGroup, Bundle)之前调用的。
请注意,这可以在 fragment 的 activity 仍然处于创建过程中时调用。因此,此时您不能依赖于正在初始化的活动的内容视图层次结构之类的东西。如果你想在 activity 本身被创建后立即执行工作,请查看 onActivityCreated(Bundle)。
任何恢复的子 fragments 都将在 base Fragment.onCreat 方法返回之前创建。
onCreateView
调用此函数以使 fragment 实例化其用户界面视图。这是可选的,非图形化片段可以返回null。这将在onCreate(Bundle)和onActivityCreated(Bundle)之间调用。
在构造函数中调用Fragment(int)可以返回默认视图。否则,此方法返回null。
建议只在此方法中扩展布局,并将操作返回视图的逻辑移动到onViewCreated(View, Bundle)。
如果你从这里返回一个视图,当视图被释放时,你将在onDestroyView中被调用。
参数:
扩展器——LayoutInflater对象,可用于扩展片段中的任何视图,
容器——如果非空,这是片段的UI应该附加到的父视图。片段不应该添加视图本身,但是这可以用来生成视图的LayoutParams。
savedInstanceState—如果非空,则此片段将按照这里给出的方式,从先前保存的状态重新构造。
返回:
返回片段UI的视图,或null。
onActivityCreate
在 fragment 的 activity 被创建完成并且实例化了该 fragment 的视图层次结构时调用。一旦这些部分就位,就可以使用它进行最后的初始化,例如检索视图或恢复状态。对于使用setRetainInstance(布尔值)来保留它们的实例的片段也很有用,因为这个回调会在片段与新的活动实例完全关联时告诉它。这是在onCreateView之后和onViewStateRestored(Bundle)之前调用的。
参数:
savedInstanceState—如果片段是从以前保存的状态重新创建的,那么这就是状态。
onViewStateRestored
当保存的所有状态都恢复到片段的视图层次结构中时调用。这可以用于根据保存的视图层次结构跟踪自身的状态(比如当前是否选中复选框小部件)进行初始化。这是在onActivityCreated(Bundle)之后和onStart()之前调用的。
参数:
savedInstanceState—如果片段是从以前保存的状态重新创建的,那么这就是状态。
onStart
当 fragment 对用户可见时调用。这通常与作为容器的Activity的生命周期 的Activity.onStart 方法相关联。
在 Activity.onStart 方法之前回调。
onResume
当 fragment 对用户可见并正在运行时调用。这通常与作为容器的Activity的生命周期 的Activity.onResume 方法相关联。
在 Activity.onResume 方法之后回调。
onPause
Called when the Fragment is no longer resumed. This is generally tied to Activity.onPause of the containing Activity's lifecycle.
当片段不再恢复时调用。这通常与作为容器的Activity的生命周期 的Activity.onPause 方法相关联。
在 Activity.onPause 方法之前回调。
onSaveInstanceState
调用此函数以要求 fragment 保存其当前动态状态,以便稍后可以在其流程的新实例中重新启动它。如果稍后需要创建片段的新实例,那么您放置在此包中的数据将在提供给onCreate(Bundle)、onCreateView(LayoutInflater、ViewGroup、Bundle)和onActivityCreated(Bundle)的 Bundle 中可用。
这对应于Activity.onSaveInstanceState(Bundle),这里的大部分讨论也适用于这里。但是注意:这个方法可以在onDestroy()之前的任何时候调用。在很多情况下,一个片段可能会被撕下来(例如当它被放在后台堆栈上而没有UI显示时),但是它的状态将不会被保存,直到它所拥有的 Activity 实际上需要保存它的状态。
参数:
outState—将保存的状态放置在其中的Bundle。
onStop
Called when the Fragment is no longer started. This is generally tied to Activity.onStop of the containing Activity's lifecycle.
当片段不再启动时调用。这通常与作为容器的Activity的生命周期 的Activity.onStop 方法相关联。
在 Activity.onStop 方法之前回调。
onDestroyView
当先前由onCreateView创建的视图与 fragment 分离时调用。下一次需要显示片段时,将创建一个新视图。这是在onStop()之后和onDestroy()之前调用的。不管onCreateView是否返回非空视图,它都会被调用。在内部,它在视图的状态被保存后调用,但在从其父视图中删除之前调用。
onDestroy
当片段不再使用时调用。这是在onStop()之后和onDetach()之前调用的。
onDetach
当 fragment 不再附加到其 Activity 时调用。这在onDestroy()之后调用。
git地址:https://github.com/First-Time/LifeCycleDemo.git