1. 程式人生 > >淺析Activity橫豎屏切換時的生命週期

淺析Activity橫豎屏切換時的生命週期

1.AndroidManifest沒有設定configChanges屬性

豎屏啟動:

onCreate -->onStart-->onResume

切換橫屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy       

(Android 6.0 Android 7.0 Android 8.0)

橫屏啟動:

onCreate -->onStart-->onResume

切換豎屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy       

(Android 6.0 Android 7.0 Android 8.0)

總結:沒有設定configChanges屬性Android 6.0 7.0 8.0 系統手機 表現都是一樣的,當前的介面呼叫onSaveInstanceState走一遍流程,然後重啟呼叫onRestoreInstanceState再走一遍完整流程,最終destory。

2.AndroidManifest設定了configChanges   android:configChanges="orientation"

豎屏啟動:

onCreate -->onStart-->onResume

切換橫屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy        

(Android 6.0)

onConfigurationChanged-->onPause -->onSaveInstanceState -->onStop -->onDestroy -->

onCreate-->onStart -->onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy        

(Android 7.0)

 onConfigurationChanged    

(Android 8.0)

 

橫屏啟動:

onCreate -->onStart-->onResume

切換豎屏:

onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->

onRestoreInstanceState--> onResume -->onPause -->onStop -->onDestroy        

(Android 6.0 ) 

onConfigurationChanged-->onPause -->onSaveInstanceState -->onStop -->onDestroy -->

onCreate-->onStart -->onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy        

(Android 7.0)

onConfigurationChanged    

(Android 8.0)

總結:設定了configChanges屬性為orientation之後,Android6.0 同沒有設定configChanges情況相同,完整的走完了兩個生命週期,呼叫了onSaveInstanceState和onRestoreInstanceState方法;Android 7.0則會先回調onConfigurationChanged方法,剩下的流程跟Android 6.0 保持一致;Android 8.0 系統更是簡單,
只是回調了onConfigurationChanged方法,並沒有走Activity的生命週期方法。
 

3.AndroidManifest設定了configChanges   

android:configChanges="orientation|keyboardHidden|screenSize" 

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

總結:設定android:configChanges="orientation|keyboardHidden|screenSize"  則都不會呼叫Activity的其他生命週期方法,只會呼叫onConfigurationChanged方法。

4.AndroidManifest設定了configChanges   

android:configChanges="orientation|screenSize" 

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

總結:沒有了keyboardHidden跟3是相同的,orientation代表橫豎屏切換 screenSize代表螢幕大小發生了改變,
設定了這兩項就不會回撥Activity的生命週期的方法,只會回撥onConfigurationChanged 。

5.AndroidManifest設定了configChanges   

android:configChanges="orientation|keyboardHidden" 


總結:跟只設置了orientation屬性相同,Android6.0 Android7.0會回撥生命週期的方法,Android8.0則只回調onConfigurationChanged。說明如果設定了orientation 和 screenSize 都不會走生命週期的方法,keyboardHidden不影響。

1.不設定configChanges屬性不會回撥onConfigurationChanged,且切屏的時候會回撥生命週期方法。
2.只有設定了orientation 和 screenSize 才會保證都不會走生命週期,且切屏只回調onConfigurationChanged。
3.設定orientation,沒有設定screenSize,切屏會回撥onConfigurationChanged,但是還會走生命週期方法。

注:這裡只選擇了Android部分系統的手機做測試,由於不同系統的手機品牌也不相同,可能略微會有區別。
      
另:
程式碼動態設定橫豎屏狀態(onConfigurationChanged當螢幕發生變化的時候回撥)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

獲取螢幕狀態(int ORIENTATION_PORTRAIT = 1;  豎屏    int ORIENTATION_LANDSCAPE = 2; 橫屏)
int screenNum = getResources().getConfiguration().orientation;

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常用,代表介面預設是橫屏或者豎屏,還可以再程式碼中更改。