Android遊戲和應用開發中強制橫豎屏引起的程式重新啟動問題

來源:互聯網
上載者:User

 

這兩天碰到一個崩潰的問題

 

程式運行時按電源鍵會導致程式重新啟動,這個問題非常嚴重了

 

 

 

到DevDiv發帖問,被版主點撥,說可能是橫豎屏引起,立馬測試了一下

 

果然是的

 

螢幕會自動切換時,預設狀態的應用程式,會重新調用onCreate,相當於重新啟動了一次應用程式。同時,layout可能因為橫屏帶來不能合理適配的問題。為瞭解決旋屏和鍵盤切換引起的程式重啟問題,還需要增加一個屬性:android:configChanges。這個屬性可以理解為一個監聽器,它將攔截旋屏和鍵盤切換事件,阻止程式重啟而變為回調onConfigurationChanged方法。這裡常用的屬性取值為:keyboardHidden|orientation。

 

 

 

 

首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"屬性

<activity android:name=".FileBrowser"

android:label="@string/app_name"

android:configChanges="orientation|keyboardHidden">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

加入這條屬性的含義是,應用程式將會處理螢幕方向和鍵盤狀態(推出或合上)資訊的改動。但對於其他的裝置配置資訊的改動則會由Android系統來處理(銷毀當前Activity,然後重啟一個新的Activity執行個體)。

那麼,現在還需要在java代碼的activity子類中加入配置資訊改動的處理代碼。這個也很簡單

/**

* onConfigurationChanged

* the package:android.content.res.Configuration.

* @param newConfig, The new device configuration.

* 當裝置配置資訊有改動(比如螢幕方向的改變,實體鍵盤的推開或合上等)時,

* 並且如果此時有activity正在運行,系統會調用這個函數。

* 注意:onConfigurationChanged只會監測應用程式在AnroidMainifest.xml中通過

* android:configChanges="xxxx"指定的配置類型的改動;

* 而對於其他配置的更改,則系統會onDestroy()當前Activity,然後重啟一個新的Activity執行個體。

*/

@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

// 檢測螢幕的方向:縱向或橫向

if (this.getResources().getConfiguration().orientation

== Configuration.ORIENTATION_LANDSCAPE) {

//當前為橫屏, 在此處添加額外的處理代碼

}

else if (this.getResources().getConfiguration().orientation

== Configuration.ORIENTATION_PORTRAIT) {

//當前為豎屏, 在此處添加額外的處理代碼

}

//檢測實體鍵盤的狀態:推出或者合上

if (newConfig.hardKeyboardHidden

== Configuration.HARDKEYBOARDHIDDEN_NO){

//實體鍵盤處於推出狀態,在此處添加額外的處理代碼

}

else if (newConfig.hardKeyboardHidden

== Configuration.HARDKEYBOARDHIDDEN_YES){

//實體鍵盤處於合上狀態,在此處添加額外的處理代碼

}

}

別忘了在java檔案中加上import android.content.res.Configuration。

這樣就OK了,螢幕方向改變時,應用程式的顯示介面也會隨著改動,而不是被銷毀!

-----------------------------------還是分割線---------------------------------------------

擴充補充:

Activity中還有一屬性和螢幕方向有關:

<activity

. . .

android:screenOrientation=["unspecified" | "user" | "behind" |

"landscape" | "portrait" |

"sensor" | "nosensor"]

. . .

</activity>

比如,在Mainifest.xml的Activity元素中增加這麼一個屬性:

android:screenOrientation="portrait"

則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。

android:screenOrientation="landscape",為橫屏顯示。

這裡提一個小知識,Anroid模擬器中,快速鍵"ctrl+F11"可以實現轉屏。

摘自 kbest的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.