背景知识
典型的生命周期,就不说了,相信大家一定知道,初学者也可以百度,很多,这里大只记录一下一些生命周期中的细节
先后顺序
onStart 和onResume、onPause 和 onStop的实质性区别:
其实从实际过程中来说,两者就是差不多的,我们甚至可以只保留一组,但是尽然Android实现了重复接口,肯定有它的意义,其实两者的回调时机不一样,onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从是否位于前台来回调的。如果从Activity A跳转到Activity B,那么B的onResume和A的onPause哪一个方法先执行呢?
我们可以通过源码分析,也可以通过打Log日志来分析,我这边就直接记录结果了,有兴趣的朋友可以自己深入分析一下,或者通过Log来确认一下,旧Activity的onPause方法先调用,然后新Activity才会启动,从另外一个角度讲,Android的官方文档对onPause的解释有这样一句话:不能再onPause中做重量级操作,因为必须onPause执行完成之后新的Activity才能Resume,所以我们知道,不能再onPause和onStop里面做耗时性操作,尤其是onPause如果一定要的话就再onStop中执行。
异常生命周期
- 资源相关的系统配置发生改变导致Activity被杀死并重新创建
默认情况下,不会做任何处理,当时系统配置发生改变导致Activity被销毁并重新创建,这个时候Activity的onPause,onStop,onDestroy方法都会被调用,同时,由于是异常中止,所以系统还会调用onSaveInstanceState来保存当前数据,onSaveInstanceState会在onStop之前调用,与onPause没有一定的先后顺序。而且只有在Activity是异常中止的情况下onSaveInstanceState才会被调用。当Activity被重建之后,系统会调用onRestoreInstanceState来获取销毁时保存的数据,并且以Bundle的形式传递给当前方法和onCreate方法,因此我们可以通过onCreate和onRestoreInstanceState来分析Activity有没有被创建,从时序上来说onRestoreInstanceState的调用在onStart之后。同时我们需要知道onSaveInstanceState和onRestoreInstanceState都只有在Activity被异常中止的时候才会被调用,正常是不会的,而且数据的存储和恢复,都是系统自动帮我们完成的 - 资源内存不足导致优先级低的Activity被杀死
Activity的优先级分为三种: - 前台Activity——正在和用户交互的Activity,优先级最高。
- 可见但非前台Activity——比如被一个弹出的对话框覆盖,用户可见,但是无法进行直接交互。
- 后台Activity——已经被暂停的Activity比如已经执行了onStop,优先级最低。
当系统内存不足的时候,系统就会按照上述的优先级来杀死目标Activity所在的进程,并且通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。
总结
我们知道了,当系统配置发生改变的时候我们的Activity会被杀死和重建,当然我们也可以配置,告诉系统,我们不想重建,比如:横屏的时候我不想重建Activity,我就可以配置configChanges属性来实现
android:configChanges="orientation"
如果我们想指定多个值我们可以通过'|'来连接起来比如:
android:configChanges="orientation|keyboardHidden"
虽然configChanges的值有很多,但是我们常用的也就locale、orientation和keyboardHidden,这三个,下面是所有属性的介绍,大家可以了解一下:
项目 | 含义 |
---|---|
mcc | 此项表示mcc代码发生了改变(SIM卡唯一标识IMSI 中的国家代码) |
mnc | 此项表示mnc代码发生了改变(SIM卡唯一标识IMSI 中的运营商代码) |
locale | 本地位置发生改变,一般指切换了系统语言 |
touchscreen | 触摸屏发生了改变(正常不会发生可以忽略) |
keyboard | 键盘类型发生了改变(用户外接键盘) |
keyboardHidden | 键盘的可访问性发生改变 |
navigation | 系统当行方式发生了改变 |
screenLayout | 屏幕布局发生了改变 |
fontScale | 系统字体缩放比例发生改变 |
uiMode | 用户界面模式发生了改变(夜间模式) |
orientation | 屏幕方向发生了改变(很常用,选转屏幕) |
screenSize | 屏幕的尺寸信息发生了改变 |
smallestScreenSize | 设备的物理屏幕尺寸发生改变 |
layoutDirection | 当布局的方向发生改变时 |