前言
在開發中常要處理橫豎屏切換,怎麼處理先看生命週期
申明
Activity 橫豎屏切換時需要回調兩個函數,所以在此將這個兩個函數暫時看成是Activity 橫豎屏切換的生命週期的一部分,這兩個函數如下
onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据
橫豎屏切換生命週期
1、啟動程序進入Activity介面
旋轉畫面
4 在AndroidManifest.xml中設定
android:configChanges="orientation|screenSize",切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法
等於13 時間:android:configChanges="orientation" 或android:configChanges="orientation|keyboardHidden" 重新呼叫各個生命週期MiniSdkVersion小於13 時間:(1)不設定Activity的android:configChanges時,切螢幕會重新設定呼叫各個生命週期,切橫螢幕時會執行一次,切豎屏時會執行兩次(2)設定Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、垂直畫面時只會執行一次
(3)設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法
5、螢幕切換避免,重走Activity生命週期
從上面螢幕切換生命週期可以看出每次切換都在重新創建,為了不必要的麻煩比如視頻播放屏幕旋轉等,避免重走生命週期就是一個比較好的解決方案
(1)android 2.3之前的版本android:configChanges="orientation|keyboardHidden"
(2)android 3.0之後的版本android:configChanges="orientation|screenSize"
橫豎屏幕設定
蒟中比較常見,很多軟體在開發過程中為了避免橫豎屏切換時引發不必要的麻煩,通常會禁止掉橫豎屏的切換。 一、在AndroidManifest.xml中設定activity中的android:screenOrientation屬性值來實作。 (1)垂直螢幕:android:screenOrientation="portrait"(2)橫屏:android:screenOrientation="landscape"二、在Java程式碼中透過類似如下程式碼來設定(不建議這種方法,在大的app不同方向啟動時會慢)(1)豎屏: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)(2)橫屏:setRequestedOrientation(ActivityInfo.SCREEN_OR忽略重力感應帶來的切換,(模擬器上不管用,在真機上是正確的)(1)忽略重力:android:screenOrientation="nosensor"橫豎屏辨識一、在onConfigurationChanged裡,為了onConfigurationChanged在監聽螢幕方向變化有效需要以下條件(1)AndroidManifest.xml增加權限:
(3)在AndroidManifest.xml的Activity裡增加:android:configChanges="keyboard|screenSize|orientation|layoutDirection"木(4)在1ConfigurationConfigcoan )進行判斷
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation == 1)//竖屏 if(newConfig.orientation == 2)// 横屏 }
二、因為當螢幕變成橫屏的時候,系統會重調用Activity的onCreate方法可以在onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout xml。
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ Log.i("info","landscape"); // 横屏 } else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) { Log.i("info","portrait"); // 竖屏 }
注意:此方法是在AndroidManifest.xml中不設定onConfigurationChanged才能重走生命週期
橫垂直版面配置檔案設定
如果要讓軟體在橫屏高寬會發生轉換,有可能會要求不同的佈局。可以透過以下方法來切換佈局
(1)在res目錄下建立layout-land和layout-port目錄,對應的layout檔案名稱不變,例如main.xml。 layout-land是橫屏的layout,layout-port是垂直屏幕的layout,其他的不用管,模擬器會自動尋找。
(2)在上面橫豎屏辨識中,如果橫豎屏出現變化,在onCreate()或onConfigurationChanged()判斷方向,就可以在對應的方法中重新setContentView來載入不同的layout xml佈局檔
橫豎屏切換資料保存與讀取
另外,android中每次螢幕的切換動會重啟Activity,所以應該在Activity銷毀前保存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的遊戲就不會自動重啟了!
Activity 資料保存
(1)如果因為系統資源緊張而導致Activity的Destory或旋轉螢幕時被destroyed與Recreated, 系統會在使用者回到這個Activity時有這個Activity存在過的記錄,系統會使用那些保存的記錄資料(instance state)它是一些存放在Bundle物件中的key-value pairs,系統預設使用Bundle保存資訊
(2)為了可以保存額外更多的資料到instance state,要重寫寫這個回呼函數onSaveInstanceState(Bundle outState),系統會在Activity被異常Destory時傳遞Bundle對象,這樣我們就可以增加額外的資訊到Bundle中並儲存到系統中。若係統在Activity被Destory之後想重新建立這個Activity實例時,之前的Bundle物件會(系統)被傳遞到你我們activity的
(3)Activity開始stop,系統會呼叫onSaveInstanceState(Bundle outState) ,Activity可以用鍵值對的集合來保存狀態資訊。這個方法會預設保存Activity視圖的狀態訊息,如在EditText元件中的文字或ListView 的滑動位置
Activity 資料恢復
(1)當Activity從Destory中重建,我們可以從系統傳遞的Activity的Bundle中恢復已儲存的狀態。 onCreate() 與 onRestoreInstanceState() 回呼方法都接收到了相同的Bundle,裡麵包含了相同的實例狀態資訊。
(2)由於 onCreate() 方法會在第一次建立新的Activity實例與重新建立之前被Destory的實例時都被調用,我們必須在嘗試讀取 Bundle 物件前檢測它是否為null。如果它是null,系統則是建立一個新的Activity實例,而不是恢復先前被Destory的Activity。
(3)也可以選擇實作 onRestoreInstanceState() ,而不是在onCreate方法裡面還原資料。 onRestoreInstanceState()方法會在 onStart() 方法之後執行. 系統只會在存在需要復原的狀態資訊時才會呼叫 onRestoreInstanceState() ,因此不需要檢查 Bundle 是否為null。
以上所述是小編給大家介紹的Android Activity 橫豎屏切換的生命週期的相關知識,希望對大家有所幫助!
更多Android Activity 橫豎螢幕切換的生命週期相關文章請關注PHP中文網!