Android 系統規定當系統的Configuration 改變時將會重啟Activity。這是一種不太友好的體驗,我們可以通過編輯Manifest文件來避免Activity的重啟
要聲明由 Activity 處理配置變更,請在清單文件中編輯相應的 元素,以包含 android:configChanges 屬性以及代表要處理的配置的值。android:configChanges 屬性的文檔中列出了該屬性的可能值(最常用的值包括 “orientation” 和 “keyboardHidden”,分別用于避免因屏幕方向和可用鍵盤改變而導致重啟)。您可以在該屬性中聲明多個配置值,方法是用管道 | 字符分隔這些配置值。
例如,以下清單文件代碼聲明的 Activity 可同時處理屏幕方向變更和鍵盤可用性變更:
<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">現在,當其中一個配置發生變化時,MyActivity 不會重啟。相反,MyActivity 會收到對 onConfigurationChanged() 的調用。向此方法傳遞 Configuration 對象指定新設備配置。您可以通過讀取 Configuration 中的字段,確定新配置,然后通過更新界面中使用的資源進行適當的更改。調用此方法時,Activity 的 Resources 對象會相應地進行更新,以根據新配置返回資源,這樣,您就能夠在系統不重啟 Activity 的情況下輕松重置 UI 的元素。
注意:從 Android 3.2(API 級別 13)開始,當設備在縱向和橫向之間切換時,“屏幕尺寸”也會發生變化。因此,在開發針對 API 級別 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 屬性中所聲明)的應用時,若要避免由于設備方向改變而導致運行時重啟,則除了 “orientation” 值以外,您還必須添加 “screenSize” 值。 也就是說,您必須聲明 android:configChanges=”orientation|screenSize”。但是,如果您的應用面向 API 級別 12 或更低版本,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的設備上運行,此配置變更也不會重啟 Activity)。
例如,以下 onConfigurationChanged() 實現檢查當前設備方向:
@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Checks the orientation of the screen if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); }}Configuration 對象代表所有當前配置,而不僅僅是已經變更的配置。大多數時候,您并不在意配置具體發生了哪些變更,而且您可以輕松地重新分配所有資源,為您正在處理的配置提供備用資源。 例如,由于 Resources 對象現已更新,因此您可以通過 setImageResource() 重置任何 ImageView,并且使用適合于新配置的資源(如提供資源中所述)。
請注意,Configuration 字段中的值是與 Configuration 類中的特定常量匹配的整型數。有關要對每個字段使用哪些常量的文檔,請參閱 Configuration 參考文檔中的相應字段。
請謹記:在聲明由 Activity 處理配置變更時,您有責任重置要為其提供備用資源的所有元素。 如果您聲明由 Activity 處理方向變更,而且有些圖像應該在橫向和縱向之間切換,則必須在 onConfigurationChanged() 期間將每個資源重新分配給每個元素。
如果無需基于這些配置變更更新應用,則可不用實現 onConfigurationChanged()。在這種情況下,仍將使用在配置變更之前用到的所有資源,只是您無需重啟 Activity。 但是,應用應該始終能夠在保持之前狀態完好的情況下關閉和重啟,因此您不得試圖通過此方法來逃避在正常 Activity 生命周期期間保持您的應用狀態。 這不僅僅是因為還存在其他一些無法禁止重啟應用的配置變更,還因為有些事件必須由您處理,例如用戶離開應用,而在用戶返回應用之前該應用已被銷毀。
如需了解有關您可以在 Activity 中處理哪些配置變更的詳細信息,請參閱 android:configChanges 文檔和 Configuration 類。
如果想要Activity不在系統語言發生改變時重試,需要給Activity設置locale屬性 但是這在Android 4.2 之前的版本有效,4.2之后的版本就不行了。因為Android 4.2增加了一個layoutDirection屬性,當改變語言設置后,該屬性也會成newConfig中的一個mask位。所以ActivityManagerService(實際在ActivityStack)在決定是否重啟Activity的時候總是判斷為重啟。 需要在android:configChanges 中同時添加locale和layoutDirection。
所以一下設置應該會滿足大部分情況下的Activity重啟問題
`android:configChanges="orientation|screenSize|locale|layoutDirection"`orientation|screenSize—方向改變
locale|layoutDirection—系統語言改變
在AndroidManifest.xml中通過配置android:configuration的方法來防止Activity被銷毀并重建為什么不被推薦,具體原因參見:
http://blog.csdn.net/aliaooooo/article/details/23606179?spm=5176.100239.blogcont32546.102.ySmWMr&utm_source=tuicool
參考
Android Configuration changes:https://developer.android.com/guide/topics/resources/runtime-changes.html
http://blog.csdn.net/aliaooooo/article/details/23606179?spm=5176.100239.blogcont32546.102.ySmWMr&utm_source=tuicool
新聞熱點
疑難解答