情况1,资源相关的系统配置发生改变导致Activity被杀死并创建
最简单的例子:当我们把一张图片放在drawable目录后,就可以通过Resource去获取这张图片,同时为了兼容不同的设备,我们可能还需要在其他一些目录放置不同的图片,比如:drawable-mdpi,drawable-hdpi,drawable-xhdpi等。这样,当程序启动时,系统就会根据当前设备的情况去加载合适的Resource资源,比如横屏手机和竖屏手机会拿到 两张不同的图片(设定了landscape或者portrait状态下的图片),如果屏幕突然从竖屏转变为横屏,由于系统配置发生了改变,在默认情况下,Actvity就会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。
当系统配置发生变化后,Activity会被销毁,activity在异常情况下终止时,系统会调用onSaveInstanceState来保存当前Activity的状态,当activity被重新创建之后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同事传递给onRestoreInstanceState和onCreate方法。
情况2,资源内存不足导致低优先级的Activity被杀死
这种情况不太好模拟,但是其数据存储和恢复过程和情况1完全一致,当系统内存不足时,系统会根据Activity优先级(前台Activity,可见但非前台Activity(对话框弹出),后台Activity)去杀死目标activity所在的进程。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不合适脱离四大组件而独立运行在后台中,这样进程很容易被杀死,比较好的方法就是将后台的工作放入Service中从而保证进程也有一定的优先级,这样就不会轻易地被系统杀死。
如果当系统配置发生改变后,要Activity不重新创建,那么就要给Activity指定configChanges属性添加orientation这个值,我们常用的有locale、orientation和keyboardHidden这三个选项,需要注意的是,screenSize和smallestSreenSize,这两个比较特殊,她们的行为和编译选项有关,与运行环境无关。