Какое значение имеет более высокий приоритет, updatePeriodMillis или значение, связанное с аварийным сигналом?

Я понимаю, что параметр updatePeriodMillis определяет, как часто приложение widget обновляется в соответствии со спецификацией в widgetproviderinfo.xml в /res/xml.

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:configure="com.example.appwidget.ConfigurationActivity"
    android:initialLayout="@layout/layout_appwidget_large"
    android:minHeight="115dp"
    android:minWidth="250dp"
    android:updatePeriodMillis="1800000" ><!-- 30mins -->
</appwidget-provider>

Недостаток этого подхода состоит в том, что он обновляет widget, пробуждая телефон через заданный интервал, если телефон находится в спящем режиме. Таким образом, проблема заключается в потреблении батареи, что является серьезной проблемой, если интервал очень мал.

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

final Intent intent = new Intent(context, UpdateService.class);
final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0);
final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pending);
long interval = 1000*60;
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),interval, pending);

Итак, мой вопрос заключается в следующем: допустим, для обновления используется AlarmManager. Кроме того, если в файле widgetproviderinfo.xml для параметра updatePeriodMillis НЕ установлено значение 0, какое значение будет иметь приоритет? Значение, указанное как часть Alarm или updatePeriodMillis?


person user3575020    schedule 27.06.2014    source источник


Ответы (2)


Оба они вызовут onUpdate() вызов.

Если вы установите будильник на 20 минут, а ваш updatePeriodMillis на 30 минут.

Затем поместите widget на главный экран. Через 20 минут будильник вызовет onUpdate (на самом деле это может быть любая другая функция по вашему выбору). Затем через 10 минут (всего 30 минут с момента размещения виджета на экране) updatePeriodMillis вызовет onUpdate(). Затем через 10 минут (40 минут с момента размещения виджета на экране) будильник сработает еще раз onUpdate(). И, наконец, через 20 минут (60 минут с момента размещения виджета на экране) updatePeriodMillis вызовет еще один onUpdate().

person Tikiboy    schedule 17.07.2014

Из Android DOC: Примечание. Обновления, запрошенные с помощью updatePeriodMillis, не будут доставляться чаще, чем раз в 30 минут. [введите описание ссылки здесь][1] http://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo.html#updatePeriodMillis

так что в основном, если вы установите для updatePeriodMillis значение менее 1800000, Android не будет вызывать ваш метод onUpdate до тех пор, пока не пройдет 30 минут.

person moh.sukhni    schedule 27.06.2014
comment
Ваше объяснение непонятно. Вы хотите сказать, что если updatePeriodMillis присутствует и настроен на значение менее 1800000, Android будет считать 1800000 значением по умолчанию? (Это было бы правильно, если будильник НЕ настроен) Если updatePeriodMillis ‹ 1800000 и настроен будильник, то что будет иметь приоритет? Будет ли это зависеть от того, какое значение больше? Кроме того, и что более важно, каково ожидаемое поведение, когда для updatePeriodMillis установлено значение больше 1800000, а также настроено оповещение? Не могли бы вы рассмотреть все случаи? - person user3575020; 27.06.2014