Android SharedReferences不更新数据
我有活动和服务 活动将数据存储并更新到共享首选项文件中。我正在更新活动中的数据,然后服务尝试检索更改,但他读取了旧值 代码: 保存\更新:Android SharedReferences不更新数据,android,sharedpreferences,Android,Sharedpreferences,我有活动和服务 活动将数据存储并更新到共享首选项文件中。我正在更新活动中的数据,然后服务尝试检索更改,但他读取了旧值 代码: 保存\更新: @Override public void save(VolumeBotSettings settings) { SharedPreferences.Editor edit = sharedPreferences.edit(); edit.putInt(START_HOURS, settings.getStartHours()); e
@Override
public void save(VolumeBotSettings settings) {
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putInt(START_HOURS, settings.getStartHours());
edit.putInt(START_MINUTES, settings.getStartMinutes());
edit.putInt(END_HOURS, settings.getEndHours());
edit.putInt(END_MINUTES, settings.getEndMinutes());
edit.putInt(RING_VOLUME_LEVEL, settings.getRingVolumeLevel());
edit.putInt(MUSIC_VOLUME_LEVEL, settings.getMusicVolumeLevel());
edit.putInt(NOTIFICATION_VOLUME_LEVEL, settings.getNotificationVolumeLevel());
edit.putInt(ALARM_VOLUME_LEVEL, settings.getAlarmVolumeLevel());
edit.commit();
}
@Override
public VolumeBotSettings retrieve() {
VolumeBotSettings settings = new VolumeBotSettings();
settings.setStartHours(sharedPreferences.getInt(START_HOURS, UNDEFINED));
settings.setEndHours(sharedPreferences.getInt(END_HOURS, UNDEFINED));
settings.setStartMinutes(sharedPreferences.getInt(START_MINUTES, UNDEFINED));
settings.setEndMinutes(sharedPreferences.getInt(END_MINUTES, UNDEFINED));
settings.setRingVolumeLevel(sharedPreferences.getInt(RING_VOLUME_LEVEL, UNDEFINED));
settings.setMusicVolumeLevel(sharedPreferences.getInt(MUSIC_VOLUME_LEVEL, UNDEFINED));
settings.setNotificationVolumeLevel(sharedPreferences.getInt(NOTIFICATION_VOLUME_LEVEL, UNDEFINED));
settings.setAlarmVolumeLevel(sharedPreferences.getInt(ALARM_VOLUME_LEVEL, UNDEFINED));
if (settings.isNotNull())
return settings;
else
return null;
}
阅读:
@Override
public void save(VolumeBotSettings settings) {
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putInt(START_HOURS, settings.getStartHours());
edit.putInt(START_MINUTES, settings.getStartMinutes());
edit.putInt(END_HOURS, settings.getEndHours());
edit.putInt(END_MINUTES, settings.getEndMinutes());
edit.putInt(RING_VOLUME_LEVEL, settings.getRingVolumeLevel());
edit.putInt(MUSIC_VOLUME_LEVEL, settings.getMusicVolumeLevel());
edit.putInt(NOTIFICATION_VOLUME_LEVEL, settings.getNotificationVolumeLevel());
edit.putInt(ALARM_VOLUME_LEVEL, settings.getAlarmVolumeLevel());
edit.commit();
}
@Override
public VolumeBotSettings retrieve() {
VolumeBotSettings settings = new VolumeBotSettings();
settings.setStartHours(sharedPreferences.getInt(START_HOURS, UNDEFINED));
settings.setEndHours(sharedPreferences.getInt(END_HOURS, UNDEFINED));
settings.setStartMinutes(sharedPreferences.getInt(START_MINUTES, UNDEFINED));
settings.setEndMinutes(sharedPreferences.getInt(END_MINUTES, UNDEFINED));
settings.setRingVolumeLevel(sharedPreferences.getInt(RING_VOLUME_LEVEL, UNDEFINED));
settings.setMusicVolumeLevel(sharedPreferences.getInt(MUSIC_VOLUME_LEVEL, UNDEFINED));
settings.setNotificationVolumeLevel(sharedPreferences.getInt(NOTIFICATION_VOLUME_LEVEL, UNDEFINED));
settings.setAlarmVolumeLevel(sharedPreferences.getInt(ALARM_VOLUME_LEVEL, UNDEFINED));
if (settings.isNotNull())
return settings;
else
return null;
}
在使用共享首选项之前,我还重新初始化了它们
private static final String VOLUME_BOT_PREFERENCES = "volume_bot_preferences";
public void init(Context context) {
sharedPreferences = context.getSharedPreferences(VOLUME_BOT_PREFERENCES, Context.MODE_PRIVATE);
}
因此,分步行动:
Activity call init() method.
Activity call save() method.
Close Activity. Service is running.
Service call init() method.
Service call retrive() method.
没有更新任何数据。请帮助我了解原因
注意。init()、save()、retrieve()-位于同一应用程序中的单音类的方法。
检索的设置不为空 试试看:
public void init(Context context)
{
sharedPreferences = context.getSharedPreferences(VOLUME_BOT_PREFERENCES, Context.MODE_MULTI_PROCESS);
}
关于此标志:
设置后,即使在此过程中已加载共享首选项实例,也会检查磁盘上的文件是否有修改
我很久以前就有过这个问题:
最后的答案是,由于它跨越两个独立的进程,因此必须设置标志
Context.MODE\u MULTI\u PROCESS
。SharedReferences在应用程序的本地内存中缓存映射,因此默认情况下,内存不会在进程之间共享。这是在2.3中实现的。如果支持的数据少于此值,我不相信您可以使用此方法。您是否使用相同的SharedReferences
来保存和检索数据?@Aashish我希望是<代码>音量机器人首选项是一个常量值。它定义了sp文件名。服务是否在单独的进程上运行?设置SharedReference时,需要使用上下文.MODE\u MULTI\u进程
。对不起,@DeeV首先在评论中回答了。(坦白地说)没什么私事)没问题,我没有看到他的评论;)自API 23以来,不推荐使用模式\u多\u进程。