直播購物源碼Android Activity橫豎屏切換生命週期詳解

關於Activity生命週期和橫豎屏切換時,生命週期的執行過程,網上有很多文章。但是都寫的很模糊,並且不完善。一般的我們去切換屏幕方向都是不希望Activity被重新創建,這時就需要對一些屬性進行設置,或者使用代碼設置。文章通過以上方面解析Activity在橫豎屏切換時,生命週期方法執行過程。

1.Activity生命週期

2.configChanges屬性解析

3.orientation屬性

4.keyboardHidden屬性

5.screenSize屬性

6.總結

activity生命週期方法
默認情況下,activity從創建到銷燬會執行以下生命週期方法

onCreate -->onStart–>onResumeo -->nPause -->onStop -->onDestroy

configChanges屬性詳解

1.orientation 屏幕在縱向和橫向間旋轉
2.keyboardHidden 鍵盤顯示或隱藏
3.screenSize 屏幕大小改變了
4.fontScale 用戶變更了首選的字體大小
5.locale 用戶選擇了不同的語言設定
6.keyboard 鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤
7.touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件
常用的包括:orientation keyboardHidden screenSize,設置這三項界面不會走Activity的生命週期,只會回調onConfigurationChanged方法。

screenOrientation屬性詳解

1.unspecified 默認值,由系統判斷狀態自動切換
2.landscape 橫屏
3. portrait 豎屏
4.user 用戶當前設置的orientation值
5. behind 下一個要顯示的Activity的orientation值
6. sensor 使用傳感器 傳感器的方向
7. nosensor 不使用傳感器 基本等同於unspecified 僅landscape和portrait常用,代表界面默認是橫屏或者豎屏,還可以再代碼中更改。

1.AndroidManifest沒有設置configChanges屬性

豎屏啓動: onCreate -->onStart–>onResume
切換橫屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–>onResume -->onPause -->onStop -->onDestroy
橫屏啓動: onCreate -->onStart–>onResume
切換豎屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–>onResume -->onPause -->onStop -->onDestroy

2.AndroidManifest設置了configChanges android:configChanges=“orientation”

豎屏啓動: onCreate -->onStart–>onResume
切換橫屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–>onResume -->onPause -->onStop -->onDestroy
橫屏啓動: onCreate -->onStart–>onResume
切換豎屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–> onResume -->onPause -->onStop -->onDestroy

3.AndroidManifest設置了configChanges android:configChanges=“orientation|keyboardHidden|screenSize”

()屏啓動:onCreate -->onStart–>onResume
切換橫()屏:onConfigurationChanged (Android 6.0 Android 7.0 Android 8.0

4.AndroidManifest設置了configChanges android:configChanges=“orientation|screenSize”

()屏啓動:onCreate -->onStart–>onResume
切換橫()屏:onConfigurationChanged (Android 6.0 Android 7.0 Android 8.0

注意:代碼動態設置橫豎屏狀態(onConfigurationChanged當屏幕發生變化的時候回調)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

總結
1.沒有設置configChanges屬性,當前的界面調用onSaveInstanceState走一遍流程,然後重啓調用onRestoreInstanceState再走一遍完整流程,最終destory。
2.設置了configChanges屬性爲orientation之後,Android6.0 同沒有設置configChanges情況相同,完整的走完了兩個生命週期,調用了onSaveInstanceState和onRestoreInstanceState方法;Android 7.0則會先回調onConfigurationChanged方法,剩下的流程跟Android 6.0 保持一致;Android 8.0 系統更是簡單,
只是回調了onConfigurationChanged方法,並沒有走Activity的生命週期方法。
3.設置android:configChanges=“orientation|keyboardHidden|screenSize” 則都不會調用Activity的其他生命週期方法,只會調用onConfigurationChanged方法。
4.沒有了keyboardHidden跟3是相同的,orientation代表橫豎屏切換 screenSize代表屏幕大小發生了改變,
設置了這兩項就不會回調Activity的生命週期的方法,只會回調onConfigurationChanged 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章