生命周期图:

Activity生命周期 - 图1

这个图好像有点老了,我们可以看看最新官方给出的Activity生命周期方法图。

image.png

正常生命周期分析

  1. onCreate: 表示 Activity 正在被创建,在这个方法中可以做一些初始化操作。
  2. onRestart: 表示 Activity 正在重新启动。一般情况下,当当前 Activity 从不可见重新变为可见状态时,此方法会被调用。
  3. onStart: 表示 Activity 正在被启动,即将开始,这时 Activity 已经可见,但是还没有出现在前台,还不能和用户交互。可以理解为 Activity 已经出来了,但是还看不到,无法交互。
  4. onResume: 表示 Activity 已经可见,已经出现在前台并开始活动。onStart 和 onResume 都表示 Activity 已经可见,但是 onStart 时 Activity 还在后台,onResume 时才显示到前台。
  5. onPause: 表示 Activity 正在停止,正常情况下,onStop 就会被调用。此时可以做一些储存数据、停止动画等操作,不要做耗时操作,这会影响到新的 Activity 的显示,onPause 必须先执行完,新的 Activity 才会执行 onResume 方法。
  6. onStop: 表示 Activity 即将停止,可以做一些 稍微重量级的回收工作,不要太耗时。
  7. onDestroy: 表示 Activity 即将被销毁,这里可以做一些回收工作和最终资源的释放。

    问题

  8. onStart 和 onResume、onPause 和 onStop 的区别?
    onStart和 onStop 是从Activity是否可见这个角度来看的,而onResume 和 onPause 是从 Activity 是否位于前台来回调的。

  9. 假设当前 Activity 为 A,这时用户打开一个新的 Activity B, 那么B的 onResume 和 A 的 onPause 哪个先执行?
    生命周期顺序如下:先是 A 的 onCreate -> onStart -> onResume, 点击跳转后先执行A的onPause , 然后开始执行 B 的 onCreate -> onStart -> onResume,然后是 A 的 onStop.
    当点击关闭 B 时,先执行 B 的 onPause , 然后执行 A 的 onRestart -> onStart -> onResume , 然后再执行 B 的 onStop -> onDestroy .

    异常情况下的生命周期分析

  10. 资源相关的系统配置发生改变导致 Activity 被杀死并重新创建
    常见如屏幕横竖屏切换,导致 Activity 被重建,默认情况下不作处理,生命周期如下:
    onCreate -> onStart -> onResume, 切换时 onPause -> onSaveInstanceState -> onStop
    -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume.
    Activity 被终止时,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态, 这个方法的调用时机是在 onStop 之前,它和 onPause 没有既定的时序关系,可能在 onPause之前,也可能在之后。onSaveInstanceState 只会出现在 Activity 被异常终止的情况下, 当 Activity 被重新创建后会调用 onRestoreInstanceState 方法,并把 Activity 销毁时 onSaveInstanceState 方法所保存的 Bundle 对象作为参数同时传递给 onCreate 和 onRestoreInstanceState, onRestoreInstanceState 调用时机在 onStart 之后。系统只有在 Activity 异常终止的时候才会调用 onSaveInstanceState 和 onRestoreInstanceState 方法来存储和恢复数据,其他情况不会触发这个过程。

  11. 当系统内存资源不足时,系统就会按照上述优先级杀死目标 Activity 所在的进程, 并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此一些后台工作不适合脱离四大组件而独自运行在后台,比较好的方法是将后台工作放入 Service。
  12. 资源内存不足导致低优先级的 Activity 被杀死
    数据恢复情况和1中一致。
    1. 前台 Activity ———— 正在和用户进行交互的 Activity,优先级最高。
    2. 可见但非前台 Activity——— 例如 Activity 中弹出了一个对话框。
    3. 后台 Activity———— 已经被暂停的 Activity,优先级最低。
  13. 设置了 configChanges,设置android:configChanges=”orientation|screenSize”就可以了,screenSize是为了防止旋转屏幕时 Activity 重启。屏幕旋转生命周期变化如下:

创建时:onCreate -> onStart -> onResume
屏幕旋转: onConfigurationChanged

  1. configChanges 的项目和含义

image.png

参考

安卓-如何用正确的姿势监听Android屏幕旋转
你应该知道的Activity状态的保存与恢复
Android基础:3分钟全面解析Activity生命周期