保存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列表的项目——你将在本章的后面添加这个核心的功能。
保存Activity的状态相关推荐
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...
一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- Activity的状态保存
当点击home键或程序运行过程中突然来电话等意外情况或屏幕方向改变时,会调用onSaveInstanceState()方法进行保存数据到手机硬盘上,再次运行Activity时则调用onRestoreI ...
- Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)...
一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...
- 利用onSaveInstanceState()方法保存Activity状态
2019独角兽企业重金招聘Python工程师标准>>> Activity里的onSaveInstanceState()方法,虽然系统会自动调用它来保存Activity的一些数据,但当 ...
- 用onSaveInstanceState()方法保存Activity状态
https://blog.csdn.net/yuzhiboyi/article/details/7677026 实现并覆盖了onSaveInstanceState方法: [java] view pla ...
- 【Android】保存Fragment切换状态
[Android]保存Fragment切换状态 前言 一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法. 声明 欢迎转载,但请保留文章 ...
- android 保存textview,为什么没有TextView(带ID)会自动保存它的状态?
我的理解是所有具有ID的标准视图都应该自动保存它们的状态,并且在尝试这个例子时我发现它非常令人困惑. 我只有1个活动和主要布局如下所示. 当我通过单击按钮更改TextView的文本,然后旋转屏幕时,T ...
- html 存储登录状态,Vue中保存用户登录状态实例代码
首先我们假设,这里的登录组件(register.vue)是App.vue组件的子组件,是通过路由进入登录组件的. 登录组件中用户点击登录后,后台会传过来一个用户名,我的App.vue组件中需要拿到这个 ...
- JS 怎么使用十六进制保存100位状态的问题
现在开发遇到一个需求,需要保存100个状态,状态只有0和1两种状态,如果使用字符串保存100个0和1,那么就会很长, 然后就想到了转成16进制 思考 但是在JS里最大的安全整数 Number.MAX_ ...
最新文章
- 清华姚校友陈丹琦斩获2022斯隆奖!博士论文是近十年最热之一!共计27位华人入选...
- 打造数字化服务能力,中国联通如何借助云原生技术实现增长突围?
- 华为路由器RIP协议通信的配置
- 笔记本电脑没有鼠标怎么拖动_适合办公鼠标要如何选择?除了便携更需要这些...
- POJ 3233 Matrix Power Series (矩阵分块,递推)
- dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...
- 计算机管理技术学院,计算机管理论文,关于国家电网技术学院:管理平台有“三好”教学管理享轻松相关参考文献资料-免费论文范文...
- DSP编程的一些优化技巧和注意事项
- java做法_Java方法
- python optimize_SciPy优化optimize模块用法
- Linux下使用Netfilter强制清除IPv4 DF标志
- 无盘工作站建立全攻略
- 文华财经彩波均线主图指标公式(指标公式源码)破解加密
- GJB9001-2017质量管理体系
- 信息安全技术--轮转机密码
- 网站导航 - 网址大全
- java——记录一次条形码、二维码、订单自动生成的制作
- 我奋斗了18年才和你坐在一起喝咖啡 原作者:麦子
- [动态规划] NKOJ 4250 小区划分
- raw文件与jpg文件的读取/转换/显示
热门文章
- C++sparse matrix 稀疏矩阵的实现算法(附完整源码)
- C++预处理程序指令
- QT的QCommandLineParser类的使用
- boot spring 怎么执行hql_spring-boot 中使用graphql的正确姿势
- fillstyle属性_html设置或返回用于填充绘画的颜色渐变或模式的属性fillStyle
- 65.Java语法糖
- CDH Hadoop 基于CM方式半在线安装步骤详解
- python做前端可视化_Python数据可视化的四种简易方法
- 如何解决连接不上us.archive.ubuntu.com
- 动态库、静态库、运行时库、引入库之间的区别