Android 应用保存状态
Android 应用保存状态
最近开发的 Android 应用中需要添加保存用户状态的功能, 经过查阅 Android 的文档, 保存用户状态的几种方法如下:
1、 使用 Bundle 保存界面状态
Android 系统提供的 Bundle 类似于哈希表, 以 key、 value 的形式保存数据, 支持存取几种常见的类型。 最先找到的文档就是通过 Activity 的 onSaveInstanceState 和 onRestoreInstanceState 方法来保存用户状态, 虽然最终测试发现这种方法不是肯靠谱, 还是记录下来了。
onSaveInstanceState 保存状态
当系统销毁 Android 程序, 进行内存回收时, 会调用 Activity 的 onSaveInstanceState 方法, 传入一个 Bundle 实例参数, 通过重写这个方法, 可以保存 Activity 的状态, 示例代码如下:
protected override void OnSaveInstanceState(Bundle outState) {
base.OnSaveInstanceState(outState);
outState.PutInt("main_activity_click_count", _count);
outState.PutString("main_activity_button_text", _myButton.Text);
}
对于 Fragment 来说, 也是重写这个方法。
onRestoreInstanceState 恢复状态
当系统重新回到以前被系统回收的应用时, 会调用 onRestoreInstanceState 方法, 如果之前用 onSaveInstanceState 保存了状态, 则可以通过重写 onRestoreInstanceState 方法恢复状态。
Activity 恢复状态
对于 Activity 来说, 可以在 onCreate 方法中读取保存的状态, 代码如下:
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
if (bundle != null) {
/* retain ui state */
}
}
也可以在 onRestoreInstanceState 方法中读取保存的状态, 代码如下:
protected override void OnRestoreInstanceState(Bundle savedInstanceState) {
base.OnRestoreInstanceState(savedInstanceState);
_count = savedInstanceState.GetInt("main_activity_click_count", _count);
_myButton.Text = savedInstanceState.GetString("main_activity_button_text", "Nothing in state.");
}
Fragment 恢复状态
对于 Fragment 来说, 可以在 onCreate 、 onActivityCreated 、 onCreateView 中读取 onSaveInstanceState 方法中保存的状态, 这三个方法分别如下:
public override void OnCreate(Bundle savedInstanceState) {
base.OnCreate(savedInstanceState);
}
public override void OnActivityCreated(Bundle savedInstanceState) {
base.OnActivityCreated(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return base.OnCreateView(inflater, container, savedInstanceState);
}
经过测试, 这种方法最大的缺点就是不靠谱 , 因为 onSaveInstanceState 和 onResotreInstanceState 不是每次都能被系统调用, 因为应用可能在调用 onRestoreInstanceState 方法之前应用就被结束了, 大家都喜欢装杀进程的软件, 应用程序总免不了被结束的命运, 所以这种方法不是很可靠的。
2、 使用 SharedPreference 保存状态
Android 推荐在 onPause 方法中使用 SharedPreference 保存状态是比较可靠的, 因为 SharedPreference 是基于文件的, 所以被结束进程也不怕。
保存状态
不管是 Activity 还是 Fragment , 都可以通过重写 onPause 方法来保存状态, 代码如下:
protected override void OnPause() {
base.OnPause();
var pref = this.GetPreferences(FileCreationMode.Private);
var editor = pref.Edit();
editor.PutInt("main_activity_click_count", _count);
editor.PutString("main_activity_button_text", _myButton.Text);
editor.Commit();
}
恢复状态
虽然可以在任何时候读取保存的 SharedPreference , 但是还是推荐在 onCreate 方法中读取保存的内容, 示例代码如下:
protected override void OnCreate(Bundle bundle) {
base.OnCreate(bundle);
/* setup code here */
var pref = this.GetPreferences(FileCreationMode.Private);
_count = pref.GetInt("main_activity_click_count", _count);
_myButton.Text = pref.GetString("main_activity_button_text", "Nothing in state.");
}
注意问题
Activity 有两个方法来创建 SharedPreference , getPreferences 和 getSharedPreferences , getPreference 创建的 SharedPreference 只能在当前的 Activity 中访问, 而 getSharedPreference 创建的选项则可以在整个应用中访问。
保存用户状态建议积极一些, 不要总是等待系统调用 onPause 方法, 只要用户操作了界面, 就可以进行状态保存, 这样会让应用更加可靠一些。
- “正在注册字体”问题解决
- linux下安装php的swoole扩展模块(安装后php加载不出来?)
- linux下查询域名或IP注册信息的操作记录(whois)
- 域名资讯:多枚区块链域名结拍,区块链概念火热
- 一批好米交易:qrf.com15.4万元结拍
- mysql主从同步(2)-问题梳理
- 老丁独家!前方高能,与“程序崩溃”的第一次邂逅!
- 微信可接收火车购票、退票及改签等通知啦!别忘了,春运火车票下周开售!
- 如何用SPSS分析问卷?用SPSS分析调查问卷数据的方法
- 【5】基于Log4Net的日志系统
- VMware vSphere虚拟化-VMware ESXi 5.5组件安装过程记录
- 淘宝iOS端圣诞节雪花实现分析
- 【6】页面数据和控件的自动交换机制
- silverlight版的图片轮换广告
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 每日两题 T37
- 每日两题 T38
- Unity打iOS包之xcodeapi的使用
- C++中sort函数使用方法
- 史上最贴心React渲染器开发辅导
- 010.Nginx正反代理
- ClickHouse源码笔记2:聚合流程的实现
- 5G边缘计算赋能安防互联网直播行业,青犀视频强力打造云、边、端一体化协同音视频解决方案
- 视频云平台流媒体服务EasyNVR能获取直播视频的RTSP流地址吗?
- 如何编写不存在即插入的 SQL
- SQL 打印一个月的日历
- Kubernetes节点的驱逐与预留
- 使用reveal.js制作精美的网页版PPT
- Ceph快照爱你不容易系列 03:快照数据一致性浅析
- 没想到竟是因为它!让我的服务器变成了别人的挖矿工具