Android保存Activity状态的方法

本文实例讲述了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 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相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android视图View技巧总结》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

时间: 2024-08-01 13:21:05

Android保存Activity状态的方法的相关文章

Android保存Activity状态的方法_Android

本文实例讲述了Android保存Activity状态的方法.分享给大家供大家参考,具体如下: 如果你想保存Activity的信息(例如,类实例的变量)而又不需要和其它的组件共享的话,你可以调用Activity的getPreferences方法,不用指定一个Preference的名字.对返回的Shared  Preference的访问只限于调用的Activity:每个Activity支持一个不命名的Shared Preference对象. 下面的框架代码显示了如何使用Activity的私有Shar

android SharedPreferences详解(android存储用户状态信息方法)

在andorid很多应用开发中都需要记录用户登录信息,使用静态变量手机关机用户状态清除,解决方法是使用SharedPreferences存储android用户信息. 一.SharedPreferences基础知识介绍 获取SharedPreferences的两种方式: 1 调用Context对象的getSharedPreferences()方法 2 调用Activity对象的getPreferences()方法 两种方式的区别: 调用Context对象的getSharedPreferences(

Android中用onSaveInstanceState保存Fragment状态的方法_Android

在Fragment里面,利用onSaveInstanceState保存数据,并可在onActivityCreated里面恢复数据. public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { // Restore the fragment's state here } } p

Android中用onSaveInstanceState保存Fragment状态的方法

在Fragment里面,利用onSaveInstanceState保存数据,并可在onActivityCreated里面恢复数据. public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { // Restore the fragment's state here } } p

Android中Activity全局共享方法AppContext

在 android 的所有 activity 中共享同一个对象实例的方法 1. 新建 AppContext.java 文件(名称可自定义) public class AppContext extends Application { public void test() { // .... do something } } 2. 打开 AndroidManifest.xml 文件,给 application 元素添加 name 属性,值为 .AppContext 即指定上方自定义的类名 3. 在

activity-Android保存Activity的状态

问题描述 Android保存Activity的状态 如下图,我想保存打勾图片的visiable状态和最下面的用于计数的数字,当点击返回按钮时调用finish结束Activity,请问这些信息怎么保存呢? 求大神解答 解决方案 Android 之 getSharedPreferences 和 getPreferences 保存数据的方法如上述的链接,在 onStop 中调用.

Android编程实现检测当前电源状态的方法_Android

本文实例讲述了Android编程实现检测当前电源状态的方法.分享给大家供大家参考,具体如下: 检测到现在在电源状态: IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); registerReceiver(mIntentReceiver, mIntentFilter); //声明消息处理过程 private BroadcastReceiver

Android中Activity的生命周期探讨_Android

1.完整生命周期 上图是Android Activity的生命周期图,其中Resumed.Paused.Stopped状态是静态的,这三个状态下的Activity存在时间较长. (1)Resumed:在此状态时,用户可以与Activity进行交互,Activity在最前端 (2)Paused:在此状态时,Activity被另外一个Activity遮盖,此Activity不可接受用户输入信息.另外一个Activity来到最前面,半透明的,但并不会覆盖整个屏幕. (3)Stopped:在此状态时,A

Android中Activity的生命周期探讨

1.完整生命周期 上图是Android Activity的生命周期图,其中Resumed.Paused.Stopped状态是静态的,这三个状态下的Activity存在时间较长. (1)Resumed:在此状态时,用户可以与Activity进行交互,Activity在最前端 (2)Paused:在此状态时,Activity被另外一个Activity遮盖,此Activity不可接受用户输入信息.另外一个Activity来到最前面,半透明的,但并不会覆盖整个屏幕. (3)Stopped:在此状态时,A