Activity基础篇之异常情况下生命周期分析
上一篇我们我们讲述了一下正常情况下Activity的生命周期,接下来我们讲一下异常情况下Activity的生命周期。什么叫异常情况下呢?异常情况分为两种:一、资源相关的系统配置发生改变导致Activity被杀死并重新创建;二、资源内存不足导致低优先级的Activity被杀死
一、资源相关的系统配置发生改变导致Activity被杀死并重新创建
我们先来说一下第一种情况,资源相关的系统配置发生改变,什么叫资源相关的系统配置发生改变呢?就是一些系统设置发生了改变,比如从竖屏切换到横屏、手机系统的语言发生改变等等。在默认情况下,如果Activity不做特殊处理的话,系统配置发生改变后Activity是会被销毁然后重建的。其生命周期如下:
上图只是个大概的图,当意外情况发生后,Activity的onPause、onStop、onDestroy还是会被执行,同时,由于在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法是调用在onStop之前,但是不一定是在onPause之前,有可能是在onPause之前,也有可能是在onPause之后,这两者之间并无既定的时序关系。注意:onSaveInstanceState只有在Activity异常情况下被终止时才会调用,正常情况下是不会的。当Activity要重新创建的时候,系统会把onSaveInstanceState保存的一个Bundle对象传递给onCreate方法和onRestoreInstance方法。因此,我们可以通过onCreate和onRestoreInstance方法来判断Activity是否被重新创建了,如果重新创建了,我们只需要取出之前保存的数据(即Bundle对象里面的数据)并恢复即可。从时序上来讲,onRestoreInstance是调用在onStart之后。
其实呢,在onSaveInstanceState和onRestoreInstance方法中,系统已经为我们做了一些恢复的工作了,比如当前Activity的视图结构、ListView的滚动位置、EditText的文本以及文本选中状态等等。这个流程大体上是这样的:首先Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会去通知Window去保存数据,接着window再去通知它的上层顶级容器去保存数据。然后顶级容器再去一一通知它的子元素来保存数据。这样,整个数据保存过程就完成了。而所有的子元素也是通过onSaveInstanceState来保存数据、用onRestoreInstance来恢复数据的。
二、资源内存不足导致低优先级的Activity被杀死
这种情况下的数据保存和数据恢复其实是和上述情况是一样的。这种情况也模拟不出来,因为系统是根据优先级来杀死Activity的,所以无法判断处于后台的Activity什么时候被杀死。
如何在系统配置改变时不重新创建Activity?
创建一个对象都是需要耗时耗资源的,如何让Activity在系统配置改变时不重新创建减少消耗呢?我们只要在Mainfest文件里你不想重新创建的Activity的节点下添加一个属性android:configChanges就行了,属性值这里就不再说了,都是一些概念而已,百度一下就有了。当配置了这个属性之后,Activity即不会重新创建,也不会执行onSaveInstanceState和onRestoreInstance方法。既然配置了这个属性就不会重新创建了,那我们怎么知道系统配置发生改变了呢?Activity还有一个回调方法onConfigurationChanged,通过这个方法可以判断系统配置是否改变了。
注意:当重写onConfigurationChanged一定不能把super.onConfigurationChanged代码去掉,去掉了会报错的。
好了,Activity基础篇之异常情况下生命周期分析就到这了,Activity的基础篇就到这里了,后面将会讲述Activity的进阶篇