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

У меня есть 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); 

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

У меня была аналогичная проблема. Просто добавьте это в свою конфигурационную деятельность, где вы установите 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 просто установите уникальный код запроса, когда вы вызываете 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); 
  • Выделение текста в TextView или WebView
  • Виджет для включения / выключения фонарика камеры в android
  • Android: изменение вкладки Цвет текста программно
  • Назначьте ширину ширины ширины доступной ширины декларативно
  • Виджет не обновляется при перезапуске
  • играть в YouTube в WebView
  • Как запустить onListItemClick в Listactivity с помощью кнопок в списке?
  • Как сделать меньший рейтингBar?
  • Как контролировать ширину и высоту диалогового windows Alert Dial по умолчанию в Android?
  • Как сделать размер экрана GridLayout подходящим
  • Android - Можно ли отключить нажатие кнопки «Домой»
  • Interesting Posts

    Как в диалоговом окне «Запуск» известно, где находятся приложения?

    Что использовать? MVC, MVP или MVVM или …?

    Где метод Rails, который преобразует данные из `datetime_select` в объект DateTime?

    Всегда открывать новое окно с экрана запуска

    Как захватить видео на рабочем столе Windows 7 в медиаплеере VLC?

    Windows снижает объем из-за «связи»

    Есть ли 64-битное программное обеспечение для Windows, которое гораздо предпочтительнее 32-разрядной копии в 64-разрядной ОС?

    Как добавить раздел Windows 7 в список доступных ОС для grub2?

    Как преобразовать NSData в массив байтов в iPhone?

    Как я могу избежать перекрытия медиа-запросов?

    Как выбрать приложение по умолчанию для открытия файлов в Firefox?

    Прозрачный туннель между интерфейсами на удаленных хостах

    Реализация Java Array HashCode

    WPF. Должен ли пользовательский элемент управления иметь свой собственный ViewModel?

    Загрузка пользовательских файлов конфигурации

    Давайте будем гением компьютера.