日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

保存Activity的状态

發布時間:2024/9/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 保存Activity的状态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果你想保存Activity的信息(例如,類實例的變量)而又不需要和其它的組件共享的話,你可以調用ActivitygetPreferences方法,不用指定一個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的特殊方法。

?

通過重寫ActivityonSaveInstanceState事件處理函數,你可以使用它的Bundle參數來保存實例的值。保存數據的方法還是使用與在Shared Preference中相同的getput方法。在完成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);

}

?

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

?

如果一個會話期間,應用程序被迫重啟,那么,保存的Bundle會傳入到onRestoreInstanceStateonCreate方法中。下面的片段顯示了如何從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列表的項目——你將在本章的后面添加這個核心的功能。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的保存Activity的状态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。