Создаём уведомления в Android. Часть 5. Свой дизайн уведомления

Стандартный дизайн уведомлений подходит только для оповещения пользователя о чём-либо в виде текста.

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

Основные принципы

Рассмотрим создание собственного макета на простом примере, который содержит текстовую надпись и кнопку.

Разметка макета:

При создании уведомления получаем макет как RemoteViews:

И передаём в NotifictionBuilder через метод setContent (на данный момент устарел (deprecated)).

Или setCustomContentView с использованием стиля DecoratedCustomViewStyle ()

Обратите внимание на отсутствие методов, задающих заголовок, текс и значок. Теперь всё это определяется макетом.

Дальнейшие действия не отличаются от обычного уведомления.

Скриншот уведомления:

Уведомление

Важно отметить, что далеко не все контейнеры и элементы управления могут быть использованы в макетах уведомлений. При создании макета доступны только: FrameLayout, LinearLayout, RelativeLayout, GridLayout, AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar, TextView, ViewFlipper, ListView, GridView, StackView и AdapterViewFlipper. Подробнее можно посмотреть в документации [1].

Это нужно обязательно учитывать при разработке дизайна уведомления.

Редактирование и добавление функционала

Параметры элементов макета могут быть изменены в процессе работы приложения. Для этого используются специальные методы объекта RemoteViews.

Так, например тестовую надпись можно изменить при помощи метода setTextViewText.

Подобные методы предусмотрены и для других поддерживаемых элементов управления (см. [1]).

Что касается функционала, то для макета предусмотрена только обработка события onClick и то посредством PendingIntent. Но, для этого нужно не только соответствующим образом сконфигурировать сам PendingIntent, но, и реализовать его обработку.

Вначале создадим BroadcastReceiver, который будет получать данные из Intent. В нашем тестовом примере данные буду просто выводиться в Logcat.

Log.e в данном случае используется только для того, чтобы сделать наше сообщение более заметным среди общей массы того, что система выводит в Logcat.

Зарегистрируем BroadcastReceiver в манифесте приложения.

Далее создаём константу, которая содержит имя действия для BroadcastReceiver.

В нашем случае для простоты мы создадим её прямо в Activity. Но, в реальных приложениях лучше это делать в специальном интерфейсе.

Теперь создадим Intent, который будет содержать нужные данные и обернём его в PendingIntent.

Цифра «1» обозначает так называемый requestCode. Этот параметр практически не используется системой, но для корректной работы желательно задавать каждому PeindingIntent собственное значение этого параметра (обязательно отличное от нуля).

Далее привязываем PendingIntent к кнопке нашего макета при помощи метода setOnClickPendingIntent.

На этом процесс добавления функционала завершён.

При нажатии кнопки в уведомлении в Logcat теперь будет отображаться информация переданная через «test_message».

Снимок LogCat

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

Также если нужно с помощью PendingIntent также можно запустить и новую Activity.

Источники
  1. RemoteViews. https://developer.android.com/reference/android/widget/RemoteViews.html

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *