我有活动和服务。
活动存储并将数据更新到共享首选项文件中。我是从Activity更新数据然后服务尝试检索更改,但他读取旧值。
代码:
正在保存\正在更新:
@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() - 位于同一个应用中的Singletone类的方法。
已回归设置不为空。
答案 0 :(得分:2)
我很久以前从这个问题就遇到过这个问题:
SharedPreferences does not update data
最后的答案是,因为它是跨越两个单独的进程,所以你必须设置标志Context.MODE_MULTI_PROCESS
。 SharedPreferences缓存应用程序本地内存中的映射,因此默认情况下,进程之间不共享内存。这是在2.3中实现的。如果不支持,我不相信你可以使用这种方法。
答案 1 :(得分:0)
试试:
public void init(Context context)
{
sharedPreferences = context.getSharedPreferences(VOLUME_BOT_PREFERENCES, Context.MODE_MULTI_PROCESS);
}
关于这面旗帜:
设置后,即使已在此过程中加载了共享首选项实例,也会检查磁盘上的文件是否已修改。