Android components: BroadcastReceiver & IntentService in notifications

В последнее время я заметил, что много времени уходит непонятно на что и тут вспомнил про одну из техник управления временем (Матрица Эйзенхауэра), которая в действительности является вполне эффективной. И для этих целей я решил написать маленькое приложение (ссылка на Google Play), а-ля таск менеджер, единственным отличием от других является разделение задач на категории (1 — срочно и важно, 2 — срочно, но неважно, 3 — важно, но несрочно, 4 — неважно и несрочно). Но толку от этого приложения было бы ноль, если бы для срочных задач не было возможности отправлять оповещение о времени исполнения («дэдлайн»). И здесь мы сталкиваемся с теми компонентами андроид, в которых в повседневности нет необходимости — BroadcastReceiver & IntentService. Итак, давайте разберемся что к чему.

Такой вот примерно код у нас в активити, есть 2 метода для отправки оповещения и отмены уже отправленного. Для начала нам нужен receiver для получения оповещения, для этого нам нужно отнаследоваться от соответствующего класса и прописать в манифесте (см. в конце).

Итак, для работы получения оповещения нужен некий айди, сам объект оповещения и флаг для отмены оповещения. И в единственном методе получения оповещения прописываем действия для отмены оповещения и обнаружения его системой. Код максимально прост, так как создание оповещения было вынесено в активити.

Вернемся в активити. Итак, мы создали интент receiver, но его нужно обернуть в PendingIntent для отправки между разными компонентами андроида.

Здесь мы указываем флаг FLAG_ONE_SHOT отобразить 1 раз, потому что нам не нужно показывать одно и то же оповещение более 1 раза. После этого мы передаем его объекту AlarmManager. Флаг AlarmManager.RTC_WAKEUP нужен чтобы считывать время в том формате, в котором мы его передаем от диалогов выбора даты и времени (см. исходники на гитхабе).

И самое интересное это создание самого оповещения. Если receiver просто получает оповещение, то было бы неплохо по клику на оповещение переходить в приложение и видеть детали таски. Рассмотрим детально код создания оповещения.

Здесь мы создаем интент для сервиса, опять оборачиваем его в PendingIntent (обычные intent используем для явных и неявных переходов в активити в основном).

Посмотрим на сервис детальней.

Здесь тоже все просто, передаем сервису айди элемента и некоторые параметры, по нему строим интент для перехода в активити и в единственном методе просто переходим в него. Единственное, нужно указать в манифесте рядом с рисивером.

Посмотрим на часть манифеста.

После активити, которые мы обычно указываем в манифесте, нужно указать рисивер и сервис, иначе не будет работать. Флаг exported нужен чтобы внешние приложения тоже могли использовать рисивер.

Запись опубликована в рубрике Программирование Android. Добавьте в закладки постоянную ссылку.