- Alarm Service — сигнализация
- Теория
- Менеджер оповещений AlarmManager
- Методы
- Параметры
- Служба
- Установка времени для сигнализаций
- Программируем будильник или использование AlarmManager в Android
- Несколько слов о классе AlarmManager
- Программируем приложение-будильник для Android
- Программирование для Android: уведомления с использованием AlarmManager
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().
При надатии на кнопки будут установлен будильник. Исходный код проекта можно скачатьздесь.
Источник
Программирование для Android: уведомления с использованием AlarmManager
Многим обладателям телефонов с Android, владеющим элементарными навыками программирования, хотелось или захочется написать свою «программку для телефона». Учитывая рост популярности этой ОС и факт существования Android Market, эта идея может еще и денег принести.
Особенность Android в том, что ребята из Google дают разработчику разрешение использовать все (вернее, почти все) возможности телефона. Можно перехватывать звонки, рассылать SMS, и многое другое. Одна из полезных вещей — уведомления, появляющиеся в соответствующей области вверху экрана. В этом посте я расскажу, как легко и просто их организовать.
Итак, ставим задачу: в определенное время, ежедневно, уведомлять пользователя о необходимости запустить приложение и что-то в нем сделать. Ну и совсем здорово, если по нажатию на уведомление запустится нужное приложение.
Нам понадобятся следующие классы:
AlarmManager — собственно, эта штука и умеет генерировать системные события по заданым параметрам
BroadcastReceiver — для обработки событий AlarmManager
NotificationManager — а эта штука умеет показывать уведомления
Первым делом, создадим класс — приемник:
public class TimeNotification extends BroadcastReceiver <
@Override
public void onReceive(Context context, Intent intent) <
// Этот метод будет вызываться по событию, сочиним его позже
>
>
Обязательно следует упомянуть об этом в манифесте (в разделе application):
Затем, идем в основной класс нашего приложения (допустим, MainActivity). Здесь нам необходимо обеспечить функционал по запуску и настройке AlarmManager.
Предположим, что задачу установки пользователем настроек мы уже решили, и у нас есть глобальная переменная stamp, в которой хранится время следующего показа уведомления.
private void restartNotify() <
am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, TimeNotification.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT );
// На случай, если мы ранее запускали активити, а потом поменяли время,
// откажемся от уведомления
am.cancel(pendingIntent);
// Устанавливаем разовое напоминание
am.set(AlarmManager.RTC_WAKEUP, stamp.getTime(), pendingIntent);
>
Почему разовое, спросите вы? У AlarmManager есть метод setRepeat, где можно задать интервал. Но мне кажется, проще перезапустить процесс при обработке события, на случай смены настроек и т.п. Хотя, это личное дело каждого, оба варианта будут работать.
Ну и, собственно, реализуем обработчик
public void onReceive(Context context, Intent intent) <
nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon, «Test», System.currentTimeMillis());
//Интент для активити, которую мы хотим запускать при нажатии на уведомление
Intent intentTL = new Intent(context, MainActivity.class);
notification.setLatestEventInfo(context, «Test», «Do something!»,
PendingIntent.getActivity(context, 0, intentTL,
PendingIntent.FLAG_CANCEL_CURRENT));
notification.flags = Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL;
nm.notify(1, notification);
// Установим следующее напоминание.
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_DAY, pendingIntent);
>
Вот и все. Надеюсь, в будущем написать и о других простых, но полезных возможностях для разработчика приложений под Android
Источник