Android-виджет не обновляется - PullRequest
35 голосов
/ 16 января 2010

Я пытаюсь реализовать простой виджет для отображения на главном экране. Проблема, с которой я сталкиваюсь, заключается в том, что 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 больше никогда не вызывается. Я также проверяю настройки провайдера, когда вызывается onUpdate, и все, что указано в XML выше (например, период обновления), верно.

Ответы [ 3 ]

68 голосов
/ 16 января 2010

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

19 голосов
/ 02 августа 2011

Из SDK:

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

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

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

А когда SDK 1.6 +:

Примечание: Обновления запрашиваются сupdatePeriodMillis не будет доставляться чаще, чем раз в 30 минут.

1 голос
/ 19 мая 2017

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

...