异常情况
1. 内存不足
Activity按优先级从高到低,分为以下三种:
(1)前台Activity——交互中的Activity
(2)可见但非前台Activity——比如Activity中弹出一个对话框
(3)后台Activity——被暂停的Activity,比如执行了onStop();
内存不足时,系统会按照以上优先级去杀死目标Activity所在的进程,如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死。
2. 资源相关的的系统配置发生改变
进行旋转屏幕等操作时会导致系统配置发生变化,Activity重新创建。
系统的数据保存与恢复机制
上述1、2情况,Activity异常终止时,系统都会调用onSaveInstanceState方法来保存当前Activity的状态到一个Bundle对象中,在Activity被重新创建后,该Bundle对象将作为参数同时传递给onCreate和onRestoreInstanceState方法,我们可以在这两个方法中进行数据恢复操作。
注意:在onCreate方法中操作Bundle对象时需要对其进行判空,因为Activity正常退出时,不会有Bundle对象。
而onRestoreInstanceState方法一旦被调用,Bundle对象一定是有值的,不用再额外判空。
阻止Activity被重新创建
对于上述情况2,我们可以通过在AndroidMenifest.xml的对应activity标签指定configChanges属性,阻止Activity重新创建。常用的值有以下几个:
android:configChanges="orientation|keyboardHidden|local"
上述3个值分别表示:
*屏幕旋转
*键盘的可访问性变化,比如用户调出了键盘
*设备的本地位置变化,一般指切换了系统语言
指定了这3个值,当发生这3种变化时,该Activity不会被重新创建。