前言
以前学习的 Android 知识杂乱无章,形成不了一个完整的知识体系,因此打算根据知识星球的内容,完整的过一遍,首先来复习一下 Activity。Activity 是 Android 四大组件中最为重要的一个,负责直接与用户交互,先来看看 Activity 的生命周期。
生命周期
官方文档给出了下面这个图

onCreate(Bundle)是Activity中除了attachBaseContext以外的第一个回调方法,该方法一般用于调用setContentView,如果在该方法内直接调用finish那么该方法执行完后会直接执行onDestroy。onStart()当Activity可见时回调,注意可见不代表 Activity 的 UI 被显示出来,因为 View 的三大流程需要在 onResume 回调完后才会开始。onResume()当 Activity 获得了焦点后回调(开始可以与用户交互),同样的,Activity 的 UI 也没被显示出来,因此在该方法中直接获取 View 的宽高拿到的都是0,回调完该方法 Activity 就处于运行状态了。onPause()当 Activity 失去了焦点后回调,该方法后面可能会调用 onStop、onResume 或者可能被系统杀死。onStop()当 Activity 不可见时回调,该方法后面可能会调用onDestory、onRestart或者可能被系统杀死onRestart()当 Activity 处于 stop 状态后,又被切换到的前台时回调,该方法后面紧跟着onStart回调。onDestroy()当Activity 将要被销毁后调用,可能的情况是finish方法被调用或者配置改变时(没有配置configChange)时回调,该回调中可以做一些资源回收等操作
重点
- 当 Activity A 启动一个透明的 Activity 或者一个 Dialog 主题的 Activity 时,A 的 onStop 不会调用,因为其还可见。
- 当 Activity A 开启一个 Dialog,不会调用 A 的任何生命周期方法。
- 当 Activity A 开启 Activity B 会调用 A.onPause - B.onCreate - B.onStart - B.Resume - A.onStop (视情况,当A完全不可见时会调用)。
- 当 Activity A 启动 Activity B 然后点击 back 键会回调 B.onPause - (如果 A 处于 stop 状态还有 A.onRestart - A.start)A.onResume - B.onStop - B.onDestroy。
- 当 Activity A 失去焦点后,当内存不足时系统可能会将 A 杀死,当点击回退后会调用A的 onCreate - onStart - onResume 进行重建。
Fragment 的生命周期与 Activity 的关系
首先来看看Fragment的生命周期
onAttach(Activity)当 Fragment 与 Activity 建立联系时调用。onCreate(Bundle)当初始化创建 Fragment 的时候回调。onCreateView(LayoutInflate, ViewGroup, Bundle)创建和返回 Fragment 显示的根 View。onViewCreated(View)在 onCreateView 执行完毕后就调用。onActivityCreated(Bundle)当与 Fragment 相联系的 Activity 完成了 onCreate 回调。onStart()当 Fragment 可见时回调。onResume()当 Fragment 获取焦点时回调。onPause()当 Fragment 失去焦点时回调。onStop()当 Fragment 不再可见时回调。onDestoryView()用于清除与 Fragment 相关联 View 的资源。onDestory()当 Fragment 将要被销毁时调用。onDetach()当调用该方法后 Fragment 就与 Activity 失去联系了。
假设有 Activity A 在 onCreate 通过 replace 方法显示了 Fragment F,生命周期调用顺序为 A.onCreate - A.onStart - F.onAttach - F.onCreate - F.onCreateView - F.onViewCreated - F.onActivityCreated - F.onStart - A.onResume - F.onResume。
Activity 与 menu 创建先后顺序
在 Activity 的 onResume 调用完后会回调 onCreateOptionMenu 来创建 Menu。
onSavedInstanceState() 和 onRestoreInstanceState()
onSavedInstanceState当 Activity 被意外的杀死或者是当配置方式改变后会回调 onSavedInstanceState 在 API28 及以上其调用时机在 onStop 之后,在 API28 之前调用时机 onStop 之前与 onPause 无时序关系。onRestoreInstanceState再次启动后我们可以在 onRestoreInstanceState 中恢复 onSavedInstanceState 保存的数据。