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进程。