正常的Activity的生命周期中,当在一个oldActivity中启动一个新的newActivity时,先调用oldActivity的onPause方法,然后调用newActivity的onCreate-->onStart-->onResume,执行这三个方法之后,才开始执行oldActivity的onStop方法,所以在oldActivity的onPause方法中,不能进行耗时操作
1.第一种情况,资源相关的系统配置发生改变导致Activity被杀死并重新创建
Activity-->意外情况-->onSaveInstanceState-->onPause-->onStop-->onDestroy
重新启动时调用-->onCreate-->onStart-->onRestoreInstanceState,这两个方法中的savedInstanceState参数即保留这上次意外停止时的信息,
2.第二种情况,系统内存不足导致低优先级的Activity被杀死
低优先级的Activity会在内存不足时被杀死
优先级高:正在前台且可见的Activity
优先级中:不在前台,但是可见的Activity(如在Activity中弹出弹窗)
优先级低:不在前台不可见
需要注意的是onSaveInstanceState只有在非正常退出才会执行,且执行后再重启onRestoreInstanceState的参数一定有值,而onCreate的参数在首次启动时是没有值的,所以如果在onCreate中恢复数据时需要判空,官方建议在onRestoreInstanceState方法中恢复数据
第一种情况下,如果不想销毁Activity重新创建,则需要制定configChanges属性.常用的有:
locale:设备本地位置发生了改变,一般指切换了系统语言
orientation:屏幕方向发生了改变
keyboardHidden:键盘的可访问性放生了改变,比如用户调出了键盘
screenSize:屏幕尺寸发生了改变,当旋转屏幕时,屏幕尺寸也会发生改变,当编译选项中的minSdkVersion和tarSdkVersion都低于13时,此选项不会导致Activity重启,否则会导致Activity重启