Android 横竖屏切换的处理 (转载)
Android 中,缺省情況下屏幕的切換動會銷毀當(dāng)前的Activity,并且重啟Activity。當(dāng)然這種缺省的處理方式可能不符合我們的要求。 可以有多種選擇改變這種處理方式。
?
一種方式是在銷毀Activity前保存數(shù)據(jù),在Activity再次Create的時候載入配置。onSaveInstanceState 負(fù)責(zé)在銷毀Activity之前保存數(shù)據(jù)。
?
@Overrideprotected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (dataString != null) {
outState.putString("data", dataString);
}
}
onCreate(Bundle savedInstanceState) 負(fù)責(zé)恢復(fù)數(shù)據(jù)
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
dataString = savedInstanceState.getString("data");
}
?
onRetainNonConfigurationInstance() 和 getLastNonConfigurationInstance() 可以實現(xiàn)類似的功能。 前者用來保存數(shù)據(jù),后者用來恢復(fù)數(shù)據(jù),不過只限于Activity被銷毀后馬上被恢復(fù)的情況。
?
更常用的方式是阻止Activity的銷毀和重新啟動。需要首先在AndroidManifest.xml中給相應(yīng)的Activity加一個屬性。
android:configChanges="keyboardHidden|orientation"然后再程序中截獲 onConfigurationChanged(Configuration newConfig) 函數(shù)并且自己加以處理,這時候屏幕方向的切換不會重新啟動Activity。必要的時候可以根據(jù)屏幕方向的不同重新布置布局。
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setupLandScapeViews();
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
setupPortraitViews();
}
}
如果不希望改變屏幕的顯示方式,比如游戲中希望保持一種方式顯示,可以在Activity中加一句
android:screenOrientation="portrait"這樣的話屏幕方向變化不會再改變顯示方式和重啟Activity。
?
?
現(xiàn)在討論一下兩種保存方式的不同:
程序運行的時候,onCreate()然后運行到onResume,一旦進(jìn)行屏幕的橫豎切換,就會轉(zhuǎn)到onPause(),然后onDestroy(),然后程序會再次的onCreate(),然后再次的onResume()。橫豎屏切換會執(zhí)行onDestroy()。
關(guān)于轉(zhuǎn)屏,與activity狀態(tài)的保存
比較onSaveInstanceState() 與 onRetainNonConfigurationInstance()在不同需求中的用法
針對Android平臺,不論出于哪種目的,都或多或少需要在多個Activities中的跳轉(zhuǎn)操作,其中包括為了獲得某些系統(tǒng)資源和必要信息,而通過啟動(startActivity()&startActivityForResult() )Child Activity來提供一個選擇器或者作為用戶輸入信息的介質(zhì)。這期間父級Activity將暫時性失去焦點,從而在這之前先通過 onSaveInstanceState() 方法臨時存儲一些必要的信息,當(dāng)父級的Activity重新成為當(dāng)前焦點后,系統(tǒng)將觸發(fā) onRestoreInstanceState() 恢復(fù)失去焦點前的原有數(shù)據(jù)!onRetainNonConfigurationInstance()也具有相同的目的來處理類似的請求,其主要是由于旋轉(zhuǎn)設(shè)備而更改顯示模式,進(jìn)而觸發(fā)這個方法的調(diào)用。 那么在遇到某些特定需求時,特別是針對設(shè)備旋轉(zhuǎn)后所導(dǎo)致的顯示模式發(fā)生變化后,應(yīng)該依據(jù)什么條件來判斷應(yīng)用哪種方式才能更好的滿足需要呢?做出選擇之前有必要分別了解兩種方法的各自特點。
onSaveInstanceState() 在當(dāng)前的Activity中通過新的Intent啟動其它Activities之后,它將通過這個方法自動保存自身的數(shù)據(jù),當(dāng)再次出返回時可以通過 onRestoreInstanceState()復(fù)原數(shù)據(jù)。另外一種情況也將調(diào)用這個方法,當(dāng)旋轉(zhuǎn)設(shè)備后屏幕顯示模式發(fā)生改變時。需要注意的一點是整個過程完全由系統(tǒng)控制,無法通過onSaveInstanceState()返回一個自定義的數(shù)據(jù)。 另外,onSaveInstanceState()在所有Activity destroying過程中被調(diào)用,它僅僅是為了在重新回到這個特定的Activity之后,依據(jù)Activity state重新創(chuàng)建一個與之前狀態(tài)完全相同的Activity。例如:當(dāng)我們啟動某些Connection時,State并不能依然保存這個連接狀態(tài)。
所以當(dāng)調(diào)用onSaveInstanceState后,所有當(dāng)前的connection將一同銷毀。當(dāng)?shù)诙瓮ㄟ^ onRestoreInstanceState()找回之前的連接設(shè)置并重新建立新的連接實體。如果大家有更多的發(fā)現(xiàn),或者有不用于以上的驗證結(jié)果,非常感謝能參與這個話題的討論。onRetainNonConfigurationInstance() 當(dāng)Device configuration發(fā)生改變時,將伴隨Destroying被系統(tǒng)調(diào)用。通過這個方法可以像onSaveInstanceState()的方法一樣保留變化前的Activity State,最大的不同在于這個方法可以返回一個包含有狀態(tài)信息的Object,其中甚至可以包含Activity Instance本身。新創(chuàng)建的Activity可以繼承大量來至于Parent Activity State信息。 用這個方法保存Activity State后,通過getLastNonConfigurationInstance()在新的Activity Instance中恢復(fù)原有狀態(tài)。
?
這個方法最大的好處是:
* 當(dāng)Activity曾經(jīng)通過某個網(wǎng)絡(luò)資源得到一些圖片或者視頻信息,那么當(dāng)再次恢復(fù)后,
無需重新通過原始資源地址獲取,可以快速的加載整個Activity狀態(tài)信息。
* 當(dāng)Activity包含有許多線程時,在變化后依然可以持有原有線程,無需通過重新創(chuàng)建進(jìn)程恢復(fù)原有狀態(tài)。
* 當(dāng)Activity包含某些Connection Instance時,同樣可以在整個變化過程中保持連接狀態(tài)。
下邊是需要特別注意的幾點:
* onRetainNonConfigurationInstance()在onSaveInstanceState()之后被調(diào)用。
* 調(diào)用順序同樣介于onStop() 和 onDestroy()之間。
接下來將通過一個例子來簡單了解onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()的
用法。 這個例子將首先啟動一個包含兩個按鈕的Activity。其中一個按鈕用于調(diào)用本地通訊錄,
并將所選擇的某一項作為返回值傳給當(dāng)前 Activity。另外一個按鈕的作用是查看當(dāng)前所選擇的通訊信息。
正常的流程是當(dāng)?shù)谝淮螁映绦蚝?#xff0c;第二個查看信息按鈕是不可用狀態(tài)。當(dāng)通過Pick按鈕確定選擇并返回某
一通訊錄內(nèi)容時,查看信息按鈕的狀態(tài)切換為可操作狀態(tài)。然后當(dāng)改變設(shè)備的Configuration時,
可以注意到即便是 Activity通過onCreate()重新構(gòu)建,但是之前所保證的UI屬性依然保持最后一次操作的狀態(tài)。
為了保存圖片資源和網(wǎng)絡(luò)連接,即使使用,還是onRetainNonConfigurationInstance()比較好。
轉(zhuǎn)載于:https://www.cnblogs.com/joey-home/archive/2012/02/17/2356228.html
總結(jié)
以上是生活随笔為你收集整理的Android 横竖屏切换的处理 (转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开机的时候重新设置密linux管理员的密
- 下一篇: Android网络通信的六种方式示例代码