Android 橫豎屏切換的處理

來源:互聯網
上載者:User

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()比較好。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.