Виджет Android Не Обновляется

Я пытаюсь реализовать простой виджет для отображения на главном экране. Проблема, с которой я сталкиваюсь, заключается в том, что onUpdate вызывается только один раз при установке виджета. Конфигурация ниже. Примечание: Я не оставлю период обновления в 20 секунд, поскольку я знаю, что это убьет батарею (просто тестирование).

конфигурация:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   android:minWidth="294dp"
   android:minHeight="72dp"
   android:updatePeriodMillis="20000"
   android:initialLayout="@layout/my_custom_app_widget">`
</appwidget-provider>`

Выдержка Из Манифеста:

<receiver android:name="MyCustomWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/my_custom_app_widget_info" />
</receiver>

Я наблюдаю следующее поведение при установке виджета: В моем Класс WidgetProvider on onReceive вызывается затем onEnabled, затем onReceive, затем onUpdate.

после этого виджет отображается и onUpdate никогда не вызывается снова. Я также проверяю настройки provder, когда вызывается onUpdate, и все, что установлено в XML выше (например, период обновления), правильно.

3 ответов


а вы android:updatePeriodMillis установите до 20 секунд, минимальное фактическое время 30 минут. Итак, если вы не ждали 30 минут, чтобы увидеть, есть ли обновление во время тестирования, вам нужно будет подождать немного дольше.


из SDK:

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

Если, однако, вам нужно обновлять чаще и / или вам не нужно обновлять, пока устройство спит, то вы можете вместо этого выполнить обновления на основе сигнала тревоги, который не будет будить устройство.

чтобы сделать это, установите будильник с намерением, что ваш AppWidgetProvider получает, используя AlarmManager. Установите тип сигнала тревоги наELAPSED_REALTIME или RTC, который будет доставлять сигнал тревоги только тогда, когда устройство бодрствует. Затем установите updatePeriodMillis до zero ("0").

и когда SDK 1.6+:

Примечание: обновления предложено с updatePeriodMillis не будет поставлено больше чем раз каждые 30 протокол.


Как duduli сказал... используйте alarmManager для отправки намерения в класс виджета, он получит его в своем методе onReceive, если вы не знаете, как это сделать, следуйте данное руководство. Это сработало для меня и других