Главная » Разработка для Android » Использование Сигнализации

0

Механизм  Сигнализации не зависит  от конкретного приложения, это значит, что Намерения срабатывают  в определенное  время или с заданным интервалом.

Сигнализация устанавливается за пределами вашего приложения, поэто- му она может быть использована для вызова  событий,  принадлежащих

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

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

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

ПРИМЕЧАНИЕ

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

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

Задания, выполняющиеся Сигнализацией, управляются с помощью объ- екта AlarmManager, системного  Сервиса, доступного  через вызов  метода getSystemService:

AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

Чтобы создать Сигнализацию, которая сработает всего один раз, исполь- зуйте метод set, укажите тип Сигнализации, время срабатывания и Ожидаю- щее намерение,  которое  должно  запуститься. Если  время  срабатывания, которое вы указали  для Сигнализации, уже прошло, Намерение запустится немедленно.

Разработчику доступны  четыре вида Сигнализации. В зависимости от вашего выбора значение, переданное  в метод set, будет означать  или кон- кретное время, или время задержки.

RTC_WAKEUP. Выводит  устройство  из режима  ожидания  для за- пуска Ожидающего намерения в указанное время.

RTC. Запускает Ожидающее намерение в указанное время, но не выво- дит устройство из режима ожидания.

ELAPSED_REALTIME. Запускает Ожидающее намерение, основыва- ясь на времени, которое прошло  с момента загрузки  устройства,  но не с момента выхода из режима ожидания. Это время включает любой временной  промежуток,  в котором устройство  находилось  в данном режиме. Обратите  внимание,  что прошедшее время вычисляется на основании  того, когда устройство было загружено.

ELAPSED_REALTIME_WAKEUP. По прошествии указанного  про- межутка времени с момента загрузки выводит устройство из спящего режима и запускает Ожидающее намерение.

Процесс создания Сигнализации показан в листинге 9.25.

Листинг 9.25. Создание Сигнализации

int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;

long timeOrLengthofWait = 10000; String ALARM_ACTION = "ALARM_ACTION";

Intent intentToFire = new Intent(ALARM_ACTION);

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);

alarms.set(alarmType, timeOrLengthofWait, pendingIntent);

После  срабатывания Сигнализации Ожидающее намерение, которое  вы указали, начнет транслироваться. Установка  еще одной Сигнализации с тем же Ожидающим намерением приведет к замене предыдущей  Сигнализации.

Для того чтобы отменить Сигнализацию, вызовите метод cancel из объекта AlarmManager, передав ему Ожидающее намерение, которое больше не должно срабатывать,  как показано в следующем фрагменте:

alarms.cancel(pendingIntent);

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

Листинг 9.26. Установка  и отмена Сигнализации

AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

String MY_RTC_ALARM = "MY_RTC_ALARM"; String ALARM_ACTION = "MY_ELAPSED_ALARM";

PendingIntent rtcIntent =

PendingIntent.getBroadcast(this, 0,

new Intent(MY_RTC_ALARM), 1); PendingIntent elapsedIntent =

PendingIntent.getBroadcast(this, 0,

new Intent(ALARM_ACTION), 1);

// Пробудить устройство и запустить Намерение через 5 часов. Date t = new Date(); t.setTime(java.lang.System.currentTimeMillis() + 60*1000*5); alarms.set(AlarmManager.RTC_WAKEUP, t.getTime(), rtcIntent);

// Запустить Намерение через 30 минут, если устройство не находится

// в спящем режиме.

alarms.set(AlarmManager.ELAPSED_REALTIME, 30*60*1000, elapsedIntent);

// Отменить первую Сигнализацию. alarms.cancel(rtcIntent);

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии