Activity 的生命周期分为两种情况,一种是典型情况下的生命周期,另一种是异常情况下的生命周期。
- 典型情况:指在有用户参与的情况下,Activity 经过的生命周期的改变。
- 异常情况:指 Activity 被系统回收或者由于设备的 Configuration 发生改变从而导致 Activity 被销毁重建。
典型情况的生命周期
正常情况下,Activity 会经历如下的生命周期。
- onCreate:表示 Activity 正在被创建。这个方法中,可以做一些初始化工作,比如 setContentView 去加载界面布局资源,初始化 Activity 所需数据等。
- onStart:表示 Activity 已经被启动,即将开始,此时 Activity 已经可见,但是还没有出现在前台,无法于用户交互。可以理解为 Activity 已经显示出来了,但是我们看不到。
- onResume:表示 Activity 已经可见,并且出现在前台开始活动。
- onPause:表示 Activity 正在停止。这时可以做一些存储数据、停止动画等工作,注意不能太耗时,否则会影响到新的 Activity 的显示,onPause 必须先执行玩,新 Activity 的 onResume 才会执行。
- onStop:表示 Activity 即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
- onRestart:表示 Activity 正在重新启动。一般情况下,当前 Activity 从不可见重新变为可见状态时,onRestart 就会被调用。
-
onDestroy:表示 Activity 即将被销毁,可以做一些回收工作和最终资源的释放。
Activity 生命周期
针对上图,具体情况分为以下几种。
- 第一次启动一个特定的 Activity,回调:onCreate -> onStart -> onResume。
- 当用户打开新的 Activity 或者切换到桌面,回调如下:onPause -> onStop。
新的 Activity 采用了透明主题的话,当前 Activity 不会回调 onStop。 - 再次回到原 Activity,回调如下:onRestart -> onStart -> onResume。
- 按返回键时,回调如下:onRestart -> onStart -> onResume。
- 当 Activity 被系统回收再次打开,生命周期如同 1。
- onStart 和 onPause 主要区别是否位于前台。
- onPause 执行完成之后新 Activity 才能 Resume,不能在 onPause 中做重量级的操作,应当尽量在 onStop 中做操作,从而使得 新 Activity 尽快显示出来并切换到前台。
异常情况下的生命周期
当资源相关的系统配置发生改变以及系统内存不足时,Activity 就可能被杀死。
-
资源相关的系统配置发生改变导致 Activity 被杀死并重新创建
默认情况下,如果 Activity 不做特殊处理,当系统配置发生改变后,Activity 就会被销毁并重新创建。
异常情况下 Activity 的重建过程
当系统配置发生改变后,Activity 会被销毁,其 onPause、onStop、onDestory 均会被调用,同时由于 Activity 是在异常情况下终止的,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态,可能在 onPause 之前也可能在 onPause 之后,这个方法只有在 Activity 被异常终止的情况下才会被回调。
当 Activity 被重新创建之后,系统会调用 onRestoreInstanceState 方法 把 Activity 销毁时 onSaveInstanceState 方法保存的 Bundle 对象作为参数传递给 onRestoreInstanceState 和 onCreate 方法。可以通过 onRestoreInstanceState 和 onCreate 方法来判断 Activity 是否被重建,从时序上来说,onRestoreInstanceState 在 onStart 之后。 -
资源不足导致低优先级的 Activity 被杀死
Activity 按照优先级从高到低,可以分为三种:
- 前台 Activity:正在和用户交互的 Activity,优先级最高。
- 可见但非前台 Activity:比如Activity 中弹出一个对话框,导致对话框可见但是位于后台无法于用户直接交互。
- 后台 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 三个选项。
网友评论