Обработка нескольких экземпляров appwidget

У меня есть активность конфигурации, большой провайдер виджетов и небольшой провайдер виджетов. Из активности конфигурации я сохраняю некоторые значения в общих настройках. От крупных и мелких поставщиков виджета приложений я получаю эти общие настройки. Я не могу предоставить виджетам приложения уникальные идентификаторы, и я хочу иметь разные общие предпочтения каждый раз, когда я перехожу от приложения конфигурации к поставщику виджета приложений. Как я могу достичь этого.

Чтобы предоставить уникальные идентификаторы виджетов для каждого экземпляра виджета приложения, вы можете сделать следующее:

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(); } 

Вы можете получить это общее значение pref следующим образом:

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

И, наконец, в методе onReceive поставщика Widget выполните следующие действия:

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

Это просто общее решение, которое сработало для меня. Надеюсь, это сработает и для вас.