Android保存Activity狀態(tài)的方法
本文實(shí)例講述了Android保存Activity狀態(tài)的方法。分享給大家供大家參考,具體如下:
如果你想保存Activity的信息(例如,類實(shí)例的變量)而又不需要和其它的組件共享的話,你可以調(diào)用Activity的getPreferences方法,不用指定一個(gè)Preference的名字。對(duì)返回的Shared Preference的訪問只限于調(diào)用的Activity;每個(gè)Activity支持一個(gè)不命名的Shared Preference對(duì)象。
下面的框架代碼顯示了如何使用Activity的私有Shared Preference:
protected void saveActivityPreferences() { // Create or retrieve the activity preferences object. SharedPreferences activityPreferences = getPreferences(Activity.MODE_PRIVATE); // Retrieve an editor to modify the shared preferences. SharedPreferences.Editor editor = activityPreferences.edit(); // Retrieve the View TextView myTextView = (TextView)findViewById(R.id.myTextView); // Store new primitive types in the shared preferences object. editor.putString("currentTextValue", myTextView.getText().toString()); // Commit changes. editor.commit(); }
保存和恢復(fù)實(shí)例狀態(tài)
對(duì)于保存Activity實(shí)例的變量來(lái)說,Android提供了一種替代Shared Preference的特殊方法。
通過重寫Activity的onSaveInstanceState事件處理函數(shù),你可以使用它的Bundle參數(shù)來(lái)保存實(shí)例的值。保存數(shù)據(jù)的方法還是使用與在Shared Preference中相同的get和put方法。在完成Bundle的修改后,將其傳入父類的處理函數(shù)中,如下面的代碼片段所示:
private static final String TEXTVIEW_STATE_KEY = "TEXTVIEW_STATE_KEY"; @Override public void onSaveInstanceState(Bundle outState) { // Retrieve the View TextView myTextView = (TextView)findViewById(R.id.myTextView); // Save its state outState.putString(TEXTVIEW_STATE_KEY, myTextView.getText().toString()); super.onSaveInstanceState(outState); }
這個(gè)處理函數(shù)會(huì)在Activity的Active生命周期結(jié)束時(shí)觸發(fā),但僅在它不是顯式地結(jié)束(即異常結(jié)束)。因此,它一般用于確保在單個(gè)用戶會(huì)話中的Active生命周期間Activity狀態(tài)的一致性。
如果一個(gè)會(huì)話期間,應(yīng)用程序被迫重啟,那么,保存的Bundle會(huì)傳入到onRestoreInstanceState和onCreate方法中。下面的片段顯示了如何從Bundle中提取值來(lái)更新Activity實(shí)例的狀態(tài):
@Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); TextView myTextView = (TextView)findViewById(R.id.myTextView); String text = ""; if (icicle != null && icicle.containsKey(TEXTVIEW_STATE_KEY)) text = icicle.getString(TEXTVIEW_STATE_KEY); myTextView.setText(text); }
有一點(diǎn)很重要的是,記住onSaveInstanceState僅在Activity變成非Active狀態(tài)時(shí)調(diào)用,但不在調(diào)用finish來(lái)關(guān)閉它或用戶按下Back按鈕時(shí)調(diào)用。
保存To-Do List Activity的狀態(tài)
目前,每一次To-Do List例子程序重新啟動(dòng)時(shí),所有的to-do項(xiàng)都丟失了且任何在文本輸入框中輸入的文字也被清除了。在這個(gè)例子中,你將在會(huì)話期間保存To-Do List程序的狀態(tài)。
ToDoList Activity中的實(shí)例狀態(tài)由三個(gè)變量組成:
① 是否一個(gè)新的Item正在添加?
② 在新的項(xiàng)目輸入框中存在什么樣的文字?
③ 哪個(gè)是當(dāng)前選擇的項(xiàng)目?
使用Activity默認(rèn)的Shared Preference,你可以保存這些值,當(dāng)Activity重啟時(shí)更新UI。
在本章的后面,你將學(xué)習(xí)如何使用SQLite去保存to-do項(xiàng)目。這個(gè)例子是第一步,演示如何通過保持Activity實(shí)例的細(xì)節(jié)來(lái)確保無(wú)瑕疵的體驗(yàn)。
1. 添加靜態(tài)的字符串用作Preference的鍵。
private static final String TEXT_ENTRY_KEY = "TEXT_ENTRY_KEY"; private static final String ADDING_ITEM_KEY = "ADDING_ITEM_KEY"; private static final String SELECTED_INDEX_KEY = "SELECTED_INDEX_KEY";
2. 接下來(lái),重寫onPause方法。獲得Activity的私有Shared Preference并得到它的Editor對(duì)象。
使用第1步中創(chuàng)建的鍵,存儲(chǔ)實(shí)例的值,包括是否一個(gè)新的項(xiàng)目正在添加和任何在"new item"輸入框中的文本。
@Override protected void onPause(){ super.onPause(); // Get the activity preferences object. SharedPreferences uiState = getPreferences(0); // Get the preferences editor. SharedPreferences.Editor editor = uiState.edit(); // Add the UI state preference values. editor.putString(TEXT_ENTRY_KEY, myEditText.getText().toString()); editor.putBoolean(ADDING_ITEM_KEY, addingNew); // Commit the preferences. editor.commit(); }
3. 編寫一個(gè)restoreUIState方法,當(dāng)程序重啟時(shí),應(yīng)用在第2步中記錄的實(shí)例的值。
修改onCreate方法,在最后部分添加對(duì)restoreUIState方法的調(diào)用。
@Override public void onCreate(Bundle icicle) { [ ... existing onCreate logic ... ] restoreUIState(); } private void restoreUIState() { // Get the activity preferences object. SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE); // Read the UI state values, specifying default values. String text = settings.getString(TEXT_ENTRY_KEY, ""); Boolean adding = settings.getBoolean(ADDING_ITEM_KEY, false); // Restore the UI to the previous state. if (adding) { addNewItem(); myEditText.setText(text); } }
4. 使用onSaveInstanceState/onRestoreInstanceState機(jī)制來(lái)記錄當(dāng)前選擇的項(xiàng)目的索引。它僅在非用戶顯式的指令殺死應(yīng)用程序時(shí)保存和應(yīng)用。
@Override public void onSaveInstanceState(Bundle outState) { outState.putInt(SELECTED_INDEX_KEY, myListView.getSelectedItemPosition()); super.onSaveInstanceState(outState); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { int pos = -1; if (savedInstanceState != null) if (savedInstanceState.containsKey(SELECTED_INDEX_KEY)) pos = savedInstanceState.getInt(SELECTED_INDEX_KEY, -1); myListView.setSelection(pos); }
當(dāng)你運(yùn)行To-Do List程序時(shí),你應(yīng)該看到了在會(huì)話期間UI狀態(tài)的保存。但是,它還不能保存to-do列表的項(xiàng)目——你將在本章的后面添加這個(gè)核心的功能。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android操作SQLite數(shù)據(jù)庫(kù)技巧總結(jié)》、《Android操作json格式數(shù)據(jù)技巧總結(jié)》、《Android數(shù)據(jù)庫(kù)操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- android中Activity詳解(生命周期、以各種方式啟動(dòng)Activity、狀態(tài)保存,完全退出等)
- Android學(xué)習(xí)小結(jié)之Activity保存和恢復(fù)狀態(tài)
- Android 保存Fragment 切換狀態(tài)實(shí)例代碼
- Android中用onSaveInstanceState保存Fragment狀態(tài)的方法
- 實(shí)例探究Android開發(fā)中Fragment狀態(tài)的保存與恢復(fù)方法
- android初學(xué)者必須掌握的Activity狀態(tài)的四大知識(shí)點(diǎn)(必讀)
- Android編程實(shí)現(xiàn)隱藏狀態(tài)欄及測(cè)試Activity是否活動(dòng)的方法
- Android中檢查、監(jiān)聽電量和充電狀態(tài)的方法
- Android中監(jiān)聽軟鍵盤顯示狀態(tài)實(shí)現(xiàn)代碼
- Android編程實(shí)現(xiàn)狀態(tài)保存的方法分析
相關(guān)文章
Core Animation一些Demo總結(jié) (動(dòng)態(tài)切換圖片、大轉(zhuǎn)盤、圖片折疊、進(jìn)度條等動(dòng)畫效果)
這篇文章主要介紹了Core Animation一些Demo總結(jié) (動(dòng)態(tài)切換圖片、大轉(zhuǎn)盤、圖片折疊、進(jìn)度條等動(dòng)畫效果)的相關(guān)資料,需要的朋友可以參考下2016-02-02Android Studio設(shè)置顏色拾色器工具Color Picker教程
這篇文章主要介紹了Android Studio設(shè)置顏色拾色器工具Color Picker教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-03-03Android ListView實(shí)現(xiàn)圖文列表顯示
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)圖文列表顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01關(guān)于Android HTML5 audio autoplay無(wú)效問題的解決方案
這篇文章主要介紹了關(guān)于Android HTML5 audio autoplay無(wú)效問題的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Android 實(shí)現(xiàn)把bitmap圖片的某一部分的顏色改成其他顏色
這篇文章主要介紹了Android 實(shí)現(xiàn)把bitmap圖片的某一部分的顏色改成其他顏色,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04