曾經遇到過一個面試題,讓你寫出橫屏切換豎屏Activity的生命周期。現在給大家分析一下他切換時具體的生命周期是怎么樣的:
1、新建一個Activity,并把各個生命周期打印出來
2、運行Activity,得到如下信息
onCreate-->onStart-->onResume-->
3、按crtl+f12切換成橫屏時
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
4、再按crtl+f12切換成豎屏時,發現打印了兩次相同的log
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
5、修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",執行步驟3
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
6、再執行步驟4,發現不會再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onConfigurationChanged-->
7、把步驟5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",執行步驟3,就只打印onConfigChanged
onConfigurationChanged-->
8、執行步驟4
onConfigurationChanged-->onConfigurationChanged-->
總結:
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
總結一下整個Activity的生命周期
補充一點,當前Activity產生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變
Activity運行時按下HOME鍵(跟被完全覆蓋是一樣的):onSaveInstanceState --> onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆蓋只是失去焦點:onPause--->onResume
(4)android2.3和android4.0的生命周期不一樣,2.3是先onSaveInstanceState,后onPause,4.0是先onPause,后onSaveInstanceState(這個我表示不想吐槽了)
現在放出所有的測試結果(注:以下結果中的不重新創建activity和重新創建均代表結論2的內容)
(1)設置 android:configChanges="orientation" 和不設置這個屬性,生命周期表現為重新創建activity
(2)設置 android:configChanges="orientation|keyboardHidden",在2.3上表現為不重新創建activity,4.0如下
a)android:targetSdkVersion<="12",生命周期表現為不重新創建activity
b)android:targetSdkVersion>"12",表現為重新創建activity
(3)設置 android:configChanges="orientation|keyboardHidden|screenSize",在2.3和4.0上都表現為不重新創建