正常的生命周期分析
Activity各回调方法
-
onCreate
- 何时:Activity正在被创建。
- 作用:进行初始化工作,如setContentView(界面资源)、初始化Activity所需数据。
- 注意:此方法的传参Bundle为该Activity上次被异常情况销毁时保存的状态信息。
-
onRestart
- 何时:Activity正在重新启动。当前Activity从不可见重新变为可见。
-
onStart
- 何时:Activity正在被启动。此时Activity已可见,但还不在前台,还无法和用户交互。
-
onResume
- 何时:Activity已在前台。
-
onPause
- 何时:Activity正在停止。当前Activity已不在前台。
- 作用:你需要保存更改到持久数据、停止一些动画、停止一些耗时CPU操作等。
- 注意:
- 此方法不可做耗时操作。onPause()必须先执行完,新Activity的onResume()才会执行。
- 正常情况下,onStop()会紧接着被调用,但若此时快速地再回到当前Activity,那么onResume()会被调用。(极端情况,难以重现)
-
onStop
- 何时:Activity即将停止。当前Activity已不可见。
- 作用:在此方法中,可做一些稍微重量级的回收工作,如:取消网络连接、注销广播接收器等。
-
onDestroy
- 何时:Activity即将被销毁。
- 作用:做回收工作和最终的资源释放。
生命周期的切换过程
Activity生命周期- 第一次启动,回调如下:
onCreate -> onStart -> onResume
; - 当用户打开新的Activity时,回调如下:
A onPause -> B onCreate -> B onStart -> B onResume -> A onStop
。注意,若新的Activity采用了透明主题,那么当前Activity不会回调onStop
; - 当用户再次回到原Activity时,回调如下:
onRestart -> onStart -> onResume
; - 当前Activity在前台,用户按back键时,回调如下:
onPause -> onStop -> onDestroy
; - 当前Activity在前台,用户按Home键时,回调如下:
onPause -> onStop
; - 当前Activity在前台,用户锁屏时,回调如下:
onPause -> onStop
。
生命周期的各阶段
-
完整生命周期
- Activity在
onCreate()
和onDestroy()
之间所经历的。 - 在
onCreate()
中完成各初始化操作;在onDestroy()
中释放资源。
- Activity在
-
可见生命周期
- Activity在
onStart()
和onStop()
之间所经历的。 - 活动对于用户是可见的,但仍无法与用户进行交互。
- Activity在
-
前台生命周期
- Activity在
onResume()
和onPause()
之间所经历的。 - 活动可见,且可交互。
- Activity在
异常的生命周期分析
onSaveInstanceState
和onRestoreInstanceState
-
Activity的
onSaveInstanceState
和onRestoreInstanceState
- 出现异常情况;
- Activity被销毁,回调
onPause -> onStop -> onDestroy
; - 因为Activity是在异常情况下终止的,系统会调用
onSaveInstanceState
来保存当前Activity的状态。此方法在onStop
之前调用。它与onPause
没有既定的时序关系。 - Activity被重新创建,回调
onCreate -> onStart -> onResume
; - 系统会将上次异常终止时保存的状态传递
onRestoreInstanceState
和onCreate
。onRestoreInstanceState
会在onStart
之后被调用。
-
View的
onSaveInstanceState
和onRestoreInstanceState
- 出现异常情况;
- Activity被销毁,系统会默认保存当前Activity的视图结构:
- Activity调动
onSaveInstanceState
去保存数据; - 然后Activity会委托Window去保存数据;
- Window再委托它的顶级ViewGroup去保存数据;
- 其顶级ViewGroup再一一调用它的子视图View的
onSaveInstanceState
来保存数据。
- Activity调动
- Activity被重新创建,系统会恢复上次异常终止时保存的视图结构,其
onRestoreInstanceState
流程与上面类似,也是上层委托下层。
内存不足导致的生命周期
-
Activity的优先级
- 前台Activity —— 正在和用户交互,优先级最高;
- 可见但不在前台的Activity —— 比如Activity中有弹窗,导致其可见但不在前台,无法与用户交互;
-
后台Activity —— 已被停止的Activity,比如执行
onStop
,优先级最低。
-
当系统内存不足时,会按照Activity优先级从低到高去杀死目标Activity所在的进程。
-
若一个进程没有四大组件在执行,那么这个进程将很快被系统杀死。
系统配置改变导致的生命周期
-
当系统配置发生改变后,Activity会被销毁且重新创建。
-
系统配置中有很多内容,若当某项内容发生改变后,我们不想系统重新创建Activity,可给Activity指定
configChanges
属性。之后当指定的系统配置项发生改变时,Activity不会被重新创建,系统仅仅回调其void onConfigurationChanged(Configuration newConfig);
android:configChanges="orientation|keyboardHidden|locale"
系统配置项 | 含义 |
---|---|
mcc | SIM卡唯一标识IMSI中的国家代码发生改变,三位数字。<Br>中国为460。 |
mnc | SIM卡唯一标识IMSI中的运营商代码发生改变,两位数字。<Br>中国移动TD系统为00,联通为01,电信为03。 |
locale | 设备的本地位置发生改变。<Br>如切换了系统语言。 |
touchscreen | 触摸屏发生改变。 |
keyboard | 键盘类型发生改变。<Br>比如用户使用了外接键盘。 |
keyboardHidden | 键盘的可访问性发生改变。<Br>比如用户调出了键盘。 |
navigation | 系统导航方式发生改变。<Br>如采用了轨迹球导航。 |
screenLayout | 屏幕布局发生改变。<Br>如用户激活了另一个显示设备。 |
fontScale | 系统字体缩放比例发生改变。 |
uiMode | 用户界面模式发生改变。<Br>如开启了夜间模式(API8添加)。 |
orientation | 屏幕方向发生改变。<Br>如旋转手机屏幕。 |
screenSize | 屏幕的尺寸信息发生改变。<Br>若minSdkVersion 和targetSdkVersion 都低于13时,此项不生效。 |
smallestScreenSize | 设备的实际物理屏幕尺寸发生改变,这个项和屏幕的方向没有关系。<Br>比如用户切换到外部的显示设备上。<Br>若minSdkVersion 和targetSdkVersion 都低于13时,此项不生效。 |
layoutDirection | 布局方向发生改变。(API17添加) |
网友评论