在Android开发的过程中,有时候会考虑到横竖屏切换的情况,如果放开了横竖屏切换,就要注意了,此时要多任务栈中的activity做一些谨慎操作。
在AndroidManifest.xml文件中,设置activity的属性时有一项"android:configChanges="" ",可以配置它的属性;其中可选的有"orientation" ,"orientation | keyboard"
1、当不添加android:configChanges=""的配置的时候
按ctrl+f12切成横屏,activity的生命周期执行过程:onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume
注意:onSavedInstanceState是一个系统方法,它不会在任何方法中执行,当按下Home键或者断点时触发(腾讯面试时他问我onSavdInstanceState会在哪个方法中执行,坑啊)
再次按ctrl+f12切成竖屏,activity的生命周期执行过程:onSavedInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume
可以看到,在竖屏切换到横屏的时候,调用一次生命周期过程;在横屏切换到竖屏的时候,执行两次生命周期过程
2、设置android:configChanges="orientation"
切换到横屏:onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume
横屏切换到竖屏:onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onRestoreInstanceState-->onResume-->onConfigurationChanged
可以看到:设置了android:configChanges="orientation",横竖屏切换时,生命周期只调用一次,唯一的区别是在横屏切换到竖屏时,会调用onConfigurationChanged()方法。
3、设置android:configChanges="orientation | keyboardHidden"
将竖屏切换为横屏:onConfigurationChanged-->
将横屏切换为竖屏:onConfigurationChanged-->
可以看到:设置了android:configChanges="orientation | keyboardHidden",横竖屏切换的过程中,只会执行onConfigurationChanged()方法。
补充:2018-12-21
onSavedInstanceState()和onRestoreInstanceState()并不是activity生命周期的方法。
onSaveInstanceState()会在onPause()或onStop()之前执行,onRestoreInstanceState()会在onStart()和onResume()之间执行。
当应用遇到意外情况(内存不足,用户直接按home键)由系统直接销毁一个Activity时,onSaveInstanceState()就会调用,但是当用户主动销毁activity,如按back键,或直接执行finish(),这种情况下onSaveInstanceState()就不会执行,因为这种情况下,用户的行为决定了不需要保存Activity的状态。
那么onRestoreInstanceState()会跟onSaveInstanceState()成对出现吗? 答案是不会成对出现,onSaveInstanceState()需要调用的时,activity可能销毁,也可能没有销毁,只有在activity销毁重建的时候onRestoreInstanceState()才会调用。
在onSaveInstanceState()中默认情况下具体干些什么?
默认情况下默认会自动保存Activity中的某些状态,比如activity中各种UI的状态,因此在activity被“系统”销毁和重建的时候,Ui的状态会默认保存,但是前提条件是Ui控件必须指定id,如果没有指定id的话,UI的状态是无法保存 的。
总结下Activity数据的保存和恢复:
activity中保存数据有两种方式onPause(),onSaveInstance(bundle), 恢复数据也有两种途径onCreate(Bundle), onRestoreInstanceState(budle),默认情况下onSaveInstanceSate()和onRestoreInstanceState()会对UI状态进行保存和恢复,如果需要保存其他数据可以在onSaveInstanceState(),onPause()保存,但是如果是持久化的数据得通过onPause()保存(google推荐)。