我正在开发一个我使用后台服务的应用程序,并且我将数据保存到共享首选项(因为我知道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
虽然这种情况并没有再次发生,但我真的很想知道幕后发生了什么,以及为什么会发生这种情况。 我在这里搜索过其他类似的线程,但是它们表示将null键插入首选项的场景,所以我猜这完全不同。
任何帮助将不胜感激。此外,作为信息,三星Galaxy Note 2设备上出现此问题。
答案 0 :(得分:3)
这是因为您正在后台线程中编写首选项。 已知的问题是,当两个线程访问相同的首选项文件时,首选项将被删除。 您不应将SharedPreferences与进程一起使用,而应使用数据库。
这里another SO question有同样的问题。
我正在经历完全相同的问题,我正在寻找SQLite。