Какие идентификаторы находятся в appWidgetIds [] onUpdate?

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

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

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

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

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


person Tobias    schedule 16.11.2011    source источник
comment
Я помню, что видел что-то подобное... IIRC, я просто обернул его в try/catch или что-то в этом роде, если appWidgetId был недействительным. У кого-нибудь есть реальное решение?   -  person Izkata    schedule 16.11.2011
comment
Просто получение действительного appwidgetid не беспокоит меня. Кроме того, меня беспокоит, создал ли я какие-либо невидимые виджеты. Потому что, если я сейчас создам новый виджет, его идентификатор появится, а если я его удалю, его идентификатор исчезнет. Но что это за другие идентификаторы, где нет (видимого) виджета?   -  person Tobias    schedule 16.11.2011
comment
Ах, тогда, возможно, я видел что-то другое. Мой иногда (но не всегда) оставался после удаления.   -  person Izkata    schedule 16.11.2011


Ответы (3)


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

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

В документации для разработчиков есть этот пример кода для подтверждения создания виджет:

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);

person Izkata    schedule 28.01.2019

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

person Pratik Bhat    schedule 16.11.2011
comment
Это был не совсем ответ на мой вопрос. Я знал, что могу использовать несколько виджетов. Но в любом случае я решил эту проблему: я удалил, а затем переустановил свое приложение, и после этого все виджеты-призраки исчезли. Таким образом, все идентификаторы в appWidgetIds являются идентификаторами моего приложения. - person Tobias; 17.11.2011
comment
@LordFlash, вы должны опубликовать это как ответ. Я столкнулся с той же проблемой, и ваше предложение было решением. - person guness; 07.03.2013

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

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

person Tobias    schedule 14.03.2013