Какие идентификаторы есть в appWidgetIds [] в onUpdate? - PullRequest
3 голосов
/ 16 ноября 2011

У идентификаторов в массиве appWidgetIds метода

public void onUpdate (Контекстный контекст, AppWidgetManager appWidgetManager, int [] appWidgetIds) {

все принадлежит моему приложению?

Если это так, то где-то в нирване моего андроида есть некоторые appwidget, потому что если я удаляю все appwidget, в массиве все еще остаются некоторые идентификаторы, которые не отображаются на моем домашнем экране. : - (

Есть ли способ удалить ВСЕ виджеты?

Ответы [ 3 ]

2 голосов
/ 28 января 2019

Weeelp, я вернулся к разработке Android 8 лет спустя (с удивлением обнаружил, что уже прокомментировал этот вопрос), и теперь у меня есть реальный ответ. Похоже, он стал более известным спустя годы после того, как этот вопрос был впервые опубликован, но в основном: в Android есть ошибка, которая остается не исправленной почти навсегда.

Все эти фантомные идентификаторы - это appWidgetIds виджетов, которые вы начали создавать в какой-то момент, , но были неправильно отменены при выполнении действия по настройке виджета .

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

Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();

Внимательно прочитайте подсказку под ней:

Совет. При первом открытии действия «Конфигурация» задайте для параметра «Результат» значение RESULT_CANCELED вместе с EXTRA_APPWIDGET_ID, как показано в шаге 5 выше. Таким образом, если пользователь отменяет действие до достижения конца, узел виджета приложения получает уведомление о том, что конфигурация была отменена и виджет приложения не будет добавлен.

Хотя Android принимает setResult(RESULT_CANCEL); (и многие учебники используют его, и я полагаю, что даже официальная документация когда-то имела такой пример кода), это неправильно. Не передавая новый идентификатор, он остается в системе как один из тех таинственных идентификаторов-фантомов.

Правильный способ отменить создание виджета - setResult(RESULT_CANCEL, resultValue);

2 голосов
/ 16 ноября 2011

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

1 голос
/ 15 марта 2013

Я получил решение: я удалил, затем переустановил свое приложение, и после этого все призрачные виджеты исчезли.

В заключение: все идентификаторы в appWidgetIds - это идентификаторы моего приложения .

...