2015-06-25 90 views
1

我正在开发一个应用程序,我使用的是后台服务,并将数据保存到共享首选项(因为我知道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设备上。

回答

1

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

这里的another SO question具有相同的问题。

我正在经历完全相同的问题,我要去SQLite。

+0

感谢卢克的投入。看起来这是非常罕见的情况,因为我维护了相同的代码,并且不再发生。虽然频率较低,但这是一个严重的问题,因为偏好设置会保存对任何Android应用程序都至关重要的用户数据/设置。出于好奇,只想知道从SQLite的偏好中获取数据的访问时间是否有所不同?另外,如果我想从我的服务中保存某些数据,例如当前日期(适用于偏好设置的小数据/设置),是否有其他选择?还是仅仅将数据存储到数据库的限制? –

+0

我想说最简单的方法是重新思考你的逻辑,而不是访问过程中的偏好。在我的情况下,这是必须的。由于首选项和SQLite都是应用程序中的文件,我不认为这会有很大的不同。这是一个有效的点 – Luke

+0

谢谢,卢克。当上述错误发生时,它也清除了我的数据库。所以,我仍在监视以确保情况不再出现。另外,就像你的情况一样,我必须访问后台线程上的某些偏好设置(例如,可以检查存储在首选项或其他设置中的日期),所以我想我没有选择。但是,我会重新思考这个逻辑是否可以避免。 –