Подтвердить что ты не робот

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 на onReceive вызывается then onEnabled, затем onReceive, затем onUpdate.

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

4b9b3361

Ответ 1

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

Ответ 2

Из SDK:

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

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

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

И когда SDK 1.6 +:

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

Ответ 3

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

Ответ 4

Я просто знал, что минимальный интервал 30 минут ограничен менеджером appWidget. Но как обновляется виджет часов?