你所不知道的Activity生命周期

背景知识

典型的生命周期,就不说了,相信大家一定知道,初学者也可以百度,很多,这里大只记录一下一些生命周期中的细节

先后顺序

  1. onStart 和onResume、onPause 和 onStop的实质性区别:
    其实从实际过程中来说,两者就是差不多的,我们甚至可以只保留一组,但是尽然Android实现了重复接口,肯定有它的意义,其实两者的回调时机不一样,onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从是否位于前台来回调的。

  2. 如果从Activity A跳转到Activity B,那么B的onResume和A的onPause哪一个方法先执行呢?
    我们可以通过源码分析,也可以通过打Log日志来分析,我这边就直接记录结果了,有兴趣的朋友可以自己深入分析一下,或者通过Log来确认一下,旧Activity的onPause方法先调用,然后新Activity才会启动,从另外一个角度讲,Android的官方文档对onPause的解释有这样一句话:不能再onPause中做重量级操作,因为必须onPause执行完成之后新的Activity才能Resume,所以我们知道,不能再onPause和onStop里面做耗时性操作,尤其是onPause如果一定要的话就再onStop中执行。

异常生命周期

  1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
    默认情况下,不会做任何处理,当时系统配置发生改变导致Activity被销毁并重新创建,这个时候Activity的onPause,onStop,onDestroy方法都会被调用,同时,由于是异常中止,所以系统还会调用onSaveInstanceState来保存当前数据,onSaveInstanceState会在onStop之前调用,与onPause没有一定的先后顺序。而且只有在Activity是异常中止的情况下onSaveInstanceState才会被调用。当Activity被重建之后,系统会调用onRestoreInstanceState来获取销毁时保存的数据,并且以Bundle的形式传递给当前方法和onCreate方法,因此我们可以通过onCreate和onRestoreInstanceState来分析Activity有没有被创建,从时序上来说onRestoreInstanceState的调用在onStart之后。同时我们需要知道onSaveInstanceState和onRestoreInstanceState都只有在Activity被异常中止的时候才会被调用,正常是不会的,而且数据的存储和恢复,都是系统自动帮我们完成的
  2. 资源内存不足导致优先级低的Activity被杀死
    Activity的优先级分为三种:
  3. 前台Activity——正在和用户交互的Activity,优先级最高。
  4. 可见但非前台Activity——比如被一个弹出的对话框覆盖,用户可见,但是无法进行直接交互。
  5. 后台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 当布局的方向发生改变时

你可能感兴趣的:(你所不知道的Activity生命周期)