SharedPreferences不会更新数据

时间:2014-11-12 23:09:49

标签: android sharedpreferences

我有活动和服务。

活动存储并将数据更新到共享首选项文件中。我是从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类的方法。
已回归设置不为空。

2 个答案:

答案 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);
}

关于这面旗帜:

  

设置后,即使已在此过程中加载了共享首选项实例,也会检查磁盘上的文件是否已修改。