最近开发的 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 方法, 只要用户操作了界面, 就可以进行状态保存, 这样会让应用更加可靠一些。

更多相关文章

  1. Android(安卓)View如何获取焦点
  2. Android(安卓)中ListView setOnItemClickListener点击无效原因分
  3. [置顶] Android(安卓)Gallery用法(自定义边框+底部小圆点)
  4. android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题!
  5. Android知识梳理之Service整理
  6. 一步一步学习androidNDK编程(hello world)
  7. Android的Context简介
  8. Android(安卓)Canvas绘图详解(图文)
  9. Android(安卓)viewPage notifyDataSetChanged无刷新

随机推荐

  1. Android(安卓)通知之 Notification
  2. android百度定位
  3. Android(安卓)开发常用代码片段
  4. android截图代码
  5. 获取android 刚发出去的短信
  6. Android(安卓)修改App中默认TextView的字
  7. Eclipse 开发 Android, Hello, TimePicke
  8. Android入门:Button
  9. Android中使用SAX解析XML
  10. android1.5---2.1实现js调摄像头,调Java代