4

我有一个配置活动、一个大型小部件提供程序和一个小型小部件提供程序。从配置活动中,我将一些值保存在共享首选项中。从大大小小的应用程序小部件提供商那里,我得到了那些共享的偏好。我无法为应用小部件提供唯一 ID,并且每次从配置活动转到应用小部件提供程序时,我都希望拥有不同的共享偏好。我怎样才能做到这一点。

4

1 回答 1

6

要为应用小部件的每个实例提供唯一的小部件 ID,您可以执行以下操作:

    AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(ConfigurationActivity.this);
    ComponentName thisAppWidget = new ComponentName(
                ConfigurationActivity.this, WidgetProvider.class);
    int[] appWidgetIds = appWidgetManager
            .getAppWidgetIds(thisAppWidget);
    Intent startBroadcast = new Intent(ConfigurationActivity.this,
                WidgetProvider.class);
    startBroadcast.putParcelableArrayListExtra("list", newsList);
    startBroadcast.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
                appWidgetIds);
    startBroadcast.setAction("android.appwidget.action.APPWIDGET_UPDATE");
        sendBroadcast(startService);

为了将数据保存在唯一的共享首选项中,您可以执行以下操作:

    public void setWidgetNewsCategory(Context context, String category,
        int appWidgetId) {

    Editor editor = context.getSharedPreferences(
            PREFS_NAME_CATEGORY + String.valueOf(appWidgetId),
            Context.MODE_PRIVATE).edit();
    editor.putString(PREFS_VALUE_CATEGORY + String.valueOf(appWidgetId),
            category);
    editor.commit();
}

您可以按如下方式检索此共享首选项值:

     public String getWidgetNewsCategory(Context context, int appWidgetId) {
     SharedPreferences sharedPreferences = context.getSharedPreferences(
            PREFS_NAME_CATEGORY + String.valueOf(appWidgetId),
            Context.MODE_PRIVATE);
    return sharedPreferences.getString(
            PREFS_VALUE_CATEGORY + String.valueOf(appWidgetId), null);
}

最后,在 Widget Provider 的 onReceive 方法中,执行如下操作:

public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int[] appWidgetIds = extras
                    .getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);             
            if (appWidgetIds.length > 0) {
                this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);//here you can call onUpdate method, and update your views as you wish
            }
        }
    } else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras != null
                && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
            final int appWidgetId = extras
                    .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
            this.onDeleted(context, new int[] { appWidgetId });
        }
    } else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
        this.onEnabled(context);
    } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
        this.onDisabled(context);
    }
}

这只是对我有用的通用解决方案。希望它也对你有用。

于 2013-02-11T09:05:30.687 回答