SharedPreferences有时会被删除。

20

我的应用程序使用SharedPreferences(通过PreferenceActivity的帮助)存储所有设置。但有时所有设置都会被删除,所有值都被重置为默认值。大多数出现在Android 3.x平板电脑上。 在普通智能手机上没有问题。

我观察到当Android杀死应用程序进程时,所有设置都会被删除。 我注意到这一点是因为通知图标不再显示。 我也想知道为什么进程会在平板电脑上被杀死而不是在智能手机上。在我的智能手机上,通知图标永远不会消失。

我的应用程序还有一个服务,主进程和服务都读写SharedPreferences中的设置。 我有时会注意到一旦服务写入SharedPreferences,所有设置就会被清除。但这并不总是发生。

有什么想法吗? 我意识到SharedPreferences不应该被不同的进程使用,但它在所有智能手机上都没有问题!


对于最后一句话:Activity和Service都在同一个进程中运行。它们只是同一个应用程序的不同组件。 - Pointer Null
我注意到SharedPreferences在一些手机上被删除了。我无法百分之百确定是什么原因导致的。但我正在尝试切换到新的数据存储模型来解决这个问题。 - FoamyGuy
@mice:你确定吗?因为在LogCat中它们有不同的pid(进程ID)。 - almisoft
@Tim:你是如何实现设置存储的?它是否与PreferenceActivity兼容? - almisoft
我尝试过在onCreate()中使用getPreferenceManager().setSharedPreferencesMode(Context.MODE_PRIVATE | Context.MODE_MULTI_PROCESS);,但这不是解决方案。过了一会儿,所有设置都被重置为默认值。 - almisoft
@user909406 目前我正在测试将信息写入我的文件。没有额外的工作,它不会与偏好设置活动相连接。 - FoamyGuy
3个回答

22

我找到了设置消失的原因:

如果有两个进程向SharedPreferences写入数据,可能会导致所有SharedPreferences重置为默认值。在我的情况下,当服务将第一次数据写入SharedPreferences时,所有设置都被清除了。

现在,该服务仅提供对SharedPreferences的读访问。由两个进程写入的设置存储在数据库中。


2
将对共享首选项的访问取消后,我发现问题已经解决。 - vallllll

3
我遇到了相同的问题。如果一个值偶尔被写为 key = null,那么所有从共享首选项中获取的值都会变成默认值。这种情况可能发生在您使用Eclipse创建新常量时,默认情况下将它们初始化为空,然后您忘记回到类的开头并将常量更改为有意义的值。 如果你继续使用应用程序,共享首选项的读取操作将返回有效的值。但是当上下文发生变化(例如,当Android杀死并重新创建活动时),所有共享首选项中的值都将返回默认值(零)。

因此,请检查您的共享首选项键!我希望这个答案能帮助到某些人。


3

SharedPreferences通常在智能手机上无任何问题,正如你所提到的。它也应该适用于平板电脑。然而,如果用户数据丢失是一个问题,最好使用SQLite或将共享首选项备份到服务器上。


非常感谢您的快速回答。但这只是一个权宜之计。而且对于我的PreferenceActivity不适用,因为此Activity仅适用于SharedPreferences... - almisoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接