关于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
设备做相应的测试,来验证得到结果。