Android Activity 的生命周期

Activity 的生命周期分为两种情况,一种是典型情况下的生命周期,另一种是异常情况下的生命周期。

  • 典型情况:指在有用户参与的情况下,Activity 经过的生命周期的改变。
  • 异常情况:指 Activity 被系统回收或者由于设备的 Configuration 发生改变从而导致 Activity 被销毁重建。

典型情况的生命周期

正常情况下,Activity 会经历如下的生命周期。

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


    Android Activity 的生命周期_第1张图片
    Activity 生命周期

针对上图,具体情况分为以下几种。

  1. 第一次启动一个特定的 Activity,回调:onCreate -> onStart -> onResume。
  2. 当用户打开新的 Activity 或者切换到桌面,回调如下:onPause -> onStop。
    新的 Activity 采用了透明主题的话,当前 Activity 不会回调 onStop。
  3. 再次回到原 Activity,回调如下:onRestart -> onStart -> onResume。
  4. 按返回键时,回调如下:onRestart -> onStart -> onResume。
  5. 当 Activity 被系统回收再次打开,生命周期如同 1。
  6. onStart 和 onPause 主要区别是否位于前台。
  7. onPause 执行完成之后新 Activity 才能 Resume,不能在 onPause 中做重量级的操作,应当尽量在 onStop 中做操作,从而使得 新 Activity 尽快显示出来并切换到前台。

异常情况下的生命周期

当资源相关的系统配置发生改变以及系统内存不足时,Activity 就可能被杀死。

  1. 资源相关的系统配置发生改变导致 Activity 被杀死并重新创建
    默认情况下,如果 Activity 不做特殊处理,当系统配置发生改变后,Activity 就会被销毁并重新创建。

    Android Activity 的生命周期_第2张图片
    异常情况下 Activity 的重建过程

    当系统配置发生改变后,Activity 会被销毁,其 onPause、onStop、onDestory 均会被调用,同时由于 Activity 是在异常情况下终止的,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态,可能在 onPause 之前也可能在 onPause 之后,这个方法只有在 Activity 被异常终止的情况下才会被回调。
    当 Activity 被重新创建之后,系统会调用 onRestoreInstanceState 方法 把 Activity 销毁时 onSaveInstanceState 方法保存的 Bundle 对象作为参数传递给 onRestoreInstanceState 和 onCreate 方法。可以通过 onRestoreInstanceState 和 onCreate 方法来判断 Activity 是否被重建,从时序上来说,onRestoreInstanceState 在 onStart 之后。

  2. 资源不足导致低优先级的 Activity 被杀死

Activity 按照优先级从高到低,可以分为三种:

  1. 前台 Activity:正在和用户交互的 Activity,优先级最高。
  2. 可见但非前台 Activity:比如Activity 中弹出一个对话框,导致对话框可见但是位于后台无法于用户直接交互。
  3. 后台 Activity:已经被暂停的 Activity,比如执行了 onStop,优先级最低。

当系统内存不足时,系统会按照上诉优先级去杀死目标的 Activity 所在的进程,并在后续通过 onSaveInstanceState 和 onRestoreInstanceState 来存储和回复数据。如果一个进程中没有四大组件在执行,这个进程就会很快被系统杀死。一些后台工作可以放到 Service 中从而保证一定的优先级,这样就不会轻易被系统杀死。

系统配置

系统配置发生改变之后,Activity 会被重新创建,如果不想系统配置某项内容发生改变之后,系统重新创建 Activity,就可以给 Activity 指定 configChanges 属性。如果想指定多个值,可以用 | 连接起来。

项目 含义
mcc SIM 卡唯一表示 IMSI 中的国家代码,由三位数字组成,中国为460,此项标示 mcc 代码发生改变
mnc SIM 卡唯一表示 IMSI 中的运营商代码,由两位数字组成,中国移动 TD 系统为 00,联通为 01,电信为 03,此项标示 mnc改变
locale 设备的本地位置发生了改变,一般指切换了系统语言
touchscreen 触摸屏发生了改变,正常情况无法发生
keyboard 键盘类型发生了改变,比如用户使用了外部的键盘
keyboardHidden 键盘的可访问性发生了改变,比如用户调出了键盘
navigation 系统导航方式发生了变化,比如采用了轨迹球导航,通常也不会发生
screenLayout 屏幕布局发生了变化,很可能用户激活了另外一个显示设备
fontScale 系统字体缩放比例发生了变化,比如用户选择了新的字号
uiMode 用户界面模式发生了变化,比如开启了夜间模式
orientation 屏幕方向发生了改变,比如选择了手机屏幕
screenSize 屏幕的尺寸信息发生了改变,当旋转设备屏幕时,屏幕尺寸会发生变化,当该选项中的 minSdkVersion 和 targetVersion 均低于 13 时,此选项不会导致 Activity 重启,否则会导致 Activity 重启(API 13 新添加)
smallestScreenSize 屏幕的物理大小改变了,如:连接到一个外部的屏幕上,当该选项中的 minSdkVersion 和 targetVersion 均低于 13 时,此选项不会导致 Activity 重启,否则会导致 Activity 重启(API 13 新添加)
layoutDirection 当布局发生改变,这个属性用的比较少,正常情况下无需修改布局的 layoutDirection 属性,(API 17 新添加)

最常用的是 locale,orientation 和 keyboardHidden 三个选项。

你可能感兴趣的:(Android Activity 的生命周期)