Android保存Activity状态的方法
本文实例讲述了Android保存Activity状态的方法。分享给大家供大家参考,具体如下:
如果你想保存Activity的信息(例如,类实例的变量)而又不需要和其它的组件共享的话,你可以调用Activity的getPreferences方法,不用指定一个Preference的名字。对返回的Shared Preference的访问只限于调用的Activity;每个Activity支持一个不命名的SharedPreference对象。
下面的框架代码显示了如何使用Activity的私有SharedPreference:
protectedvoidsaveActivityPreferences() { //Createorretrievetheactivitypreferencesobject. SharedPreferencesactivityPreferences=getPreferences(Activity.MODE_PRIVATE); //Retrieveaneditortomodifythesharedpreferences. SharedPreferences.Editoreditor=activityPreferences.edit(); //RetrievetheView TextViewmyTextView=(TextView)findViewById(R.id.myTextView); //Storenewprimitivetypesinthesharedpreferencesobject. editor.putString("currentTextValue",myTextView.getText().toString()); //Commitchanges. editor.commit(); }
保存和恢复实例状态
对于保存Activity实例的变量来说,Android提供了一种替代SharedPreference的特殊方法。
通过重写Activity的onSaveInstanceState事件处理函数,你可以使用它的Bundle参数来保存实例的值。保存数据的方法还是使用与在SharedPreference中相同的get和put方法。在完成Bundle的修改后,将其传入父类的处理函数中,如下面的代码片段所示:
privatestaticfinalStringTEXTVIEW_STATE_KEY="TEXTVIEW_STATE_KEY"; @Override publicvoidonSaveInstanceState(BundleoutState){ //RetrievetheView TextViewmyTextView=(TextView)findViewById(R.id.myTextView); //Saveitsstate outState.putString(TEXTVIEW_STATE_KEY, myTextView.getText().toString()); super.onSaveInstanceState(outState); }
这个处理函数会在Activity的Active生命周期结束时触发,但仅在它不是显式地结束(即异常结束)。因此,它一般用于确保在单个用户会话中的Active生命周期间Activity状态的一致性。
如果一个会话期间,应用程序被迫重启,那么,保存的Bundle会传入到onRestoreInstanceState和onCreate方法中。下面的片段显示了如何从Bundle中提取值来更新Activity实例的状态:
@Override publicvoidonCreate(Bundleicicle){ super.onCreate(icicle); setContentView(R.layout.main); TextViewmyTextView=(TextView)findViewById(R.id.myTextView); Stringtext=""; if(icicle!=null&&icicle.containsKey(TEXTVIEW_STATE_KEY)) text=icicle.getString(TEXTVIEW_STATE_KEY); myTextView.setText(text); }
有一点很重要的是,记住onSaveInstanceState仅在Activity变成非Active状态时调用,但不在调用finish来关闭它或用户按下Back按钮时调用。
保存To-DoListActivity的状态
目前,每一次To-DoList例子程序重新启动时,所有的to-do项都丢失了且任何在文本输入框中输入的文字也被清除了。在这个例子中,你将在会话期间保存To-DoList程序的状态。
ToDoListActivity中的实例状态由三个变量组成:
①是否一个新的Item正在添加?
②在新的项目输入框中存在什么样的文字?
③哪个是当前选择的项目?
使用Activity默认的SharedPreference,你可以保存这些值,当Activity重启时更新UI。
在本章的后面,你将学习如何使用SQLite去保存to-do项目。这个例子是第一步,演示如何通过保持Activity实例的细节来确保无瑕疵的体验。
1.添加静态的字符串用作Preference的键。
privatestaticfinalStringTEXT_ENTRY_KEY="TEXT_ENTRY_KEY"; privatestaticfinalStringADDING_ITEM_KEY="ADDING_ITEM_KEY"; privatestaticfinalStringSELECTED_INDEX_KEY="SELECTED_INDEX_KEY";
2.接下来,重写onPause方法。获得Activity的私有SharedPreference并得到它的Editor对象。
使用第1步中创建的键,存储实例的值,包括是否一个新的项目正在添加和任何在"newitem"输入框中的文本。
@Override protectedvoidonPause(){ super.onPause(); //Gettheactivitypreferencesobject. SharedPreferencesuiState=getPreferences(0); //Getthepreferenceseditor. SharedPreferences.Editoreditor=uiState.edit(); //AddtheUIstatepreferencevalues. editor.putString(TEXT_ENTRY_KEY,myEditText.getText().toString()); editor.putBoolean(ADDING_ITEM_KEY,addingNew); //Committhepreferences. editor.commit(); }
3.编写一个restoreUIState方法,当程序重启时,应用在第2步中记录的实例的值。
修改onCreate方法,在最后部分添加对restoreUIState方法的调用。
@Override publicvoidonCreate(Bundleicicle) { [...existingonCreatelogic...] restoreUIState(); } privatevoidrestoreUIState() { //Gettheactivitypreferencesobject. SharedPreferencessettings=getPreferences(Activity.MODE_PRIVATE); //ReadtheUIstatevalues,specifyingdefaultvalues. Stringtext=settings.getString(TEXT_ENTRY_KEY,""); Booleanadding=settings.getBoolean(ADDING_ITEM_KEY,false); //RestoretheUItothepreviousstate. if(adding) { addNewItem(); myEditText.setText(text); } }
4.使用onSaveInstanceState/onRestoreInstanceState机制来记录当前选择的项目的索引。它仅在非用户显式的指令杀死应用程序时保存和应用。
@Override publicvoidonSaveInstanceState(BundleoutState) { outState.putInt(SELECTED_INDEX_KEY,myListView.getSelectedItemPosition()); super.onSaveInstanceState(outState); } @Override publicvoidonRestoreInstanceState(BundlesavedInstanceState) { intpos=-1; if(savedInstanceState!=null) if(savedInstanceState.containsKey(SELECTED_INDEX_KEY)) pos=savedInstanceState.getInt(SELECTED_INDEX_KEY,-1); myListView.setSelection(pos); }
当你运行To-DoList程序时,你应该看到了在会话期间UI状态的保存。但是,它还不能保存to-do列表的项目——你将在本章的后面添加这个核心的功能。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android视图View技巧总结》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。