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

У меня есть WidgetProvider и настройка активности

Когда Widget запущен, он начинается с активности configure, и я его настроил, выполнив специальный вызов widgetprovider

(Что вы заметите из примеров учебников sdk)

// Push widget update to surface with newly set prefix AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AwarenessWidget.updateAppWidget(context, appWidgetManager, mAppWidgetId, position); // Make sure we pass back the original appWidgetId Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); finish(); 

Я передаю идентификатор виджета функции … внутри виджета я создаю намерение следующим образом:

  Intent configIntent = new Intent(context, Configure.class); configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingIntent = PendingIntent.getActivity (context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.MainImage,pendingIntent); views.setImageViewResource(R.id.MainImage, lv_images[version]); appWidgetManager.updateAppWidget(appWidgetId, views); 

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

Solutions Collecting From Web of "Обновление только нескольких экземпляров виджета Последнее виджет"

У меня была аналогичная проблема. Просто добавьте это в свою конфигурационную активность, где вы установите PendingIntent:

 Uri data = Uri.withAppendedPath( Uri.parse(URI_SCHEME + "://widget/id/") ,String.valueOf(appWidgetId)); intent.setData(data); 

Переменная URI_SCHEME является строкой и может быть любой, что вам хотелось бы … т.е. – «ABCD». Это заставляет каждого виджета иметь уникальный PendingIntent.

Ниже приведено более подробное объяснение того, почему ваш код не работает и как его исправить. Из документации Android SDK:

Сам PendingIntent – это просто ссылка на токен, поддерживаемый системой, описывающей исходные данные, используемые для ее извлечения. Это означает, что, даже если процесс его приложения приложения будет убит, сам PendingIntent останется пригодным для других процессов, которые ему были предоставлены. Если впоследствии созданное приложение повторно извлекает один и тот же вид PendingIntent (та же операция, то же действие, данные, категории и компоненты Intent, и те же флаги), он получит PendingIntent, представляющий тот же токен, если он все еще действителен, и может Поэтому отмените (), чтобы удалить его.

Из-за этого поведения важно знать, когда два намерения считаются одинаковыми для целей получения PendingIntent. Обычная ошибка, которую люди делают, заключается в создании нескольких объектов PendingIntent с Intents, которые изменяются только в их «лишнем» содержимом, ожидая, что каждый раз получит другой PendingIntent. Этого не происходит. Части намерения, которые используются для сопоставления, являются теми же, что определены Intent.filterEquals. Если вы используете два объекта Intent, которые эквивалентны Intent.filterEquals, вы получите тот же PendingIntent для обоих из них.

Обратите внимание, что указание различного «дополнительного» содержимого недостаточно для того, чтобы PendingIntents считались уникальными, но установка уникального URI с помощью setData. Вот почему решение URI Snailer «волшебным образом» устраняет проблему.

Документация также предлагает другое (возможно более простое) решение проблемы. Вместо создания пользовательского URI просто установите уникальный RequestCode, когда вы вызываете getActivity:

 PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Источник: http://developer.android.com/reference/android/app/PendingIntent.html

В моем тестировании использование setData (…) в PendingIntent не устраняет проблему на Verizon Thunderbolt под управлением Android 4.0.4. Он работает на моих других тестовых устройствах и эмуляторах.

Вместо этого я тестировал использование requestCode, и он работает во всех случаях. Я просто установил requestCode как идентификатор виджетов:

 pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);