2025-05-23

 

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

 

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

 

 

 

到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的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *