转自:http://www.cnblogs.com/xirihanlin/archive/2009/08/05/1539420.html
如果你想保存@H_404_18@Activity的信息(例如,类实例的变量)而又不需要和其它的组件共享的话,你可以调用@H_404_18@Activity的@H_404_18@getPreferences方法,不用指定一个@H_404_18@Preference的名字。对返回的@H_404_18@SharedPreference的访问只限于调用的@H_404_18@Activity;每个@H_404_18@Activity支持一个不命名的@H_404_18@Shared Preference对象。
下面的框架代码显示了如何使用@H_404_18@Activity的私有@H_404_18@Shared Preference:
protected void saveActivityPreferences()
{
// Create or retrieve the activity preferences object.
SharedPreferences activityPreferences =@H_404_18@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”,@H_404_18@myTextView.getText().toString());
// Commit changes.
editor.commit();
}
保存和恢复实例状态
对于保存@H_404_18@Activity实例的变量来说,@H_404_18@Android提供了一种替代@H_404_18@Shared Preference的特殊方法。
通过重写@H_404_18@Activity的@H_404_18@onSaveInstanceState事件处理函数,你可以使用它的@H_404_18@Bundle参数来保存实例的值。保存数据的方法还是使用与在@H_404_18@Shared Preference中相同的@H_404_18@get和@H_404_18@put方法。在完成@H_404_18@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);
}
这个处理函数会在@H_404_18@Activity的@H_404_18@Active生命周期结束时触发,但仅在它不是显式地结束(即异常结束)。因此,它一般用于确保在单个用户会话中的@H_404_18@Active生命周期间@H_404_18@Activity状态的一致性。
如果一个会话期间,应用程序被迫重启,那么,保存的@H_404_18@Bundle会传入到@H_404_18@onRestoreInstanceState和@H_404_18@onCreate方法中。下面的片段显示了如何从@H_404_18@Bundle中提取值来更新@H_404_18@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);
}
有一点很重要的是,记住@H_404_18@onSaveInstanceState仅在@H_404_18@Activity变成非@H_404_18@Active状态时调用,但不在调用@H_404_18@finish来关闭它或用户按下@H_404_18@Back按钮时调用。
保存@H_404_18@To-Do List Activity的状态
目前,每一次@H_404_18@To-Do List例子程序重新启动时,所有的@H_404_18@to-do项都丢失了且任何在文本输入框中输入的文字也被清除了。在这个例子中,你将在会话期间保存@H_404_18@To-Do List程序的状态。
@H_404_18@ToDoList Activity中的实例状态由三个变量组成:
❑@H_404_18@是否一个新的@H_404_18@Item正在添加?
❑@H_404_18@哪个是当前选择的项目?
使用@H_404_18@Activity默认的@H_404_18@Shared Preference,你可以保存这些值,当@H_404_18@Activity重启时更新@H_404_18@UI。
在本章的后面,你将学习如何使用@H_404_18@sqlite去保存@H_404_18@to-do项目。这个例子是第一步,演示如何通过保持@H_404_18@Activity实例的细节来确保无瑕疵的体验。
1. 添加静态的字符串用作@H_404_18@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. 接下来,重写@H_404_18@onPause方法。获得@H_404_18@Activity的私有@H_404_18@Shared Preference并得到它的@H_404_18@Editor对象。
使用第@H_404_18@1步中创建的键,存储实例的值,包括是否一个新的项目正在添加和任何在“@H_404_18@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. 编写一个@H_404_18@restoreUIState方法,当程序重启时,应用在第@H_404_18@2步中记录的实例的值。
修改@H_404_18@onCreate方法,在最后部分添加对@H_404_18@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. 使用@H_404_18@onSaveInstanceState/onRestoreInstanceState机制来记录当前选择的项目的索引。它仅在非用户显式的指令杀死应用程序时保存和应用。
@Override
public void onSaveInstanceState(Bundle outState)
{
outState.putInt(SELECTED_INDEX_KEY,@H_404_18@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);
}
当你运行@H_404_18@To-Do List程序时,你应该看到了在会话期间@H_404_18@UI状态的保存。但是,它还不能保存@H_404_18@to-do列表的项目——你将在本章的后面添加这个核心的功能。