国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android保存Activity狀態的方法

2019-12-12 05:38:16
字體:
來源:轉載
供稿:網友

本文實例講述了Android保存Activity狀態的方法。分享給大家供大家參考,具體如下:

如果你想保存Activity的信息(例如,類實例的變量)而又不需要和其它的組件共享的話,你可以調用Activity的getPreferences方法,不用指定一個Preference的名字。對返回的Shared  Preference的訪問只限于調用的Activity;每個Activity支持一個不命名的Shared Preference對象。

下面的框架代碼顯示了如何使用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 ViewTextView 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();}

保存和恢復實例狀態

對于保存Activity實例的變量來說,Android提供了一種替代Shared Preference的特殊方法。

通過重寫Activity的onSaveInstanceState事件處理函數,你可以使用它的Bundle參數來保存實例的值。保存數據的方法還是使用與在Shared Preference中相同的get和put方法。在完成Bundle的修改后,將其傳入父類的處理函數中,如下面的代碼片段所示:

private static final String TEXTVIEW_STATE_KEY = "TEXTVIEW_STATE_KEY";@Overridepublic void onSaveInstanceState(Bundle outState) {// Retrieve the ViewTextView myTextView = (TextView)findViewById(R.id.myTextView);// Save its stateoutState.putString(TEXTVIEW_STATE_KEY,myTextView.getText().toString());super.onSaveInstanceState(outState);}

這個處理函數會在Activity的Active生命周期結束時觸發,但僅在它不是顯式地結束(即異常結束)。因此,它一般用于確保在單個用戶會話中的Active生命周期間Activity狀態的一致性。

如果一個會話期間,應用程序被迫重啟,那么,保存的Bundle會傳入到onRestoreInstanceState和onCreate方法中。下面的片段顯示了如何從Bundle中提取值來更新Activity實例的狀態:

@Overridepublic 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);}

有一點很重要的是,記住onSaveInstanceState僅在Activity變成非Active狀態時調用,但不在調用finish來關閉它或用戶按下Back按鈕時調用。

保存To-Do List Activity的狀態

目前,每一次To-Do List例子程序重新啟動時,所有的to-do項都丟失了且任何在文本輸入框中輸入的文字也被清除了。在這個例子中,你將在會話期間保存To-Do List程序的狀態。

ToDoList Activity中的實例狀態由三個變量組成:

① 是否一個新的Item正在添加?

② 在新的項目輸入框中存在什么樣的文字?

③ 哪個是當前選擇的項目?

使用Activity默認的Shared Preference,你可以保存這些值,當Activity重啟時更新UI。

在本章的后面,你將學習如何使用SQLite去保存to-do項目。這個例子是第一步,演示如何通過保持Activity實例的細節來確保無瑕疵的體驗。

1. 添加靜態的字符串用作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. 接下來,重寫onPause方法。獲得Activity的私有Shared Preference并得到它的Editor對象。

使用第1步中創建的鍵,存儲實例的值,包括是否一個新的項目正在添加和任何在"new item"輸入框中的文本。

@Overrideprotected 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. 編寫一個restoreUIState方法,當程序重啟時,應用在第2步中記錄的實例的值。

修改onCreate方法,在最后部分添加對restoreUIState方法的調用。

@Overridepublic 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機制來記錄當前選擇的項目的索引。它僅在非用戶顯式的指令殺死應用程序時保存和應用。

@Overridepublic void onSaveInstanceState(Bundle outState){outState.putInt(SELECTED_INDEX_KEY, myListView.getSelectedItemPosition());super.onSaveInstanceState(outState);}@Overridepublic 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);}

當你運行To-Do List程序時,你應該看到了在會話期間UI狀態的保存。但是,它還不能保存to-do列表的項目――你將在本章的后面添加這個核心的功能。

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android編程之activity操作技巧總結》、《Android視圖View技巧總結》、《Android操作SQLite數據庫技巧總結》、《Android操作json格式數據技巧總結》、《Android數據庫操作技巧總結》、《Android文件操作技巧匯總》、《Android編程開發之SD卡操作方法匯總》、《Android開發入門與進階教程》、《Android資源操作技巧匯總》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海门市| 彭山县| 兴隆县| 高平市| 中牟县| 会东县| 五寨县| 延津县| 保山市| 嘉义市| 化隆| 藁城市| 平凉市| 永昌县| 鹤山市| 大宁县| 思南县| 五原县| 德兴市| 和静县| 利津县| 朝阳县| 弋阳县| 邓州市| 江达县| 克东县| 勃利县| 布尔津县| 潼南县| 大方县| 广西| 当雄县| 通城县| 龙门县| 翁源县| 碌曲县| 长乐市| 若羌县| 镇安县| 永靖县| 兴宁市|