我正在开发一个应用程序,我使用的是后台服务,并将数据保存到共享首选项(因为我知道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
虽然这种情况没有再出现,但我真的很想知道发生了什么幕后,为什么它是否发生。 我在这里搜索了其他类似的线程,但它们表明了空键被插入到首选项中的场景,所以我想这完全不同。
任何帮助,将不胜感激。另外,作为一个信息,这个问题发生在三星Galaxy Note 2设备上。
感谢卢克的投入。看起来这是非常罕见的情况,因为我维护了相同的代码,并且不再发生。虽然频率较低,但这是一个严重的问题,因为偏好设置会保存对任何Android应用程序都至关重要的用户数据/设置。出于好奇,只想知道从SQLite的偏好中获取数据的访问时间是否有所不同?另外,如果我想从我的服务中保存某些数据,例如当前日期(适用于偏好设置的小数据/设置),是否有其他选择?还是仅仅将数据存储到数据库的限制? –
我想说最简单的方法是重新思考你的逻辑,而不是访问过程中的偏好。在我的情况下,这是必须的。由于首选项和SQLite都是应用程序中的文件,我不认为这会有很大的不同。这是一个有效的点 – Luke
谢谢,卢克。当上述错误发生时,它也清除了我的数据库。所以,我仍在监视以确保情况不再出现。另外,就像你的情况一样,我必须访问后台线程上的某些偏好设置(例如,可以检查存储在首选项或其他设置中的日期),所以我想我没有选择。但是,我会重新思考这个逻辑是否可以避免。 –