下图详细解释了 Android 的 Activity 和 Fragment 的生命周期的各个方法,图片来源于 https://github.com/xxv/android-lifecycle
Activity 的生命周期
Activity 各阶段执行的一些方法
开启 Activity
onCreate()
onStart()
onResume()
Activity 失去焦点
onPause()
onStop()
Activity 重新获得焦点
onRestart()
onStart()
onResume()
关闭 Activity
onPause()
onStop()
onDestory()
横竖屏切换的生命周期
onDestory()
onCreate()
onStart()
onResume()
异常状态下的生命周期
1.系统配置改变(如屏幕旋转、键盘、语言等),会出发 Activity 重新创建,若想要这些改变时,不触发 Activity 重启,可以通过在 AndroidManifest 文件里设置 android:configChanges
属性。常用的有locale
(语言区域)、orientation
(屏幕方向)、keyboardHidden
(键盘无障碍功能)、screenSize
(当前可用屏幕尺寸发生了变化,旋转屏幕尺寸会触发)。
android:configChanges="orientation|screenSize|keyboardHidden"
2.系统资源不足,Activity 按照优先级从低到高(后台,可见非前台,前台)被销毁。
3.异常状态下 Activity 的销毁与重建涉及到这两方法:
3.1. onSaveInstanceState(@Nullable Bundle state)
系统会调用它来保存状态,以便之后恢复。
3.2. onRestoreInstanceState(@NonNull Bundle state)
为系统恢复所用。
这两个方法的调用时机是 onSaveInstanceState() 方法在 onStop() 方法之前调用,而不一定在 onPause() 方法之后。 onRestoreInstanceState() 方法在onStart() 方法之后,onResume() 方法之前。
Fragment 的生命周期
只有当 Activity 执行了 onResume()
方法时,Fragment 的生命周期才能独立运转,其它时候都依赖于 Activity 的生命周期而变化。
Fragment 各阶段执行的一些方法。
Fragment 被创建
-
onAttach()
:该方法会在 Fragment 和 Activity 关联后立即调用。从该方法开始就可以通过 Fragment.getActivity() 方法获取其关联的宿主 Activity 对象。但 Fragment 控件还未进行初始化,所以还不能对 Fragment 上的控件进行操作。 -
onCreate(Bundle savedInstanceState)
:可以在 Bundle 对象中获取 Activity 传过来的一些数据。通常情况下,会在该方法中读取保存的状态、获取和初始化一些数据。但不能进行耗时类的操作,否则会使得 Fragment 界面无法显示。 -
onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
:通过该方法创建 Fragment 要显示的 View,其中 inflater 是用来装载布局文件的。saveInstanceState 参数可以获取 Fragment 保存的状态,如果未保存那么就为 null。 -
onActivityCreated()
:在 Activity 的 onCreate() 方法执行完之后, Android 系统会立刻调用该方法,表示 Activity 窗口已经初始化完成,从现在开始,就可以在 Fragment 中使用 getActivity().findViewById(R.id.xxx) 方法来操作 Activity 中的 view 了。
Fragment 可见到可交互
onStart()
onResume()
Fragment 进入“后台模式”
-
onPause()
:通常可以在这个方法中保存一些需要临时暂停的工作。 onStop()
Fragment 被销毁(或它的宿主 Activity 被销毁)
onPause()
onStop()
-
onDestoryView()
:在 onCreateView() 中创建的视图都将被移除。 -
onDestory()
:这时 Fragment 还和 Activity 藕断丝连,并且可以获得 Fragment 对象,但无法对获得的 Fragment 进行任何操作。 -
onDetach()
:当该方法执行完后,Fragment 与 Activity 不再有关联。