Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 學習筆記之實時保存數據-現場保護onSaveInstanceState()

Android 學習筆記之實時保存數據-現場保護onSaveInstanceState()

編輯:關於Android編程

數據保存:在軟件開發中我們希望保存下各個Activity數據,以實現客戶數據的時時保存,達到較好的用戶體驗。 那麼我們需要解決如下問題: 1.什麼時候保存? 2.保存哪些數據?     我想保存應用產生的數據,而這些用戶的數據是在Activity與用戶進行交互的時候產生的,就是界面上的數據,或者狀態。 3.如何進行保存? 4.保存到哪裡? 5.編寫合適的例子? 創造思路,去哪尋找答案,首先,我想保存應用產生的數據,而這些用戶的數據是在Activity與用戶進行交互的時候產生的,所以我們進入Activity進行查找。 Activity源碼: 復制代碼  * <ul>  * <li> {@link #onCreate} is where you initialize your activity. Most  * importantly, here you will usually call {@link #setContentView(int)}  * with a layout resource defining your UI, and using {@link #findViewById}  * to retrieve the widgets in that UI that you need to interact with  * programmatically. 復制代碼 onCreate是初始化你的Activity,在這裡你可以調用setContentView(int)與layout資源來定義你的UI界面。使用findViewById來取出您交互的控件    * <li> {@link #onPause} is where you deal with the user leaving your  * activity. Most importantly, any changes made by the user should at this  * point be committed (usually to the  * {@link android.content.ContentProvider} holding the data).  * </ul> 這句的意思是說,onPause是處理用戶離開時的方法。最重要的,任何用戶操作產生的數據應該在這裡進行提交,使用android.content.ContentProvider}來保存數據。   到此我們可以得出結論: 1.什麼時候保存?   一、在onPause時進行保存操作 3.如何進行保存? 使用ContentProvider類進行處理。 怎麼處理?繼續讀 到此,我們要回來看看android.content.ContentProvider 我們進入ContentProvider,但是是用來處理共享數據的,所以我們的結論不是最好的方式。 {@link android.app.Activity#onPause} to commit changes to data and  * otherwise prepare to stop interacting with the user. 繼續向下讀, 復制代碼 Because of this, you should use the onPause method to write any persistent data (such as user edits) to storage. In addition, the method onSaveInstanceState(Bundle) is called before placing the activity in such a background state, allowing you to save away any dynamic instance state in your activity into the given Bundle, to be later received in onCreate if the activity needs to be re-created. See the Process Lifecycle section for more information on how the lifecycle of a process is tied to the activities it is hosting. Note that it is important to save persistent data in onPause instead of onSaveInstanceState because the later is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation. 復制代碼 我們可以使用onSaveInstanceState(Bundle)方法進行存儲,然後onRestoreInstanceState 處進行處理,即拿到值。   如何使用onSaveInstanceState(Bundle)方法? 我們在layout中加一個文本框和button     重寫onSaveInstanceState方法,   復制代碼 // 將數據保存到savedInstanceState對象中, 該對象會在重建activity時傳遞給onCreate方法   @Override  protected void onSaveInstanceState(Bundle savedInstanceState) {   super.onSaveInstanceState(savedInstanceState);  }    @Override  protected void onRestoreInstanceState(Bundle savedInstanceState) {   super.onRestoreInstanceState(savedInstanceState);  } 復制代碼 這種方式可以在旋轉的時候進行數據保存,但是使用Actionbar向上跳不行,原因是:   復制代碼 * <p>Do not confuse this method with activity lifecycle callbacks such as      * {@link #onPause}, which is always called when an activity is being placed      * in the background or on its way to destruction, or {@link #onStop} which      * is called before destruction. One example of when {@link #onPause} and      * {@link #onStop} is called and not this method is when a user navigates back      * from activity B to activity A: there is no need to call {@link #onSaveInstanceState}      * on B because that particular instance will never be restored, so the      * system avoids calling it. An example when {@link #onPause} is called and      * not {@link #onSaveInstanceState} is when activity B is launched in front of activity A:      * the system may avoid calling {@link #onSaveInstanceState} on activity A if it isn't      * killed during the lifetime of B since the state of the user interface of      * A will stay intact. 復制代碼   不要將這個方法和activity生命周期回調如onPause()或onStop()搞混淆了,onPause()在activtiy被放置到背景或者自行銷毀時總會被調用,onStop()在activity被銷毀時被調用。一個會調用onPause()和onStop(),但不觸發onSaveInstanceState的例子是當用戶從activity B返回到activity A時:沒有必要調用B的onSaveInstanceState(Bundle),此時的B實例永遠不會被恢復,因此系統會避免調用它。一個調用onPause()但不調用onSaveInstanceState的例子是當activity B啟動並處在activity A的前端:如果在B的整個生命周期裡A的用戶界面狀態都沒有被破壞的話,系統是不會調用activity A的onSaveInstanceState(Bundle)的。(http://blog.csdn.net/ddna/article/details/5123482)   所以這種方式不能永久保存數據,適合瞬時保存數據。 什麼時候調用onSaveInstanceState方法。(親測)http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html      (1)、當用戶按下HOME鍵時。     這是顯而易見的,系統不知道你按下HOME後要運行多少其他的程序,自然也不知道activity A是否會被銷毀,因此系統會調用onSaveInstanceState(),讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則     (2)、長按HOME鍵,選擇運行其他的程序時。     (3)、按下電源按鍵(關閉屏幕顯示)時。     (4)、從activity A中啟動一個新的activity時。     (5)、屏幕方向切換時,例如從豎屏切換到橫屏時。     在屏幕切換之前,系統會銷毀activity A,在屏幕切換之後系統又會自動地創建activity A,所以onSaveInstanceState()一定會被執行,且也一定會執行onRestoreInstanceState()。   特別說明   如果我們沒覆寫onSaveInstanceState()方法,此方法會默認自動保存Activity中的某些數據,比如UI控件的狀態和值,前提是需要指定控件一個唯一的ID,否則控件的數據不會出現保存。   那麼什麼時候保存覆寫這個方法?    如果需要保存額外的數據時, 就需要覆寫onSaveInstanceState()方法。大家需要注意的是:onSaveInstanceState()方法只適合保存瞬態數據, 比如UI控件的狀態, 成員變量的值等,而不應該用來保存持久化數據,持久化數據應該當用戶離開當前的 activity時,在 onPause() 中保存(比如將數據保存到數據庫或文件中)。說到這裡,還要說一點的就是在onPause()中不適合用來保存比較費時的數據,所以這點要理解。       至於onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然後用戶緊接著又返回到activity A,這種情況下activity A一般不會因為內存的原因被系統銷毀,故activity A的onRestoreInstanceState方法不會被執行   到此我們解決我們的問題:   4.保存到哪裡? 瞬時的,使用系統提供的onSaveInstanceState方法,重寫添加一些系統不會自動保存的數據,同時,使用其他變量。 需要長期存儲的,使用數據庫,files,或者SharedPreferences ,緩存存在catch文件中。 最重要的是根據優缺點的分辨使用幾種保護。 5.編寫合適的例子? 例子我就不寫了,最簡單的方式,寫一個屏幕旋轉,然後保存數據,就可以了,網上一把。   說明:本文引用了其他人文章的一些內容,經過自己測試,感謝這寫人,記不清了,文章中寫了主要地址。小子愚鈍,錯誤請指教    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved