Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Из-за этого поведения важно знать, когда два намерения считается одинаковым с целью получения ожидающего ответа. Обычная ошибка, которую люди делают, - создать несколько PendingIntent объекты с намерениями, которые изменяются только в их "лишнем" содержимом, ожидая получить различный PendingIntent каждый раз. Это не бывает. Элементами намерения, которые используются для сопоставления, являются те же, что определены Intent.filterEquals. Если вы используете два намерения объекты, эквивалентные по 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

Ответ 3

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

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

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