【问题标题】:How do I save the state of my application on minimize?如何在最小化时保存应用程序的状态?
【发布时间】:2016-01-23 15:56:34
【问题描述】:

我正在使用 Android Studio / java。

当我的应用程序最小化时,我需要保存一些自定义变量。我试图制作一个可以通过 onSaveInstanceState() 保存的 Bundle,这似乎有效。一旦应用程序再次处于活动状态,问题就是检索它。据我了解,我可以通过 onRestoreInstanceState() 和 Oncreate() 得到它。问题是永远不会调用 onRestoreInstanceState(),并且在从最小化状态重新打开后不会调用 OnCreate()。

我希望能够按下主页按钮(目前似乎正在正确保存捆绑包),然后通过“最近”按钮重新打开应用程序。当我目前执行此操作时,应用程序会重置,并且我无法获取刚刚保存的 Bundle。我该怎么做?

编辑:调用 finish() 不起作用。我的活动在另一个活动之上,所以如果我这样做,我只会在上一个活动中结束。

【问题讨论】:

标签: java android bundle state minimize


【解决方案1】:

亲爱的朋友,你必须使用共享偏好,就是这样。

(对于您提出的小任务)

共享偏好

设定值---------->

SharedPreferences pref =   
PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = pref.edit();
edit.putString("username", "billy");
edit.putString("user_id", "65");
edit.commit(); 

获取值---------->

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
String username = pref.getString("username", "n/a"); 

还有一些其他的(如果你想保留你的数据)

Android 框架提供了多种持久性选项和策略:

共享首选项 - 将基本数据轻松保存为私有持久字典中的键值对。

本地文件 - 将任意文件保存到内部或外部设备存储。

SQLite 数据库 - 将数据保存在特定于应用程序的数据库中的表中。

ORM - 使用更高级别的查询/更新语法描述和持久化模型对象。

每个存储选项都有如下典型的相关用例:

共享偏好 - 用于应用偏好、密钥和会话信息。

本地文件 - 通常用于 blob 数据或数据文件缓存(即磁盘映像缓存)

SQLite 数据库 - 用于复杂的本地数据操作或原始速度

ORM - 用于在本地存储简单的关系数据以减少 SQL 样板

【讨论】:

  • 我有几个数组需要保存。 SharedPreferences 似乎无法做到这一点。即使是这样,那真的是最好的解决方案吗?
  • @user3026046 我的回答中还提到了一些其他的
【解决方案2】:

如果您只需要保存状态(而不是将其保存到本地存储),onSave/RestoreInstanceState 是正确的方法。

您必须覆盖 protected void onSaveInstanceState(Bundle bundle) 并使用参数中的 Bundle 来添加更多数据。另外,不要忘记致电super.onSaveInstanceState(bundle)。重写 protected 方法很重要,而不是 public 方法。 protected void onRestoreInstanceState(Bundle bundle) 也是如此。您也可以在onCreate() 中恢复状态,但是您需要在那里检查null

可以在official Android training docs 中找到有关如何准确实现正确行为的教程。

【讨论】:

  • 我不需要长期的数据。您正在描述我当前的代码,它的问题是永远不会调用 protected void onRestoreInstanceState(Bundle bundle) ,并且从最小化状态打开时不会调用 onCreate() 。只要我能拿到已保存的捆绑包,一切都会好起来的。
  • onRestoreInstanceState()没有被调用时,Activity并没有被销毁。在这种情况下,状态应该像离开应用程序之前一样存在(您可以检查调试器中的字段)。也许您自己重置了生命周期回调之一中的字段?
【解决方案3】:

onRestoreInstanceState() 不会被调用,除非您的应用程序从内存中卸载(当您立即返回它时不会发生这种情况)。尝试将其最小化,然后打开一些其他应用程序,然后尝试重新打开您的应用程序 - 应该调用 onRestoreInstanceState()。

请注意,当您更改设备方向时,也总是会调用 onRestoreInstanceState()(对测试很有用)。

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多