我正在开发一个使用后台服务的应用程序,并将我的数据保存到共享首选项(因为我知道 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。
关于android - 共享首选项自动删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056285/