Sharedpreferences中的值仅在重新启动应用程序后可用

时间:2014-06-12 15:25:21

标签: android broadcastreceiver sharedpreferences android-appwidget

我正在使用App Widget配置活动为我的小部件设置一些设置。当用户确认时,通过调用 saveWidgetConfig(Config)将设置保存到 Sharedpreferences 。稍后,当收到用于刷新小部件的广播时(第一个警报在1000毫秒之后),通过调用 loadWidgetConfig(id)再次加载配置。请参阅下面的简单实现。

现在的问题是即使我

  • 调用editor.apply()(或commit() - 不做任何改动)

  • 不要使用静态类=>每次我创建一个对象: 新的WidgetConfiguration(上下文)

尝试从我的接收器类访问SharedPreferences时,它不包含给定键的任何首选项。

BUT

  • 如果我尝试在apply / commit之后直接访问首选项,它就可以工作 - 即使我创建了一个新的WidgetConfiguration类
  • 在重新启动设备或从ecipse运行新版本后,它也可以正常工作

所以我认为它有不同的背景或者我会得到不同的版本"共享偏好。但到目前为止(超过三个小时!!!)我无法弄清楚......: - (

public class WidgetConfiguration {

    private SharedPreferences prefs;
    private String LOG_TAG = this.getClass().getSimpleName();

    public WidgetConfiguration(Context context) {
        prefs = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static String KEY_WIDGET_CONFIG = "single_widget_object_config_";

    public void saveWidgetConfig(Widget widget) {
        Gson gson = new Gson();
        String json = gson.toJson(widget);
        Editor editor = prefs.edit();
        editor.putString(KEY_WIDGET_CONFIG + widget.getAppwidgetID(), json);
        Log.d(LOG_TAG, "saved widget id " + widget.getAppwidgetID() + "\n" + json);
        editor.apply();
    };

    public Widget loadWidgetConfig(int appwidgetID) {
        Widget loadedWidget = null;
        String key = KEY_WIDGET_CONFIG + appwidgetID;
        if (prefs.contains(key))
        {
            String json = prefs.getString(key, null);
            Log.d(LOG_TAG, "loaded widget id " + appwidgetID + "\n" + json);
            Gson gson = new Gson();
            loadedWidget = gson.fromJson(json, Widget.class);
        }
        else
        {
            Log.e(LOG_TAG, "no preferences found for widget: " + key);
        }

        return loadedWidget;
    }

}

2 个答案:

答案 0 :(得分:1)

把:

editor.commit();

而不是:

editor.apply();

答案 1 :(得分:0)

你保存它 “已保存的小部件ID”+ KEY_WIDGET_CONFIG + widget.getAppwidgetID()

并尝试使用其他密钥获取它 KEY_WIDGET_CONFIG + appwidgetID

使用相同的密钥来获取它