關于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
設備做相應的測試,來驗證得到結果。