下图详细解释了 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:configChangeds
属性。常用的有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 saveInstanceState)
: 可以在Bundle对象中获得Activity传来的一些数据。通常情况下,会在该方法中读取保存的状态,获取和初始化一些数据。但不能进行一些耗时操作,否则会造成卡顿甚至Fragment页面无法显示。 -
onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
:通过该方法创建Fagment要显示的View,其中inflater是用来装载布局文件的。saveInstanceState 参数可以获取Fragment保存的状态,如果未保存则为null 。 -
onActivityCreated()
:在Activity的onCreate()方法执行完了之后,Android系统会立刻调用该方法,表示Activity窗口已经初始化完成,从现在开始,就可以在Fragment中使用getActivity().findViewById(R.id.***)方法来操作Activity中的view了。
Fragment可交互
onStart()
onResume()
Fragment进入“后台模式”
-
onPause()
: 通常在这个方法中保存一些需要临时暂停的工作。 onStop()
Fragment被销毁(或是它的宿主被销毁)
onPause()
onStop()
-
onDestoryView()
:在onCreateView中创建的视图都将被移除。 -
onDestory()
:这是Fragment还和Activity藕断丝连,并且可以获得Fragment对象,但无法对获得的Fragment进行任何操作。 -
onDetach()
:该方法执行完了以后Fragmnet将不会与Activity有任何联系 。