Несколько экземпляров только виджета Обновление последнего виджета - PullRequest
19 голосов
/ 25 октября 2010

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

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

Ответы [ 3 ]

50 голосов
/ 25 октября 2010

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

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

Переменная URI_SCHEME является строкой и может быть любой, какой вы хотите .. т.е. - "ABCD". Это заставляет каждый виджетиметь уникальный PendingIntent.

37 голосов
/ 21 ноября 2012

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

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

Из-за этого поведения важно знать, когда два Intents считаются одинаковыми для получения PendingIntent.Распространенная ошибка, которую делают люди, заключается в создании нескольких объектов PendingIntent с Intents, которые различаются только по своему «дополнительному» содержимому, ожидая, что каждый раз будет получаться другой PendingIntent.Такого не бывает.Части Intent, которые используются для сопоставления, являются теми же, что определены 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

10 голосов
/ 07 марта 2013

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

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

pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...