若是你想保存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 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();
}
保存和恢復實例狀態
對於保存Activity實例的變量來講,Android提供了一種替代Shared Preference的特殊方法。
經過重寫Activity的onSaveInstanceState事件處理函數,你可使用它的Bundle參數來保存實例的值。保存數據的方法仍是使用與在Shared Preference中相同的get和put方法。在完成Bundle的修改後,將其傳入父類的處理函數中,以下面的代碼片斷所示:
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);
}
這個處理函數會在Activity的Active生命週期結束時觸發,但僅在它不是顯式地結束(即異常結束)。所以,它通常用於確保在單個用戶會話中的Active生命週期間Activity狀態的一致性。
若是一個會話期間,應用程序被迫重啓,那麼,保存的Bundle會傳入到onRestoreInstanceState和onCreate方法中。下面的片斷顯示瞭如何從Bundle中提取值來更新Activity實例的狀態:
@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);
}
有一點很重要的是,記住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」輸入框中的文本。
@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. 編寫一個restoreUIState方法,當程序重啓時,應用在第2步中記錄的實例的值。
修改onCreate方法,在最後部分添加對restoreUIState方法的調用。
@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機制來記錄當前選擇的項目的索引。它僅在非用戶顯式的指令殺死應用程序時保存和應用。
@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);
}
當你運行To-Do List程序時,你應該看到了在會話期間UI狀態的保存。可是,它還不能保存to-do列表的項目——你將在本章的後面添加這個核心的功能。android