共享首选项自动删除

3
我正在开发一个应用程序,其中我使用了一个后台服务,并将我的数据保存到共享首选项中(因为我知道Android在低内存状态下可能会杀死服务)。它工作得很好,我定期将我的数据保存到首选项中。但是在一种罕见的情况下,我注意到当Android杀死并重新启动我的服务时(这之间有大约20-30秒的间隔),在此期间我的首选项被自动清除了。我查看了转储状态以推断其原因,但我无法理解为什么会发生这种情况。
以下是日志的相关部分,表明首选项中的数据已被清除:
    06-25 17:30:34.848  2452  2966 V ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.example.gaurav
06-25 17:30:34.863  2452  2966 D EnterpriseDeviceManager: ContainerId: 0
06-25 17:30:34.863  2452  2966 V ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.example.gaurav
06-25 17:30:34.863  2452  2966 D PackageManager: START CLEAR APPLICATION USER DATA: observer{1126181288}
06-25 17:30:34.863  2452  2966 D PackageManager: pkg{<packageName>}
06-25 17:30:34.863  2452  2966 D PackageManager: user{0}
06-25 17:30:34.898  2831  2831 D ContainerEventsRelayManager: <<< Intent action is >>> : android.intent.action.PACKAGE_RESTARTED
06-25 17:30:34.898  2831  2831 D ContainerEventsRelayManager: <<< Intent data is   >>> : package:com.example.gaurav
06-25 17:30:34.898  2695  2695 D ContexualWidgetMonitor:  id = 0
06-25 17:30:34.898  2695  2695 D ContexualWidgetMonitor: action =android.intent.action.PACKAGE_RESTARTED
06-25 17:30:34.898  2695  2695 D ContexualWidgetMonitor: pkg =null
06-25 17:30:34.898  2695  2695 D ContexualWidgetMonitor: mCheckMissedEvent =false
06-25 17:30:34.903  2831  2831 D ContainerEventsRelayManager: <<< Intent action is >>> : android.intent.action.PACKAGE_DATA_CLEARED
06-25 17:30:34.903  2831  2831 D ContainerEventsRelayManager: <<< Intent data is   >>> : package:com.example.gaurav
06-25 17:30:34.908  2452  2580 I PackageManager: remove MCS_UNBIND message and Posting MCS_UNBIND 10 secs later

虽然这种情况没有再次发生,但我真的想知道在幕后发生了什么,以及为什么会发生。我在这里搜索了其他类似的线程,但它们指出了将空键插入到首选项中的情况,所以我猜这是完全不同的情况。
任何帮助都将不胜感激。此外,作为信息,这个问题出现在三星Galaxy Note 2设备上。
1个回答

3

发生这种情况是因为您正在后台线程中编写首选项。 众所周知,当两个线程访问同一首选项文件时,首选项将被删除。 您不应该在进程中使用SharedPreferences,而应该使用数据库。

这里有另一个遇到相同问题的SO问题

我也遇到了完全相同的问题,我选择使用SQLite。


感谢Luke提供的意见。看起来这是一个非常罕见的情况,因为我已经保持了相同的代码,而且没有再次发生。尽管频率很低,但这是一个严重的问题,因为首选项保存了对于任何Android应用程序都至关重要的用户数据/设置。出于好奇,我想知道从首选项获取数据和从SQLite获取数据的访问时间是否有差异?此外,如果我想保存某些数据,比如当前日期(适合首选项的小型数据/设置),从我的服务中是否有其他选择?或者只能从服务存储数据到数据库中是一种限制吗? - undefined
我会说最简单的方法是重新思考你的逻辑,不要在一个进程中访问偏好设置。在我的情况下,这是必须的。由于偏好设置和SQLite都是应用程序中的文件,我认为它们之间没有太大的区别。不过这也是一个有效的观点。 - undefined
谢谢,卢克。当上述错误发生时,它也清除了我的数据库。因此,我仍在监控以确保不再出现这种情况。另外,就像你的情况一样,我必须在后台线程中访问某些偏好设置(例如检查存储在偏好设置中的日期或其他设置),所以我想我别无选择。但是,我会重新考虑逻辑,看看是否可以避免这种情况。 - undefined
数据库也被删除了?根据你的日志,我看到了这条消息:“开始清除应用用户数据:observer{1126181288}”。看起来你是正确的。如果你找到了解决办法,请告诉我。我刚刚使用数据库发送了一个更新到我的应用程序,让我们看看错误是否减少了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接