共享首选项自动删除

Shared Preferences deleted automatically

我正在开发一个使用后台服务的应用程序,并将我的数据保存到共享首选项(据我所知,Android 可以在低内存状态时终止服务)。它运行良好,我会定期将数据保存到首选项中。但作为一种罕见的情况,我注意到 Android 终止了我的服务并重新启动它(这之间有大约 20-30 秒的间隔),在此间隔期间我的首选项被自动清除。我检查了 dumpstate 来推断这背后的原因,但我不明白为什么会这样。

这是日志的相关部分,表明已从首选项中清除数据:

    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

虽然这种情况没有再次发生,但我真的很想知道幕后发生了什么,为什么会发生。 我在这里搜索了其他类似的线程,但它们表示将空键插入首选项的场景,所以我想这是完全不同的。

如有任何帮助,我们将不胜感激。另外,作为一个信息,这个问题发生在 Samsung Galaxy Note 2 设备上。

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

这里 another SO question 有同样的问题。

我正在经历完全相同的问题,我正在使用 SQLite。