Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

AlarmManager/Сигнализация

2-й курс/Закрытая зона

Обновлено: 18 мая 2023, 9 мая 2024

Одноразовая сигнализация
Установка повторяющейся сигнализации
Точная сигнализация (Android 12, API 31)
Шлём уведомления

Теория

AlarmManager API используется для отправки пользователю разовых или повторяющихся сообщений в заданное время средствами системы. Таким образом вы сможете создавать различные планировщики, будильники, реализовать выполнение регулярных сетевых запросов, запуска трудоёмких или дорогих операций, запланированных на определённое время и другие приложения, которые должны срабатывать по расписанию.

Важно помнить, что механизм сигнализации не зависит от конкретного приложения. Вы делегируете свои желания системе и она сама сделает за вас работу. Ваши прописанные намерения сработают в определённое время или с заданным интервалом. Так как сигнализация устанавливается за пределами вашего приложения, она может быть использована для вызова событий, принадлежащих приложению, или для запуска самого приложения, даже если оно закрыто. Сигнализация может стать мощным инструментом в сочетании с приёмниками широковещательных намерений.

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

Для планирования операций, которые работают только на протяжении жизненного цикла вашего приложения, вместо механизма сигнализации лучше использовать класс Handler в сочетании с таймерами и потоками. Это позволит Android лучше контролировать системные ресурсы.

Сигнализация в Android остаётся активной даже тогда, когда устройство находится в режиме ожидания и при необходимости может его «пробудить», однако она отменяется каждый раз, когда устройство перезагружается.

Менеджер сигнализаций AlarmManager

Доступ к службе Alarm Service осуществляется при помощи объекта AlarmManager следующим образом:


val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

Сигнализацию можно разделить на два типа: повторяющиеся и одноразовые. При этом оба типа сигнализаций могут использовать точное и приблизительное время срабатывания. Здесь надо понимать разницу между ними и использовать правильный вариант. Допустим, вы хотите ежедневно узнавать цену на корм котику. В этом случае точное время не обязательно использовать, разница в одну-две минуты не критичны. А вот кормить кота в одно время может быть важным - иначе кот обидится. Тем более, что вдобавок вчера вы забыли его погладить.

При этом точное время сигнализации использует больше ресурсов батареи и требует наличия специального разрешения в манифесте.

Методы

  • cancel() - удаляет все сигнализации
  • setTime() - устанавливает системное время
  • setTimeZone() - устанавливает временную зону
  • set() - задаёт одноразовую сигнализацию
  • setExact() - в API 19 (Kitkat) метод set() заменили на новый метод с теми же параметрами
  • setRepeating() - задаёт повторяющиеся сигнализации с фиксированным временным интервалом
  • setInexactRepeating() - устанавливает повторяющиеся сигнализации без строгого требования к точности периода повторения. Этот метод является предпочтительнее предыдущего для экономии ресурсов системы

Параметры

Методы set(), setRepeating(), setInexactRepeating() используют следующие параметры:

  • typeOne - тип используемого времени (системное или всемирное время UTC), который определяется константами
    • ELAPSED_REALTIME - запускает ожидающее намерение, основываясь на времени, которое прошло с момента загрузки устройства, но не с момента выхода из режима ожидания. Это время включает любой временной промежуток, в котором устройство находилось в данном режиме. Обратите внимание, что прошедшее время вычисляется на основании того, когда устройство было загружено. Используется системное время
    • ELAPSED_REALTIME_WAKEUP - по прошествии указанного промежутка времени с момента загрузки выводит устройство из спящего режима и запускает ожидающее намерение. Используется системное время
    • RTC - запускает ожидающее намерение в указанное время, но не выводит устройство из режима ожидания. Используется всемирное время UTC
    • RTC_WAKEUP - выводит устройство из режима ожидания для запуска ожидающего намерения в указанное время. Используется всемирное время UTC
  • triggerTime - время работы оповещения
  • interval - интервал между отправкой повторных сигнализаций в миллисекундах. Также можно использовать константы
    • INTERVAL_DAY
    • INTERVAL_HALF_DAY
    • INTERVAL_HOUR
    • INTERVAL_HALF_HOUR
    • INTERVAL_FIFTEEN_MINUTES
  • operation - объект PendingIntent, определяющий действие, выполняемое при запуске сигнализации. Можно получить через специальные методы:
    • PendingIntent.getActivities(Context, int, Intent[], int)
    • PendingIntent.getActivity(Context, int, Intent, int)
    • PendingIntent.getService(Context, int, Intent, int)
    • PendingIntent.getBroadcast(Context, int, Intent, int)

Служба

Для установки сигнализации вам придётся создать собственную службу, наследуясь от базового класса Service (либо через приёмник BroadcastReceiver):


public class AlarmService extends Service {...}

Запуск и управление службой происходит при помощи объекта Intent.

Установка времени для сигнализаций

Для задания времени работы оповещения необходимо установить его время запуска и добавить к нему длительность работы этого оповещения. Например, нам необходимо, чтобы оповещение отрабатывало 5 секунд после запуска:


long time = SystemClock.elapsedRealTime() + 5000;

Также можно использовать объект Calendar.

Вы вошли на сайт, как гость.
Необходимо зарегистрироваться, чтобы прочитать статью

Реклама