AlarmManager) позволяют выполнять операции, привязанные ко времени, вне жизненного цикла приложения.
Например, вы можете использовать будильник, чтобы инициировать длительную операцию, например запуск службы один раз в день для загрузки прогноза погоды.
Будильники имеют следующие характеристики:
Они позволяют запускать намерения в заданное время и/или с определенными интервалами.
Их можно использовать вместе с широковещательными приемниками, чтобы планировать задачи или запросы на выполнение работы для других операций.
Они работают за пределами приложения, поэтому вы можете использовать их для запуска событий или действий, даже когда приложение не запущено и устройство находится в спящем режиме.
Они помогают минимизировать требования приложения к ресурсам. Вы можете планировать операции, не полагаясь на таймеры или непрерывно работающие сервисы.
Как установить неточное время будильника
Когда приложение устанавливает неточное время будильника, система запускает его в определенный момент в будущем. Неточные будильники обеспечивают определенные гарантии в отношении времени срабатывания, соблюдая при этом ограничения по экономии заряда батареи, такие как спящий режим.
Разработчики могут использовать следующие гарантии API, чтобы настроить время доставки неточных будильников.
Включить будильник в определенное время
Если ваше приложение вызывает метод set(), setInexactRepeating() или setAndAllowWhileIdle(), будильник никогда не сработает до указанного времени.
В Android 12 (уровень API 31) и более поздних версиях система вызывает будильник в течение часа после указанного времени срабатывания, если не действуют ограничения на экономию заряда батареи, такие как режим энергосбережения или спящий режим.
Как настроить будильник на определенный период времени
Если приложение вызывает метод setWindow(), будильник никогда не сработает раньше указанного времени. Если не действуют ограничения по экономии заряда батареи, будильник сработает в указанный период времени, начиная с заданного времени срабатывания.
Если ваше приложение предназначено для Android 12 или более поздней версии, система может отложить вызов неточного будильника с временным окном как минимум на 10 минут. Поэтому значения параметра windowLengthMillis, которые меньше 600000, обычно округляются до 600000. Система может использовать меньшие окна, особенно если будильник должен сработать в ближайшем будущем.
Повторяющийся будильник, который срабатывает через примерно равные промежутки времени.
Если приложение вызывает setInexactRepeating(), система активирует несколько будильников:
- Первый будильник сработает в указанный период времени, начиная с заданного времени запуска.
- Последующие будильники обычно срабатывают после того, как указанный период времени истечет. Время между двумя последовательными вызовами будильника может варьироваться.
Как установить будильник на точное время
Система вызывает операцию в точное время в определенный момент в будущем.
В большинстве приложений для планирования задач и событий можно использовать неточные будильники, которые подходят для многих распространенных сценариев. Если основные функции приложения зависят от запланированной операции в точное время, например в будильнике или календаре, то можно использовать операцию в точное время.
Случаи, когда выполнение операций в точное время может не требоваться
Ниже перечислены распространенные рабочие процессы, для которых не требуется операция в точное время:
- планирование операций по времени в течение жизненного цикла приложения;
- Класс
Handlerвключает несколько методов для работы с таймерами, например для выполнения определенных действий каждые n секунд, пока приложение активно:postAtTime()иpostDelayed(). Обратите внимание, что эти API используют время работы системы, а не реальное время. - Запланированная фоновая работа, например обновление приложения и загрузка журналов.
WorkManagerпозволяет планировать периодические задачи, зависящие от времени. Вы можете указать интервал повторения иflexInterval(не менее 15 минут), чтобы определить точное время выполнения задачи.- Указанное пользователем действие, которое должно произойти по истечении определенного времени (даже если система находится в режиме ожидания).
- Используйте неточные будильники. В частности, вызовите метод
setAndAllowWhileIdle(). - Действие, которое должно произойти после определенного времени, заданного пользователем.
- Используйте неточные будильники. В частности, вызовите метод
set(). - Действие, заданное пользователем, которое может произойти в течение определенного периода времени.
- Используйте неточные будильники. В частности, вызовите метод
setWindow(). Если ваше приложение предназначено для Android 12 или более поздней версии, минимальная допустимая продолжительность окна составляет 10 минут.
Как установить будильник на точное время
В приложении можно настроить выполнение операций в точное время одним из следующих способов: Методы в списке упорядочены так, что те, которые находятся ближе к концу, предназначены для более срочных задач, но требуют больше системных ресурсов.
setExact()Вызов будильника в почти точное время в будущем, если не действуют другие меры по экономии заряда батареи.
Используйте этот метод, чтобы задавать операции в точное время, если только работа приложения не является критически важной для пользователя.
setExactAndAllowWhileIdle()Включать будильник в почти точное время в будущем, даже если действуют меры по экономии заряда батареи.
setAlarmClock()Включать будильник в определенное время в будущем. Поскольку эти будильники хорошо видны пользователям, система никогда не корректирует время их срабатывания. Система определяет такие будильники как наиболее важные и при необходимости выходит из режима экономии энергии, чтобы они сработали.
Использование системных ресурсов
Когда система запускает операции в точное время, заданные вашим приложением, устройство потребляет много ресурсов, например заряд батареи, особенно если оно находится в режиме энергосбережения. Кроме того, система не может легко объединять эти запросы в пакеты, чтобы более эффективно использовать ресурсы.
Рекомендуем по возможности создавать неточное напоминание. Если вам нужно выполнить более длительную задачу, запланируйте ее с помощью WorkManager или JobScheduler из BroadcastReceiver будильника. Чтобы выполнить задачу, когда устройство находится в спящем режиме, создайте неточный будильник с помощью setAndAllowWhileIdle() и запустите задание из будильника.
Задекларируйте подходящее разрешение на выполнение операций в точное время
Если ваше приложение предназначено для Android 12 или более поздней версии, вам необходимо получить специальный доступ к приложению "Будильники и напоминания". Для этого объявите разрешение SCHEDULE_EXACT_ALARM в файле манифеста приложения, как показано в следующем фрагменте кода:
<manifest ...> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
Если ваше приложение предназначено для Android 13 (уровень API 33) или более поздней версии, вы можете объявить разрешение SCHEDULE_EXACT_ALARM или USE_EXACT_ALARM.
<manifest ...> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
Хотя разрешения SCHEDULE_EXACT_ALARM и USE_EXACT_ALARM предоставляют одинаковые возможности, они выдаются по-разному и поддерживают разные сценарии использования. Приложение должно использовать операции в точное время и объявлять разрешение SCHEDULE_EXACT_ALARM или USE_EXACT_ALARM, только если для работы пользовательской функции в приложении требуется выполнение операций в точное время.
USE_EXACT_ALARM
- Предоставлено автоматически
- Пользователь не может отозвать разрешение.
- Регулируется новыми правилами Google Play.
- Ограниченные варианты использования
SCHEDULE_EXACT_ALARM
- Предоставлено пользователем
- Более широкий набор вариантов использования
- Приложения должны подтверждать, что разрешение не было отозвано
Разрешение SCHEDULE_EXACT_ALARM не предоставляется по умолчанию при установке приложений, предназначенных для Android 13 (уровня API 33) и более поздних версий. Если пользователь перенесет данные приложения на устройство с Android 14, выполнив резервное копирование и восстановление, разрешение SCHEDULE_EXACT_ALARM на новом устройстве будет отклонено. Однако если у существующего приложения уже есть это разрешение, оно будет предоставлено по умолчанию при обновлении устройства до Android 14.
Примечание. Если операция в точное время задана с помощью объекта OnAlarmListener, например через API setExact, разрешение SCHEDULE_EXACT_ALARM не требуется.
Использование разрешения SCHEDULE_EXACT_ALARM
В отличие от USE_EXACT_ALARM, разрешение SCHEDULE_EXACT_ALARM должен предоставить пользователь. Разрешение SCHEDULE_EXACT_ALARM может быть отозвано как пользователем, так и системой.
Чтобы проверить, предоставлено ли разрешение вашему приложению, вызовите canScheduleExactAlarms() перед тем, как задать операцию в точное время. Если разрешение SCHEDULE_EXACT_ALARM будет отозвано, приложение остановится, а все запланированные операции в точное время будут отменены. Это также означает, что значение, возвращаемое методом canScheduleExactAlarms(), остается действительным в течение всего жизненного цикла приложения.
Когда приложению предоставляется разрешение SCHEDULE_EXACT_ALARMS, система отправляет ему широковещательное сообщение ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED. В приложении должен быть реализован широковещательный приемник, который выполняет следующие действия:
- Подтверждает, что у приложения по-прежнему есть специальный доступ. Для этого вызовите метод
canScheduleExactAlarms(). Это защитит ваше приложение в случае, если пользователь предоставит разрешение, а затем сразу же его отзовет. - Переносит все операции в точное время, которые нужны приложению, с учетом его текущего состояния.
Логика должна быть аналогична той, которая используется в приложении при получении широковещательного сообщения
ACTION_BOOT_COMPLETED.
Запрашивать у пользователей разрешение на SCHEDULE_EXACT_ALARM
При необходимости вы можете перенаправить пользователей на экран Будильники и напоминания в системных настройках, как показано на рисунке 1. Для этого выполните следующие действия:
- В интерфейсе приложения объясните пользователю, почему приложению нужно планировать операции в точное время.
- Вызовите намерение, которое включает действие
ACTION_REQUEST_SCHEDULE_EXACT_ALARM.
Как установить повторяющийся будильник
Повторяющиеся оповещения позволяют системе уведомлять приложение по повторяющемуся расписанию.
Плохо спроектированный будильник может привести к разрядке батареи и значительно нагрузить серверы. Поэтому в Android 4.4 (уровень API 19) и более поздних версиях все повторяющиеся запланированные операции являются неточными.
Повторяющийся будильник имеет следующие характеристики:
Тип будильника. Подробнее о том, как выбрать тип будильника…
время активации; Если указанное время уже прошло, будильник сработает немедленно.
Интервал будильника. Например, раз в день, каждый час или каждые 5 минут.
Отложенный интент, который запускается при срабатывании будильника. Если вы установите второй будильник, который использует тот же отложенный интент, он заменит исходный будильник.
Чтобы отменить PendingIntent(), передайте FLAG_NO_CREATE в PendingIntent.getService(), чтобы получить экземпляр намерения (если он существует), а затем передайте это намерение в AlarmManager.cancel().
Kotlin
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager val pendingIntent = PendingIntent.getService(context, requestId, intent, PendingIntent.FLAG_NO_CREATE) if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent) }
Java
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getService(context, requestId, intent, PendingIntent.FLAG_NO_CREATE); if (pendingIntent != null && alarmManager != null) { alarmManager.cancel(pendingIntent); }
Выберите тип будильника
Первое, что нужно учитывать при использовании повторяющегося будильника, – это его тип.
Существует два основных типа часов для будильников: "истекшее реальное время" и "часы реального времени" (RTC). В первом случае отсчет ведется с момента загрузки системы, а во втором – по всемирному координированному времени (UTC). Это означает, что прошедшее реальное время подходит для установки будильника на основе течения времени (например, будильника, который срабатывает каждые 30 секунд), поскольку на него не влияет часовой пояс или локаль. Тип часов реального времени лучше подходит для будильников, которые зависят от текущего региона.
У обоих типов есть версия для пробуждения, которая активирует ЦП устройства, если экран выключен. Это гарантирует, что запланированная операция сработает в запланированное время. Это полезно, если ваше приложение зависит от времени. Например, если у него есть ограниченное время для выполнения определенной операции. Если вы не используете версию типа будильника с пробуждением, то все повторяющиеся будильники сработают, когда устройство в следующий раз выйдет из спящего режима.
Если вам просто нужно, чтобы будильник срабатывал с определенным интервалом (например, каждые полчаса), используйте один из типов прошедшего реального времени. В целом это лучший выбор.
Если вам нужно, чтобы будильник срабатывал в определенное время суток, выберите один из типов часов реального времени. Однако у этого подхода есть и недостатки. Приложение может некорректно работать в других регионах, а если пользователь изменит настройки времени на устройстве, это может привести к непредвиденному поведению приложения. Использование типа будильника с часами реального времени также плохо масштабируется, как обсуждалось выше. По возможности рекомендуем использовать будильник, который срабатывает через определенный промежуток времени.
Вот список типов:
ELAPSED_REALTIME. Активирует отложенный интент в зависимости от времени, прошедшего с момента загрузки устройства, но не выводит устройство из спящего режима. В прошедшее время включается время, в течение которого устройство находилось в спящем режиме.ELAPSED_REALTIME_WAKEUP– выводит устройство из спящего режима и запускает отложенный интент по истечении заданного времени с момента загрузки устройства.RTC– активирует отложенный интент в указанное время, но не выводит устройство из спящего режима.RTC_WAKEUP. Выводит устройство из спящего режима, чтобы запустить отложенный интент в указанное время.
Примеры будильников, использующих время, прошедшее с момента загрузки устройства
Вот несколько примеров использования ELAPSED_REALTIME_WAKEUP:
Вывести устройство из спящего режима, чтобы включить будильник через 30 минут и затем каждые 30 минут:
Kotlin
// Hopefully your alarm will have a lower frequency than this! alarmMgr?.setInexactRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent )
Java
// Hopefully your alarm will have a lower frequency than this! alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);
Вывести устройство из спящего режима, чтобы через минуту сработал однократный (неповторяющийся) будильник:
Kotlin
private var alarmMgr: AlarmManager? = null private lateinit var alarmIntent: PendingIntent ... alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmIntent = Intent(context, AlarmReceiver::class.java).let { intent -> PendingIntent.getBroadcast(context, 0, intent, 0) } alarmMgr?.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent )
Java
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent);
Примеры будильников в реальном времени
Вот несколько примеров использования RTC_WAKEUP.
Вывести устройство из спящего режима, чтобы запустить будильник примерно в 14:00, и повторять это действие раз в день в то же время:
Kotlin
// Set the alarm to start at approximately 2:00 p.m. val calendar: Calendar = Calendar.getInstance().apply { timeInMillis = System.currentTimeMillis() set(Calendar.HOUR_OF_DAY, 14) } // With setInexactRepeating(), you have to use one of the AlarmManager interval // constants--in this case, AlarmManager.INTERVAL_DAY. alarmMgr?.setInexactRepeating( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, alarmIntent )
Java
// Set the alarm to start at approximately 2:00 p.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 14); // With setInexactRepeating(), you have to use one of the AlarmManager interval // constants--in this case, AlarmManager.INTERVAL_DAY. alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
Вывести устройство из спящего режима, чтобы запустить будильник ровно в 8:30 и затем каждые 20 минут:
Kotlin
private var alarmMgr: AlarmManager? = null private lateinit var alarmIntent: PendingIntent ... alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmIntent = Intent(context, AlarmReceiver::class.java).let { intent -> PendingIntent.getBroadcast(context, 0, intent, 0) } // Set the alarm to start at 8:30 a.m. val calendar: Calendar = Calendar.getInstance().apply { timeInMillis = System.currentTimeMillis() set(Calendar.HOUR_OF_DAY, 8) set(Calendar.MINUTE, 30) } // setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes. alarmMgr?.setRepeating( AlarmManager.RTC_WAKEUP, calendar.timeInMillis, 1000 * 60 * 20, alarmIntent )
Java
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // Set the alarm to start at 8:30 a.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 30); // setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes. alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 20, alarmIntent);
Выберите, насколько точным должен быть будильник
Как уже говорилось, выбор типа оповещения – это первый шаг к его созданию. Ещё одно различие заключается в том, насколько точным должен быть ваш будильник. Для большинства приложений подходит setInexactRepeating(). При использовании этого метода Android синхронизирует несколько неточных повторяющихся будильников и запускает их одновременно. Это снижает нагрузку на батарею.
По возможности избегайте использования операций в точное время. Однако для редких приложений со строгими требованиями ко времени можно установить операцию в точное время, вызвав setRepeating().
В отличие от setRepeating(), в setInexactRepeating() нельзя задать собственный интервал.
Необходимо использовать одну из констант интервала, например INTERVAL_FIFTEEN_MINUTES, INTERVAL_DAY и т. д. Полный список приведен в AlarmManager.
Как отменить будильник
В зависимости от приложения вы можете добавить возможность отменить будильник.
Чтобы отменить будильник, вызовите cancel() в Alarm Manager, передав PendingIntent, который больше не должен срабатывать. Пример:
Kotlin
// If the alarm has been set, cancel it. alarmMgr?.cancel(alarmIntent)
Java
// If the alarm has been set, cancel it. if (alarmMgr!= null) { alarmMgr.cancel(alarmIntent); }
Запускать будильник при перезапуске устройства
По умолчанию все будильники отменяются при выключении устройства.
Чтобы этого не происходило, вы можете настроить приложение так, чтобы оно автоматически перезапускало повторяющийся будильник, если пользователь перезагружает устройство. Это гарантирует, что AlarmManager продолжит выполнять свою задачу без необходимости вручную перезапускать будильник.
Вот более подробная инструкция:
Установите разрешение
RECEIVE_BOOT_COMPLETEDв манифесте приложения. Это позволяет приложению получать сообщениеACTION_BOOT_COMPLETED, которое транслируется после завершения загрузки системы (работает, только если пользователь уже запускал приложение хотя бы один раз).<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>Чтобы получать оповещения, реализуйте
BroadcastReceiver:Kotlin
class SampleBootReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == "android.intent.action.BOOT_COMPLETED") { // Set the alarm here. } } }
Java
public class SampleBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { // Set the alarm here. } } }
Добавьте получатель в файл манифеста приложения с фильтром интентов, который фильтрует действие
ACTION_BOOT_COMPLETED:<receiver android:name=".SampleBootReceiver" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
Обратите внимание, что в манифесте для получателя загрузки задано значение
android:enabled="false". Это означает, что получатель не будет вызываться, пока приложение не включит его явным образом. Это предотвратит ненужные вызовы приемника. Вы можете включить приемник (например, если пользователь устанавливает будильник) следующим образом:Kotlin
val receiver = ComponentName(context, SampleBootReceiver::class.java) context.packageManager.setComponentEnabledSetting( receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP )
Java
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
После этого приемник будет включен, даже если пользователь перезагрузит устройство. Другими словами, программное включение приемника переопределяет настройку манифеста даже после перезагрузки. Ресивер будет включен, пока вы не отключите его в приложении. Вы можете отключить приемник (например, если пользователь отменил будильник), как показано ниже.
Kotlin
val receiver = ComponentName(context, SampleBootReceiver::class.java) context.packageManager.setComponentEnabledSetting( receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP )
Java
ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); PackageManager pm = context.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
Вызывать оповещения, когда устройство находится в спящем режиме.
Устройства с Android 6.0 (уровень API 23) поддерживают спящий режим, который позволяет продлить время работы от батареи. Будильники не срабатывают, когда устройство находится в спящем режиме. Все запланированные будильники откладываются до выхода устройства из спящего режима. Если вам нужно, чтобы работа выполнялась, даже когда устройство не используется, вы можете:
Установить будильник на точное время.
Используйте WorkManager API, который предназначен для выполнения фоновых задач. Вы можете указать, что система должна ускорить выполнение вашей работы, чтобы она была завершена как можно скорее. Подробнее о том, как планировать задачи с помощью WorkManager…
Рекомендации
Каждое решение, которое вы принимаете при разработке повторяющегося будильника, может иметь последствия для того, как ваше приложение использует (или злоупотребляет) системными ресурсами. Например, представьте популярное приложение, которое синхронизируется с сервером. Если синхронизация выполняется по времени и все экземпляры приложения синхронизируются в 23:00, нагрузка на сервер может привести к высокой задержке или даже отказу в обслуживании. Следуйте этим рекомендациям по использованию будильников:
Добавьте случайность (джиттер) к любым сетевым запросам, которые запускаются в результате повторяющегося будильника:
Выполнять локальные задачи при срабатывании будильника. "Локальная работа" – это все, что не требует обращения к серверу или получения данных с него.
В то же время запланируйте срабатывание оповещения, содержащего сетевые запросы, на случайный период времени.
Установите минимальную частоту оповещений.
Не выводите устройство из спящего режима без необходимости (это поведение определяется типом будильника, как описано в разделе Выбор типа будильника).
Не делайте время срабатывания будильника более точным, чем это необходимо.
Используйте
setInexactRepeating()вместоsetRepeating(). При использованииsetInexactRepeating()Android синхронизирует повторяющиеся будильники из нескольких приложений и запускает их одновременно. Это позволяет сократить общее количество пробуждений устройства и снизить расход заряда батареи. Начиная с Android 4.4 (уровень API 19) все повторяющиеся запланированные операции являются неточными. Обратите внимание, что хотяsetInexactRepeating()– это улучшение по сравнению сsetRepeating(), сервер все равно может быть перегружен, если все экземпляры приложения обратятся к нему примерно в одно и то же время. Поэтому для сетевых запросов добавьте в будильники некоторую случайность, как обсуждалось ранее.По возможности не устанавливайте будильник на определенное время.
Повторяющиеся будильники, которые срабатывают в точное время, плохо масштабируются. По возможности используйте
ELAPSED_REALTIME. Различные типы будильников более подробно описаны в следующем разделе.