Android Activity 橫向螢幕切換的生命週期
前言
在開發中常要處理橫豎屏切換,怎麼處理先看生命週期
申明
Activity 橫豎屏切換時需要回調兩個函數,所以在此將這個兩個函數暫時看成是Activity 橫豎屏切換的生命週期的一部分,這兩個函數如下
onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据
橫豎屏切換生命週期
1、啟動程序進入Activity介面
旋轉畫面
4 在AndroidManifest.xml中設定
android:configChanges="orientation|screenSize",切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法
(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中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...
