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

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

Jan 07, 2017 pm 03:55 PM

前言

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

申明

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


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

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

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

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

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

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

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

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

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

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

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

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

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

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

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

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

See all articles