关于Android手机横竖屏切换时Activity的生命周期问题,网上有很多相似的文章,大多数都是说明在竖屏切换横屏时Activity会重启一次,而在横屏切换竖屏时Activity会重启两次。
我本身不太理解这样设计的意义,并且觉得新版本会解决这个问题,所以做了一项测试,测试环境为Android 7.0模拟器。
测试首先创建一个新的Activity,并在其各个生命周期方法内打印日志,并执行如下操作得到结果:
在targetSdkVersion的值大于12时
-
Activity启动I/System.out: onCreate I/System.out: onStart I/System.out: onResume -
竖屏切换为横屏
I/System.out: onConfigurationChanged I/System.out: onPause I/System.out: onSaveInstanceState I/System.out: onStop I/System.out: onDestroy I/System.out: onCreate I/System.out: onStart I/System.out: onRestoreInstanceState I/System.out: onResume -
横屏切回竖屏
I/System.out: onConfigurationChanged I/System.out: onPause I/System.out: onSaveInstanceState I/System.out: onStop I/System.out: onDestroy I/System.out: onCreate I/System.out: onStart I/System.out: onRestoreInstanceState I/System.out: onResume -
配置
android:configChanges="orientation|screenSize"后,竖屏切换为横屏I/System.out: onConfigurationChanged -
配置
android:configChanges="orientation|screenSize"后,横屏切回竖屏I/System.out: onConfigurationChanged
在targetSdkVersion的值小于或等于12时
-
Activity启动I/System.out: onCreate I/System.out: onStart I/System.out: onResume -
竖屏切换为横屏
I/System.out: onConfigurationChanged I/System.out: onPause I/System.out: onSaveInstanceState I/System.out: onStop I/System.out: onDestroy I/System.out: onCreate I/System.out: onStart I/System.out: onRestoreInstanceState I/System.out: onResume -
横屏切回竖屏
I/System.out: onConfigurationChanged I/System.out: onPause I/System.out: onSaveInstanceState I/System.out: onStop I/System.out: onDestroy I/System.out: onCreate I/System.out: onStart I/System.out: onRestoreInstanceState I/System.out: onResume -
配置
android:configChanges="orientation"后,竖屏切换为横屏I/System.out: onConfigurationChanged -
配置
android:configChanges="orientation"后,横屏切回竖屏I/System.out: onConfigurationChanged
总结
可以发现新版本Android设备上的运行结果和网上的结论并不完全相同,在横竖屏切换时,都会调用一次onConfigurationChanged,并重启Activity一次,具体的生命周期为:
I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume 在targetSdkVersion的值小于或等于12时,配置android:configChanges="orientation"
在targetSdkVersion的值小于或等于12时,配置android:configChanges="orientation|screenSize"
可以做到拦截Activity的重新创建:
I/System.out: onConfigurationChanged 后续
将会对过去版本的Android设备做相应的测试,来验证得到结果。