編輯: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. 如何讓一部Android手機帶兩台PC進行調試。2. 如何完美Root Android手機。我曾經遇到過這樣的問題,
Toast通知是Android中最簡單的消息通知。接下來展示如何使用吐司通知。1. 新建一個工程, Toast。2. main.xml中的代碼。<RelativeL
Android Service是分為兩種:本地服務(Local Service): 同一個apk內被調用遠程服 務(Remote Service):被另一個apk調用遠程
Alarm Controller演示如何在Android應用中使用Alarm事件,其功能和java.util.Timer ,TimerTask類似。但Alarm可以即使