Виджеты, настроенные с помощью android: configure будут получать onUpdate, даже если конфигурация не завершена

Вот как я настраиваю свой виджет APP:

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="240dp"
    android:minHeight="193dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/xyz_appwidget"
    android:configure="com.xyz.activity.Configuration"
    />

Следовательно, система будет активировать активность Configuration, как только виджет будет помещен на рабочий экран пользователем. К сожалению, без использования конфигурации этот виджет не следует помещать на экран.

Я добавил несколько отладочных результатов. Это происходит, когда пользователь выбирает виджет для своего рабочего стола. Примечание: Это когда активна настройка, а не виджет.

I/ActivityManager(  101): Start proc com.xyz for broadcast com.xyz/.widget.xyz.XyzWidgetProvider: pid=14371 uid=10050 gids={3003, 1015}
D/XyzWidgetProvider(14371): onReceive: android.appwidget.action.APPWIDGET_ENABLED
D/XyzWidgetProvider(14371): onEnabled
D/XyzWidgetProvider(14371): onReceive: android.appwidget.action.APPWIDGET_UPDATE

Таким образом, даже если виджет не настроен, оба события (ENABLED, UPDATE) будут запущены. Включено имеет смысл для меня, но UPDATE явно нет. Особенно, когда операция Configuration завершена успешно, никакого дополнительного события UPDATE не отправляется.

Я также прочитал, что, установив результат Configuration на Activity.RESULT_CANCELED, можно отменить процесс настройки. Но поскольку это явно работает асинхронно, я не знаю, как сделать процесс конфигурации блокировки? Кто-нибудь сталкивался с этим раньше?

Мое последнее замечание: я посмотрел в Виджет Android Gallery, который каким-то образом справляется с этим, так что не настроенный виджет галереи не будет добавлен. Но я подозреваю, что у HTC есть магия, так как журналы не очень полезны.

Ответ 1

Вот как вы справляетесь с этим: В своей конфигурации вы делаете это в своем onCreate(): setResult (Activity.RESULT_CANCELED);

После того, как активность конфигурации выполнена, например, все параметры установлены, и виджет должен быть показан, do setResult (Activity.RESULT_OK);

Итак, если пользователь не завершит операцию настройки, ваш виджет будет удален.

Однако в самом коде виджета (onUpdate) вам все равно нужно проверить, завершена ли конфигурация, потому что APPWIDGET_UPDATE определенно будет вызван до завершения конфигурации. Вы можете просто полностью пропустить обновление, если конфигурации там нет, ваш виджет в данный момент не будет видимым, и как только конфигурация будет завершена, ваш виджет либо будет удален системой, либо там будет его конфигурация.

Еще одна вещь. После успешного завершения вам необходимо инициировать обновление виджета из своей конфигурации, потому что система сама не сделает этого.

Ответ 3

"Однако в самом коде виджета (onUpdate) вам все равно нужно проверить, завершена ли конфигурация, потому что APPWIDGET_UPDATE обязательно будет вызван до завершения конфигурации."

Это не так, как должно быть. На сайте разработчика Android вы можете прочитать следующее...

"Метод onUpdate() не будет вызываться при создании виджета приложения (система не будет отправлять широковещательную передачу ACTION_APPWIDGET_UPDATE при запуске операции настройки). Задача конфигурации для запроса обновления AppWidgetManager при первом создании виджета приложения. Однако onUpdate() будет вызываться для последующих обновлений - он пропускается только в первый раз."