Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android ApiDemos示例解析(14) App->Activity->Save & Restore State

Android ApiDemos示例解析(14) App->Activity->Save & Restore State

編輯:Android開發教程

Save & Restore State與之前的例子Android ApiDemo示例解析(9):App->Activity->Persistent State 實現的 UI類似,但功能和實現方法稍有不同。(9)是通過Shared Preferences 和 Activity 的onPause() ,和onResume()來保持UI中 EditText 的值。本例是通過onSaveInstanceState(Bundle savedBundle) 來實現保持UI狀態。 和onPause,onResume不同的是, onSaveInstanceState不是Activity Life cycle的一部分,也不一定會在Activity 被destroyed前執行,比如說用戶按“Back” 按鍵回退到前一個Activity時,當前的Activity並不會調用onSaveInstanceState方法,因為這時是用戶指明想關閉當前 Activity,而onPause一定會執行,因為onPause 是Activity生命周期的一個狀態。如果onSaveInstanceState被調用的話,它一 定會在onStop之前調用,有時會在onPause之前調用。

onSaveInstanceState設計在當Activity destroy之前調用(如當 Android切換到其它應用,此時Android根據系統資源的分配情況,用可能會將在後台運行的Activity清除,或是系統配置改變, 比如屏幕從縱向放平,當前的Activity會先被Destory,然後根據當前配置重新創建當前Activity的實例。此時Activity的 onSaveInstanceState會在Activity Destroy之前調用,此時應在onSaveInstanceState將一些UI狀態臨時存儲中Bundle中。然後 Android系統會重新執行Activity的onCreate方法,傳入參數為Bundle對象。如果在onSaveInstanceState設置了,這個Bundle對 象即是之前保存的Bundle對象,應用可以在onCreate 或是onRestoreInstanceState(Bundle savedInstanceState) 恢復UI狀態 ,這樣可以做到在應用或是Activity重啟時能保持上此退出時的狀態。

但是看看SaveRestoreState.java中似乎沒有任何 與Save /Restore State 相關的代碼,方法getSavedText和setSavedText和本例無關。

這是因為Activity的缺省 onSaveInstanceState實現完成了對UI狀態的Save和Restore。例子中上面的EditText輸入在Activity重啟時會恢復,而下面的 EditText輸入不會被保存和恢復。Activity的缺省onSaveInstanceState實現只會對定義了ID(android:id)的View實現Save 和 Restore.來看看R.layout.save_restore_state中的定義:

<EditText android:id=”@+id/saved

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_weight=”1 ″

android:background=”@drawable/green”

android:text=”@string/initial_text”

android:freezesText=”true ”>

<requestFocus />

< /EditText>

….

<EditText

android:layout_width=” match_parent”

android:layout_height=”wrap_content”

android:layout_weight=”1″

android:background=” @drawable/red”

android:text=”@string/initial_text”>

< /EditText>

上面的EditText定義了ID而 下面的EditText沒有定義ID。這可以通過旋轉屏幕來測試。旋轉屏幕可以保證當前activity先被Destory然後再Create:在上下 EditText輸入值,然後旋轉屏幕,可以看到只有上面的EditText值被保留。

注:在Emulator上,可以先按下“NumLock” ,然後按7,9來旋轉屏幕。

還是有些情況下需要重載onRestoreInstanceState,此時別忘了調用super.onRestoreInstanceState

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved