SharedPreferences读取旧值

Ton*_*Ton 9 android sharedpreferences

我使用SharedPreferences来编写并稍后在我的应用程序中的不同活动中读取值.它曾经工作正常,但最近它似乎没有被混合.我的意思是,我写了一个值但是其他活动仍然读取旧值.有时它会正常工作.任何的想法?

编辑:这是一个示例代码:

首先,从一个线程:

SharedPreferences prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("ComandToDo", value);
editor.commit();
... some code later:
alarmmanager.set(AlarmManager.RTC_WAKEUP, Miliseconds, sender);
Run Code Online (Sandbox Code Playgroud)

在报警接收器中:

SharedPreferences prefs = contexto.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
int value = prefs.getInt("ComandToDo", -1);    
Run Code Online (Sandbox Code Playgroud)

这就是问题所在,因为"value"不是线程中写的值.

Kap*_*uri 5

这是我遇到的以及我做了什么来解决它.

我正在触发来自活动和广播接收器的警报,我正在更新每次启动应用程序时读取的共享首选项.

触发警报后,每当应用程序启动时,它将获得仅从该活动设置的旧值.没有反映出Broadcast-Receiver的变化.

这里的技巧是将Shared-Preferences设置为MODE_MULTI_PROCESS

通常我们使用MODE_PRIVATE,但执行如下操作:

SharedPreferences prefs = this.getSharedPreferences("Preferences", MODE_MULTI_PROCESS);
Run Code Online (Sandbox Code Playgroud)

注意:在代码中更改模式后,建议清除应用程序数据以避免在调试时出现问题.

编辑:MODE_MULTI_PROCESS需要min API 11

在API 11之前,我能想到的解决方法是创建一个包含2列KEY&VALUE的数据库.这可以从其他模块访问.


ful*_*.ex 3

  1. SharedPreferences 被记录为不能跨进程工作,http://developer.android.com/reference/android/content/SharedPreferences.html,“注意:当前此类不支持跨多个进程使用。稍后将添加。”

  2. 这个答案建议将数据封装到内容提供程序中,讨论还考虑了一些其他选项,包括共享 SQLite:https ://stackoverflow.com/a/5265556/1665128

  3. 文件系统中还有普通的旧文件。我们在几个项目中使用它们,带有锁定,没有任何问题。也许也是您的一个选择。

  • 截至撰写本文时,[SharedPreferences](http://developer.android.com/reference/android/content/SharedPreferences.html) 仍然显示“注意:当前此类不支持跨多个进程使用。稍后将添加。 ” 但是,API 11 添加了 [MODE_MULTI_PROCESS](http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS),其中“设置后,将检查磁盘上的文件是否有修改,即使共享首选项实例已在此过程中加载...”因此,您应该能够使用 `getSharedPreferences(PREFS_NAME, Context.MODE_MULTI_PROCESS)` (4认同)