首頁 > Java > java教程 > Android Activity 橫向螢幕切換的生命週期

Android Activity 橫向螢幕切換的生命週期

高洛峰
發布: 2017-01-07 15:55:53
原創
2092 人瀏覽過

前言

在開發中常要處理橫豎屏切換,怎麼處理先看生命週期

申明

Activity 橫豎屏切換時需要回調兩個函數,所以在此將這個兩個函數暫時看成是Activity 橫豎屏切換的生命週期的一部分,這兩個函數如下

onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据
onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据
登入後複製

   

橫豎屏切換生命週期

1、啟動程序進入Activity介面

Android Activity 横竖屏切换的生命周期旋轉畫面

4 在AndroidManifest.xml中設定

android:configChanges="orientation|screenSize",切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法Android Activity 横竖屏切换的生命周期

等於13 時間:android:configChanges="orientation" 或android:configChanges="orientation|keyboardHidden" 重新呼叫各個生命週期

MiniSdkVersion小於13 時間:

(1)不設定Activity的android:configChanges時,切螢幕會重新設定呼叫各個生命週期,切橫螢幕時會執行一次,切豎屏時會執行兩次

Android Activity 横竖屏切换的生命周期(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增加權限:

(2) AndroidManifest.xml裡設定的MiniSdkVersion和TargetSdkVersion屬性大於等於13

​​

(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中文網!


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板