日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 横竖屏切换的处理 (转载)

發布時間:2023/12/9 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 横竖屏切换的处理 (转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 中,缺省情況下屏幕的切換動會銷毀當前的Activity,并且重啟Activity。當然這種缺省的處理方式可能不符合我們的要求。 可以有多種選擇改變這種處理方式。

?

一種方式是在銷毀Activity前保存數據,在Activity再次Create的時候載入配置。onSaveInstanceState 負責在銷毀Activity之前保存數據。

?

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

if (dataString != null) {
outState.putString("data", dataString);
}
}

onCreate(Bundle savedInstanceState) 負責恢復數據

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataString = savedInstanceState.getString("data");
}

?

onRetainNonConfigurationInstance() 和 getLastNonConfigurationInstance() 可以實現類似的功能。 前者用來保存數據,后者用來恢復數據,不過只限于Activity被銷毀后馬上被恢復的情況。

?

更常用的方式是阻止Activity的銷毀和重新啟動。需要首先在AndroidManifest.xml中給相應的Activity加一個屬性。

android:configChanges="keyboardHidden|orientation"

然后再程序中截獲 onConfigurationChanged(Configuration newConfig) 函數并且自己加以處理,這時候屏幕方向的切換不會重新啟動Activity。必要的時候可以根據屏幕方向的不同重新布置布局。

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。

?

?

現在討論一下兩種保存方式的不同:

程序運行的時候,onCreate()然后運行到onResume,一旦進行屏幕的橫豎切換,就會轉到onPause(),然后onDestroy(),然后程序會再次的onCreate(),然后再次的onResume()。橫豎屏切換會執行onDestroy()。

關于轉屏,與activity狀態的保存
比較onSaveInstanceState() 與 onRetainNonConfigurationInstance()在不同需求中的用法
針對Android平臺,不論出于哪種目的,都或多或少需要在多個Activities中的跳轉操作,其中包括為了獲得某些系統資源和必要信息,而通過啟動(startActivity()&startActivityForResult() )Child Activity來提供一個選擇器或者作為用戶輸入信息的介質。這期間父級Activity將暫時性失去焦點,從而在這之前先通過 onSaveInstanceState() 方法臨時存儲一些必要的信息,當父級的Activity重新成為當前焦點后,系統將觸發 onRestoreInstanceState() 恢復失去焦點前的原有數據!onRetainNonConfigurationInstance()也具有相同的目的來處理類似的請求,其主要是由于旋轉設備而更改顯示模式,進而觸發這個方法的調用。 那么在遇到某些特定需求時,特別是針對設備旋轉后所導致的顯示模式發生變化后,應該依據什么條件來判斷應用哪種方式才能更好的滿足需要呢?做出選擇之前有必要分別了解兩種方法的各自特點。

onSaveInstanceState() 在當前的Activity中通過新的Intent啟動其它Activities之后,它將通過這個方法自動保存自身的數據,當再次出返回時可以通過 onRestoreInstanceState()復原數據。另外一種情況也將調用這個方法,當旋轉設備后屏幕顯示模式發生改變時。需要注意的一點是整個過程完全由系統控制,無法通過onSaveInstanceState()返回一個自定義的數據。 另外,onSaveInstanceState()在所有Activity destroying過程中被調用,它僅僅是為了在重新回到這個特定的Activity之后,依據Activity state重新創建一個與之前狀態完全相同的Activity。例如:當我們啟動某些Connection時,State并不能依然保存這個連接狀態。
所以當調用onSaveInstanceState后,所有當前的connection將一同銷毀。當第二次通過 onRestoreInstanceState()找回之前的連接設置并重新建立新的連接實體。如果大家有更多的發現,或者有不用于以上的驗證結果,非常感謝能參與這個話題的討論。onRetainNonConfigurationInstance() 當Device configuration發生改變時,將伴隨Destroying被系統調用。通過這個方法可以像onSaveInstanceState()的方法一樣保留變化前的Activity State,最大的不同在于這個方法可以返回一個包含有狀態信息的Object,其中甚至可以包含Activity Instance本身。新創建的Activity可以繼承大量來至于Parent Activity State信息。 用這個方法保存Activity State后,通過getLastNonConfigurationInstance()在新的Activity Instance中恢復原有狀態。

?


這個方法最大的好處是:
* 當Activity曾經通過某個網絡資源得到一些圖片或者視頻信息,那么當再次恢復后,
無需重新通過原始資源地址獲取,可以快速的加載整個Activity狀態信息。
* 當Activity包含有許多線程時,在變化后依然可以持有原有線程,無需通過重新創建進程恢復原有狀態。
* 當Activity包含某些Connection Instance時,同樣可以在整個變化過程中保持連接狀態。
下邊是需要特別注意的幾點:
* onRetainNonConfigurationInstance()在onSaveInstanceState()之后被調用。
* 調用順序同樣介于onStop() 和 onDestroy()之間。
接下來將通過一個例子來簡單了解onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()的
用法。 這個例子將首先啟動一個包含兩個按鈕的Activity。其中一個按鈕用于調用本地通訊錄,
并將所選擇的某一項作為返回值傳給當前 Activity。另外一個按鈕的作用是查看當前所選擇的通訊信息。
正常的流程是當第一次啟動程序后,第二個查看信息按鈕是不可用狀態。當通過Pick按鈕確定選擇并返回某
一通訊錄內容時,查看信息按鈕的狀態切換為可操作狀態。然后當改變設備的Configuration時,
可以注意到即便是 Activity通過onCreate()重新構建,但是之前所保證的UI屬性依然保持最后一次操作的狀態。

為了保存圖片資源和網絡連接,即使使用,還是onRetainNonConfigurationInstance()比較好。


轉載于:https://www.cnblogs.com/joey-home/archive/2012/02/17/2356228.html

總結

以上是生活随笔為你收集整理的Android 横竖屏切换的处理 (转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。