- Alarm Service — сигнализация
- Теория
- Менеджер оповещений AlarmManager
- Методы
- Параметры
- Служба
- Установка времени для сигнализаций
- Программируем будильник или использование AlarmManager в Android
- Несколько слов о классе AlarmManager
- Программируем приложение-будильник для Android
- Using AlarmManager like a pro
- All alarms get cancelled when the phone reboots
- All alarms get cancelled when the system time is changed
- All past Alarms are fired immediately
Alarm Service — сигнализация
2-й курс/Закрытая зона
Теория
Служба Alarm Service используется для отправки пользователю разовых или повторяющихся сообщений в заданное время. Таким образом вы сможете создавать различные планировщики, будильники, реализовать выполнение регулярных сетевых запросов, запуска трудоёмких или дорогих операций, запланированных на определенное время и другие приложения, которые должны срабатывать по расписанию.
Важно помнить, что механизм сигнализации не зависит от конкретного приложения, это значит, что прописанные намерения сработают в определённое время или с заданным интервалом. Так как сигнализация устанавливается за пределами вашего приложения, она может быть использована для вызова событий, принадлежащих приложению, или для запуска самого приложения, даже если оно закрыто. Сигнализация может стать мощным инструментом в сочетании с приёмниками широковещательных намерений.
Таким образом, сигнализация чрезвычайно полезна, когда речь идет о снижении требований к ресурсам, особенно в случае с приложениями, которые работают в фоновом режиме, позволяя останавливать сервисы и отключать таймеры, сохраняя возможность выполнять запланированные действия.
Сигнализация в Android остается активной даже тогда, когда устройство находится в режиме ожидания и при необходимости может его «пробудить», однако она отменяется каждый раз, когда устройство перезагружается.
Менеджер оповещений AlarmManager
Доступ к службе Alarm Service осуществляется при помощи объекта AlarmManager следующим образом:
Методы
- cancel() — удаляет все сигнализации
- setTime() — устанавливает системное время
- setTimeZone() — устанавливает временную зону
- set() — задаёт одноразовую сигнализацию
- setExact() — в API 19 (Kitkat) метод set() заменили на новый метод с теми же параметрами
- setRepeating() — задаёт повторяющиеся сигнализации с фиксированным временным интервалом
- setInexactRepeating() — устанавливает повторяющиеся сигнализации без строгого требования к точности периода повторения. Этот метод является предпочтительнее предыдущего для экономии ресурсов системы
Чтобы создать сигнализацию, которая сработает всего один раз, используйте метод set(), укажите тип сигнализации, время срабатывания и ожидающее намерение, которое должно запуститься. Если время срабатывания, которое вы указали для сигнализации, уже прошло, указанное намерение запустится немедленно.
Параметры
Методы 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):
Запуск и управление службой происходит при помощи объекта Intent.
Установка времени для сигнализаций
Для задания времени работы оповещения необходимо установить его время запуска и добавить к нему длительность работы этого оповещения. Например, нам необходимо, чтобы оповещение отрабатывало 5 секунд после запуска:
Также можно использовать объект Calendar. Например, мы хотим, чтобы продолжительность сигнала оповещения была 10 секунд, а период повторения оповещения был один час:
Вы вошли на сайт, как гость.
Необходимо зарегистрироваться, чтобы прочитать статью
Источник
Программируем будильник или использование AlarmManager в Android
При разработке приложения порой бывает необходимо выполнять какие-то действия в будущем. Например, вы хотите создать будильник или периодически отправлять данные на свой сайт в строго определенное время. Для решения подобных задач в Android используется классAlarmManager, который позволяет выполнять код в требуемый момент времени, даже если ваше приложение не запущено. То-есть AlarmManager — аналог corn в Linux или планировщика задач Windows. Вы говорите, что такой-то кусок кода должен выполниться тогда-то и AlarmManager обеспечивает запуск кода. В англоязычный литературе таймер, который выполняет код в требуемый момент времени обозначается терминомalarm. Давайте в рамках данной статьи называть этот таймербудильником, чтобы отделить это понятие от таймера.
Несколько слов о классе AlarmManager
Фактически класс AlarmManager обеспечивает доступ к сервису планировки задач Android. Для получения объекта этого класса нужно вызвать методContext.getSystemService(Context.ALARM_SERVICE).AlarmManagerрегистрирует в системе интент и когда наступает обозначенное время, AlarmManager запускает этот интент. Если момент вызова приложение закрыто, то оно будет вновь запущено. AlarmManager нужно использовать только в случае, если код должен быть выполнен даже при закрытом приложении, во всех других случаях рекомендуется использовать классHandler.
Класс AlarmManager довольно прост. В нашем распоряжении шесть методов:
- void cancel(PendingIntent operation) — отменяет установленный таймер для переданного в качестве параметра интента.
- void set (int type, long triggerAtMillis, PendingIntent operation) — устанавливает будильник, который сработает один раз.
- void setInexactRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) — установка будильника с неточным повторением.
- setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)— установка будильника с точным повторением.
- setTime(long millis) — установка системного времени.
- setTimeZone(String timeZone) — установка временной зоны, выбранной по-умолчанию.
ЗдесьPendingIntent— класс, который представляет интент и связанное с его выполнением действие. Передавая PendingIntent другому приложению Вы тем самым даете ему право запускать кусок кода из своей программы.
В качестве типа будильника (параметрtype) может быть передано одно из значений ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC и RTC_WAKEUP. ELAPSED_REALTIME и ELAPSED_REALTIME_WAKEUP — время задается с момента загрузки устройства, а RTC и RTC_WAKEUP — системное время в UTC. Для ELAPSED_REALTIME и RTC если устройство находится в спящем режиме в момент срабатывания будильника, то связанный с ним интент будет вызван позже, когда пользователь выведет устройство из спящего режима. Для ELAPSED_REALTIME_WAKEUP и RTC_WAKEUP если устройство находится в спящем режиме, оно немедленно пробуждается и вызывается интент.
Программируем приложение-будильник для Android
Давайте в качестве примера разработаем приложение — будильник. При запуске программы пользователю будет показано окно с тремя кнопками. С их помощью пользователь сможет: установить будильник, который срабатывает один раз; будильник, который будет срабатывать периодически; а также удалить ранее установленные будильники.
Создадим новый проект в макет шаблона добавим три кнопки
КнопкаbtStartустанавливает повторяющийся будильник, кнопкаbtCancel— отменяет его. КнопкаbtOneTime— создает не повторяющийся будильник. Прямо в шаблоне мы указали методы, которые будут вызываться при нажатии на кнопки: startRepeatingTimer, cancelRepeatingTimer и onetimeTimer соответственно. Код этих методов будут приведен в классе Activity.
Для работы сAlarmManagerнапишем отдельный класс. В качестве базового класса используем BroadcastReciever. Наш класс будет управлять зарегистрированным с помощью AlarmManager интентом. Мы переопределим методonReceive(), который будет вызываться после получения интента. Внутри метод onReceive() мы должны попытаться получить связанные с интентом параметры. В своей программе мы будем использовать один параметр ONE_TIME, который позволяет определить, относится ли интент к однократно срабатывающему будильнику или нет. После того, как значение ONE_TIME получено, пользователю показывается соответствующее сообщение.
Также в этом классе определим методы setAlarm(), cancelAlarm() и onetimeTimer(). Конечно эти методы можно было определить и в другом месте, мы включили их в данный класс из соображения простоты примера.
- Метод setAlarm() устанавливает повторяющийся будильник с помощью метода setRepeating(). Этому методу требуется четыре параметра: тип будильника, время запуска (устанавливаем текущий момент), интервал в миллисекундах, интент, который будет вызываться при срабатывании будильника.
- Метод cancelAlarm() отменяет зарегистрированный ранее будильник с помощью вызова метода cancel(), которому перезается в качестве параметра интент. При совпадении этого параметра с зарегистрированным ранее интентом, произойдет удаление будильника.
- Метод onetimeTimer() создает будильник, который срабатывает один раз. Делается с помощью метода set(), которому передается три параметра: тип будильника, время запуска, вызываемый интент.
Ниже приводится файл манифеста. Обратите внимание, для корректной работы программе необходимо дать разрешениеWAKE_LOCK, поскольку мы используем блокировку потока в методе onReceive(). Также тут мы регистрируем AlarmManagerBroadcastReceiver, как получатель широковещательных сообщений
Теперь давайте напишем класс, в котором реализуем обработчики кнопок. Здесь мы создадим экземпляр описанного выше класса AlarmManagerBroadcastReciever и будем вызывать методы setAlarm(), cancelAlarm() и setOnetime().
При надатии на кнопки будут установлен будильник. Исходный код проекта можно скачатьздесь.
Источник
Using AlarmManager like a pro
Feb 2, 2019 · 3 min read
All of us must have used AlarmManager in some way in our projects but there a lot of times when our alarms get cancelled or there are bugs in the implementation. Today we will learn what all measures we should take to make sure that all our alarms are set correctly. We will also understand what all scenarios we should consider whenever we are using the AlarmManager.
Firstly let’s get the basics righ t . There are two types of alarms that you can set. You can either set a one time alarm or a repeating alarm. Let’s quickly have a look at both of these alarms.
For non repeating alarms we just have to specify at what time we need the alarm. The following alarm will fire after 1 min.
For repeating alarms, we have to first set at what time we need the alarm and then the duration after which the alarm should repeat itself. The following alarm will fire everyday. AlarmManager.INTERVAL_DAY is nothing but the time in milliseconds for a day, instead you can also specify any time of your choice in milliseconds.
So it is very easy to set these alarms but now let’s discuss the cases when these alarms get cancelled or behave in an unusual manner.
All alarms get cancelled when the phone reboots
By default all alarms get cancelled when a device shuts down. To tackle this we need to set the alarms again when the user restarts their device. Let’s have a look how this is done.
The above permission needs to be added in the manifest so that the app can receive the ACTION_BOOT_COMPLETED broadcast after the system finishes booting.
Don’t forget to add the receiver in the manifest with the action BOOT_COMPLETED. If you are wondering what android:enabled=”false” is it simply means that the receiver will not be called unless it is explicitly enabled in the app.
The above code enables the receiver. You should preferably add it in the first activity of your app.
The BroadcastReceiver above gets called whenever the user reboots their device. Here we will set the alarm again but the important thing is we can’t use the values passed through the intent to set the alarm. This is because these values will be null when the system reboots. We need to pass values from a permanent source of memory like a SQL database.
All alarms get cancelled when the system time is changed
Another case when the Alarms get cancelled is when the user changes their system time or date from the settings. Let’s see what we can do to tackle this situation.
Firstly we need to register a receiver in the manifest with the action TIME_SET.
The following BroadcastReceiver will get called every time the user changes the system time. You just have to set the alarms again in the onReceive.
All past Alarms are fired immediately
When we are setting our alarms it is very important to check that the time that we are setting the alarm is not of the past because these alarms will get fired as soon as they are set. A simple check such as the following will ensure that no past alarms are fired.
These were some of the points that you should keep in mind if you are using the AlarmManager to set alarms for may be showing periodic notifications once a day.
Here is the link of the sample project that I made for this story. Feel free to check it out.
Thanks for reading! If you enjoyed this story, please click the 👏 button and share to help others! Feel free to leave a comment 💬 below. Have feedback? Let’s connect on Twitter .
Источник