我使用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);
在闹钟接收器中:
SharedPreferences prefs = contexto.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
int value = prefs.getInt("ComandToDo", -1);
这就是问题,因为“value”不是线程中写的值。
答案 0 :(得分:5)
以下是我遇到的以及我采取的措施。
我正在触发来自活动和广播接收器的警报,我正在更新每次启动应用时读取的共享偏好设置。
触发警报后,每当应用程序启动时,它都会获得仅从该活动设置的旧值。没有反映出Broadcast-Receiver的变化。
这里的诀窍是将共享首选项设置为 MODE_MULTI_PROCESS
通常我们使用MODE_PRIVATE,但执行如下操作:
SharedPreferences prefs = this.getSharedPreferences("Preferences", MODE_MULTI_PROCESS);
注意:在代码中更改模式后,建议清除应用程序数据以避免在调试时出现问题。
编辑: MODE_MULTI_PROCESS需要min API 11
在API 11之前,我能想到的解决方法是创建一个包含两列KEY&的数据库。值。 这可以从其他模块访问。
答案 1 :(得分:3)
记录SharedPreferences不能跨进程工作http://developer.android.com/reference/android/content/SharedPreferences.html,"注意:目前此类不支持跨多个进程使用。这将在稍后添加。"
本回答建议将数据封装到内容提供商中,讨论还会考虑其他一些选项,包括共享的SQLite:https://stackoverflow.com/a/5265556/1665128
文件系统中也有普通的旧文件。我们在几个项目中使用它们,锁定,没有任何问题。也可能是你的选择。
答案 2 :(得分:0)
您正在写入“MyPrefs”首选项文件,然后尝试从“PerfilDeSonidoPreferencias”文件中读取。请从同一个偏好文件中读/写。
答案 3 :(得分:0)
只需使用 IntentService 代替BroadcastReceiver。它对我有用。
服务类:
public class ServiceClass extends IntentService {
public NotificationPopupService(String name) {
super(name);
}
public NotificationPopupService(){
super("YOU_DEFAULT_NAME");
}
@Override
protected void onHandleIntent(Intent intent) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
do magic...
}
}
在应用程序标记中的AndroidManifest.xml文件中:
<service android:name="ServiceClass"/>
创建闹钟:
intent = new Intent(context, ServiceClass.class);
pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// magic after 2 seconds after the creation of alarm
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2000, pendingIntent);