【问题标题】:SharedPreferences are sometimes deletedSharedPreferences 有时会被删除
【发布时间】:2011-11-18 06:53:22
【问题描述】:

我的应用使用 SharedPreferences(在 PreferenceActivity 的帮助下)来存储所有设置。但有时会删除所有设置并将所有值设置回默认值。主要在 Android 3.x 选项卡上。 在普通智能手机上没有问题。

我观察到,当应用程序进程被 Android 杀死时,所有设置都会被删除。 我注意到这一点是因为不再显示通知图标。 我还想知道为什么该过程在平板电脑上而不是在智能手机上被终止。在我的智能手机上,通知图标永远不会消失。

我的应用也有一个服务,主进程和服务都对 SharedPreferences 进行读写设置。 我有时注意到,一旦服务写入 SharedPreferences,所有设置都会被清除。但并非每次都会发生。

有什么想法吗? 我意识到 SharedPreferences 不应该被不同的进程使用,但它可以在所有智能手机上正常工作!

【问题讨论】:

  • 最后一句话:Activity和Service都运行在同一个进程中。它们只是同一应用程序的不同组件。
  • 我注意到 SharedPreferences 在某些手机上也被删除了。我无法确定 100% 的原因是什么。但我只是切换到一种新的数据存储模型作为一种潜在的解决方法。
  • @mice:你确定吗?因为在 LogCat 中它们有不同的 pid(进程 ID)
  • @Tim:您是如何实现设置存储的?它是否与 PreferenceActivity 兼容?
  • 我试过这个:getPreferenceManager().setSharedPreferencesMode(Context.MODE_PRIVATE | Context.MODE_MULTI_PROCESS); in onCreate()。但这不是解决方案。一段时间后,所有设置都已重置为默认值。

标签: android service sharedpreferences


【解决方案1】:

我也遇到过同样的问题。 如果偶尔使用key = null 写入一个值,则共享首选项中的所有值都将成为默认值。当您使用 Eclipse 创建新常量时,这是可能的,默认情况下将它们初始化为 null,然后您忘记转到类的开头并将常量更改为一些有意义的值。 如果您继续使用该应用程序,共享首选项的读取操作将返回有效值。 但是当上下文改变时(例如,当 Activity 被 android 杀死并重新创建时)来自共享首选项的所有值都将返回默认值(零)。

所以请检查您的共享偏好设置键! 我希望这个答案会对某人有所帮助。

【讨论】:

    【解决方案2】:

    我找到了设置消失的原因: 如果两个进程将数据写入 SharedPreferences,可能会发生所有 SharedPreferences 都重置为默认值的情况。 在我的情况下,当服务将第一个数据写入 SharedPreferences 时,所有设置都会被清除。

    现在,该服务仅提供对 SharedPreferences 的读取访问权限。两个进程写入访问的设置都存储在数据库中。

    【讨论】:

    • 从服务中删除对共享首选项的访问后,我发现问题已解决
    【解决方案3】:

    SharedPreferences 通常效果很好,正如您提到的,在智能手机上没有任何问题。它也应该适用于平板电脑。但是,最好使用 sqlite 或在服务器上支持您的共享首选项,因为每个用户 id 数据丢失是一个问题。

    【讨论】:

    • 非常感谢您的快速回答。但这只是一种解决方法。而且它不适用于我的 PreferenceActivity,因为这个 Activity 只适用于 SharedPreferences...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2020-01-03
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多