Android O: Как использовать каналы уведомлений
Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)
Google запустил первый предварительный просмотр следующей версии Android для разработчиков, в настоящее время под кодовым названием Android O (возможно, Oreo?). Были выпущены некоторые интересные функции и одна из них — Notification Channels (каналы уведомлений). В этом уроке мы рассмотрим этот функционал и создадим простое приложение, демонстрирующее эту функциональность.
Что такое каналы уведомлений?
Каналы уведомлений, позволяют нам разработчикам приложений группировать наши уведомления в группы — каналы — позволяя пользователям изменять настройки уведомлений для всего канала разом. Например, для каждого канала, пользователи могут полностью блокировать все уведомления, изменять уровни важности или включать, чтобы показывались значки уведомления.
Мы собираемся изучить эту функцию при построении простого приложения названного «TutsplusAlerts», в котором будут два канала уведомления: Android и iOS. Пользователь получит уведомление от одного из этих каналов, как только новая статься будет опубликована.
1. Настройка Android O SDK
Чтобы начать использовать Android O API так, как тут описано, вам потребуется последная Android Studio 2.4 Canary.
Запустите Android Studio 2.4 и откройте SDK Manager, через Tools > Android > SDK Manager.
Затем во вкладке SDK Platforms, отметьте Show Package Details. Ниже Android O Preview, отметьте следующее: Android SDK Platform O и Google APIs Intel x86 Atom System Image (требуется только для эмулятора).

Затем переключитесь на вкладку SDK Tools и выберите следующее:
Нажмите кнопку OK, чтобы загрузить все эти компоненты.
2. Создание проекта Android Studio
3. Обновление build.gradle
Не забудьте синхронизировать ваш проект, после сделанных изменений.
4. Создание каналов уведомлений
Уровни важности
Полный список доступных вариантов важности:
Всем уведомлениям канала, будет задан одинаковый уровень влажности.
5. Создание уведомлений и отправка его по каналам
6. Создаем маркет XML
Теперь, когда у нас есть настройка для создания и отправки по каналам уведомлений, давайте создадим XML-макета интерфейса для размещения сообщения в нашем файле activity_main.xml.
7. Отправка уведомлений по каналам
Отправка в канал Android
На этом этапе, запустите приложение, укажите заголовок и автора, а затем нажмите кнопку отправки, чтобы немедленно получить уведомление.

Отправка в канал iOS
Снова запустите приложение, укажите заголовок и автора, а затем нажмите кнопку отправки, чтобы немедленно получить уведомление.

8. Настройки каналов уведомления
На момент написания, вы не можете программно изменить параметры настроек определённого канала уведомлений. Только пользователь может перейти на экран настроек уведомлений для этого приложения, в системных настройках устройства. Поэтому, у пользователя есть доступ к настройкам уведомления предложения, чтобы изменить в такие параметры, как вибрация, звук и т.д. Пользователь может перейти к настройкам уведомления приложения, одним из следующих способов:
Также, вы можете отправить пользователя настройки канала уведомления, прямо из вашего приложения. Давайте посмотрим, как это можно сделать для канала Android. Рекомендуется сделать это в настройках вашего приложения, чтобы облегчить пользователю доступ к этим параметрам уведомлений.
Редактируем XML макет
Добавьте другую кнопку, которая будет отправлять пользователя в настройки канала уведомления.
Кодим Intent
Здесь мы создаём intent и передаем ему действие «Настройки» — ACTION_CHANNEL_NOTIFICATION_SETTINGS (API 25), а затем добавим дополнительные значения: имя пакета приложения и идентификатор (id) канала. Наконец, мы начинаем работу настройки Активити с intent.
Запустите приложение и нажмите по настройкам уведомления для канала Android.

В настройках канала уведомления, пользователи могут редактировать такие настройки канала, как включение вибрации, смена важности или отображение значка (если поддерживается).
Если вы хотите предоставить пользователям основные настройки уведомления для вашего приложения, вы можете сделать это с помощью Intent :
9. Создание групп уведомлений
Также, мы можем копировать каналы уведомлений в группы, тогда ими можно будет управлять совместно. Это полезно для приложений, которые поддерживает несколько учётных записей пользователей. Те же каналы уведомлений доступны для отдельных учетных записей. Например, приложение социальной сети может иметь поддержку как личного, так и бизнес аккаунтов. Код ниже показывает, как создать группу канала уведомлений.
10. Удаляем канал уведомления
Если канал уведомления больше не нужен, его можно запросто удалить. Просто используйте метод управления уведомлением deleteNotificationChannel() и передайте ему id канала.
Однако имейте в виду, что удаленные каналы остаются видимыми в настройках уведомлений, чтобы предотвратить спам.
Заключение
В этом уроке вы узнали том, что такое Notification Channels (каналы уведомлений) и как создать такой для Android O, а также о том, как отправить уведомление на канал, как получить доступ к настройкам канала уведомления, как копировать каналы уведомлений и как удалить канал уведомлений.
Чтобы узнать больше о каналах уведомлений — Notification Channels, обратитесь к официальной документации. В это время, посмотрите некоторые из наших других курсов и уроков по разработки для Android!
Exploring Android O: Notification Channels
This week we saw the announcement of the first Android-O developer preview. One of the features of this announcement includes Notification Channels — in this article we’re going to take a look at exactly what these are and how we can make use of them within our applications!
Notification Channels provide us with the ability to group the notifications that our application sends into manageable groups. Once our notifications are in these channels, we no longer have input into their functionality — so it is up to the user to manage these channels. When it comes to altering the settings for our application notifications, the user will be presented with these options:
Starting from the left, you can see in the first screen that the notification settings for our app displays the notification settings for our application. From here the user can:
The next screen (in the middle) can be accessed once the user selects a notification category from the first screen. From here the user is able to:
And as shown in the final screenshot, the user can also set the importance of notifications from this channel. The option selected here will state how they want to be prompted when a notification is received.
We also have the ability to group notification channels into separate groups. This is so that we are able to have the same notification channels across multiple application modes.
For example, my application may support Personal and Business mode, or Child and Parent mode — this allows us to give the option to manage notification settings across multiple groups.
These are displayed in the same place as our notification channels, except just separated into their corresponding group.
On older versions of Android (pre-O) these new features will be completely ignored, so we don’t have to worry about current implementations breaking.
Now we know a little more about what notification channels are, I think it’s time we look at how we can implement them into our application!
It’s quite straightforward for us to create notification channels within our app.We now have access to a method called createNotificationChannel() from the Notification manager. We can use this to create channels for our application notifications. When doing this, it will look something like so:
We can manipulate this NotificationChannel by making use of some of the public methods that it provides to us:
You can read more about the NotificationChannel class here.
Now we have our notification channel created, we are able to reference this channels ID when it comes to creating a Notification to be displayed on the users device.
As mentioned earlier, we are able to group our notifications channels into manageable groups. This allows us to have identically named notification channels defined into different manageable sections, which can be useful if our application supports multiple accounts and / or modes.
We can create a notification channel group by using the createNotificationChannelGroup() method provided by the Notification Manager. When doing so, we need to pass it an instance of a NotificationChannelGroup consisting of:
Once we’ve created a group, we can use the setGroup() method when creating our Notification Channel instance, passing in the ID of the group which we wish to associate our notification channel with.
We can also create a batch of notification groups by using the )» rel=»noopener ugc nofollow» target=»_blank»>createNotificationChannelGroups() method, passing in a List of NotificationChannelGroup instances for the groups we wish to create.
Полный список
В Android Oreo (API 26) появилась возможность создавать каналы для уведомлений. В этом уроке разберемся, как это делать и зачем это нужно.
Для каждого приложения пользователь может настроить уведомления. Для этого надо зайти в настройки системы, там выбрать Apps, найти в списке и открыть нужное приложение и выбрать раздел Notifications.
По умолчанию настройки выглядят так:
Настроек немного, и они затронут все уведомления от данного приложения.
Каналы позволяют расширить эти настройки и применять их выборочно. Разработчик приложения создает канал и указывает его ID при создании уведомлений. Пользователь в системных настройках приложения видит этот канал и может настроить его: важность, звук, вибру и пр. В итоге все уведомления, которые принадлежат этому каналу, будут отображаться с этими настройками.
Т.е. создавая канал, разработчик дает пользователю возможность настроить поведение определенной группы уведомлений.
Давайте создадим канал:
Каналы актуальны только для Android Oreo и выше, поэтому используется проверка версии Android. Далее я не буду включать эту проверку в примеры, чтобы не загромождать код.
В конструкторе NotificationChannel указываем ID, имя и важность. Далее указываем прочие данные и настройки. По названию методов все понятно.
Теперь Notifications настройки приложения выглядят так:
Появились два канала: дефолтный и наш созданный My channel. Настройки дефолтного будут использованы для уведомлений, для которых не был указан канал.
Откроем настройки My channel:
Обратите внимание, что пункт Vibrate выключен. Мы явно указали это при создании канала, используя метод enableVibration(false).
Теперь при создании уведомлений вы можете указать ID канала, и уведомления будут отображены в соответствии с настройками этого канала.
ID канала указывается в конструкторе билдера уведомления. И теперь этот конструктор не будет зачеркнут как Deprecated, если вы используете библиотеку appCompat версии 26 и выше.
В какой момент создавать канал? Можно при старте приложения. Даже если канал уже был ранее создан, то просто ничего не произойдет. Но судя по тому, что пользователь не может удалять каналы, я думаю, можно использовать какой-нить флаг, который мы установим в true после первого создания каналов, и в дальнейшем он будет говорить нам о том, что каналы уже созданы.
Группа
Рассмотрим пример почтового приложения. Предположим, что оно умеет работать не только с почтой, но и с календарем. Т.е. оно может нам присылать уведомления двух типов: письма и события.
Но наше приложение поддерживает несколько учетных записей. И под каждую учетную запись нам необходимо создавать два канала для уведомлений.
При создании 4-х каналов настройки будут выглядеть так:
Создается группа так:
В конструкторе указываем ID и имя.
Далее, при создании канала используем метод setGroup, чтобы указать какой группе будет принадлежать канал.
Таким образом для каждой учетной записи нашего приложения мы можем создать группу, и указать ее при создании каналов уведомлений этой учетной записи:
User A (group)
Mail (channel)
Events (channel)
User B (group)
Mail (channel)
Events (channel)
Теперь настройки выглядят лучше:
Каналы сгруппированы по учетным записям.
Получение информации о канале
В любой момент после создания канала, вы можете получить информацию о нем.
Метод getNotificationChannel вернет вам объект NotificationChannel или null, если канал с указанным ID не был найден. Используя различные get-методы канала, вы сможете узнать, как пользователь настроил ваш канал. Но вы не сможете перенастроить его, set-методы просто не будут работать.
Если вы считали настройки канала и по каким-то причинам решили, что пользователь не прав, то вы можете попросить его поменять настройки.
Например, если пользователь выключил отображение уведомлений для канала, открываем настройки этого канала.
Если getImportance равен IMPORTANCE_NONE, это значит, что канал был выключен пользователем. Создаем Intent с указанием ID канала и package приложения и запускаем Activity.
Разумеется, в реальном приложении надо действовать не так топорно, а сначала поинтересовать мнением пользователя и объяснить, почему вы хотите, чтобы он поменял настройки канала.
Удаление канала
Чтобы удалить канал, используйте метод deleteNotificationChannel
Технически вы конечно, можете использовать удаление, а затем создание канала, чтобы восстановить ваши настройки. Но так делать не рекомендуется. К тому же в настройках, в самом низу, пользователь будет видеть, сколько каналов было удалено.
И он поймет, что вы просто пересоздаете канал и сбрасываете его настройки.
Importance vs Priority
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Быстрый способ добавить уведомления в Android-приложение
Перевели для вас статью Брендона Вивера о работе с уведомлениями в Android OS. Программист объясняет, как быстро добавить этот функционал в свое приложение. Статья, в первую очередь, будет полезна начинающим Android-разработчикам.
Уведомления — один из самых легких и быстрых способов сделать свое приложение интерактивнее, что позволит привлечь больше пользователей. Уведомления предоставляют пользователю краткую информацию о том, что может понадобиться ему прямо сейчас. Также это способ проинформировать о предстоящих событиях. Давайте попробуем быстро добавить эту функцию в приложение.
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».
Создание уведомления
Первым шагом будет создание объекта “Notification”. Для этого используем NotificationCompat.Builder. Минимальное содержимое уведомления, которое позволяется разработчиками Android, — небольшая иконка. Это хорошо, но мало и не слишком полезно для пользователя. Ниже — схема стандартного уведомления, которое неплохо воспринимается.
Маленькая иконка будет демонстрироваться постоянно, причем важно сделать ее альфа-прозрачной. Без этого вместо иконки вы получите белый квадратик.
Заголовок уведомления тоже важен. Это должно быть короткое описание, позволяющее понять, почему вообще пользователя беспокоят.
Тело уведомления содержит подробный текст со всей необходимой информацией.
Большая иконка может быть логотипом компании или еще чем-нибудь.
Ниже — два варианта действий для пользователя.
Для отображения всего этого нужен коротенький код:
Демонстрируем уведомление
Мы создали наше уведомление, теперь задача — показать его. Android дает возможность сделать это при помощи NotificationManagerCompat. Для отправки уведомления необходимо использовать notificationID и само уведомление.
Дополнительный код нужен для проверки существования канала уведомлений.
Каналы и важность
Впервые пользователь получил возможность выбирать типы уведомлений от своих приложений в Oreo. Создать несколько каналов важно, поскольку если всё идет по одному каналу, пользователь не сможет выбрать необходимые ему типы уведомлений и заблокирует все.
Канал должен включать следующую информацию:
Взаимодействие с пользователем
Есть несколько способов взаимодействия пользователя с уведомлениями. К счастью, API, позволяющие контролировать процесс, достаточно похожи. Intents и PendingIntents используются для обратной связи с приложением, обеспечивая определенную логику обработки.
Самый простой способ обработки большого количества уведомлений — использование BroadcastReceiver. Когда пользователь начнет взаимодействовать с уведомлением, сработает Intent и будет вызван метод onReceive BroadcastReceiver.
ContentIntent будет запущен по нажатию на уведомление. Стоит помнить, что уведомление не будет отклонено, если вы не вызовете в нем setAutoCancel (true).
DeleteIntent запустится после того, как пользователь удалит уведомление.
Действия — это кнопки внизу уведомления. У них также есть значки и названия.
Для создания BroadcastReceiver вам необходимо расширить класс BroadcastReceiver, переопределить onReceive-метод и не забыть объявить Receiver в AndroidManifest.xml.
NotificationController — быстрый инструмент для создания PendingIntents для уведомлений. Самое главное — задавать действиям различные названия, чтобы правильно обрабатывать реакции пользователя на уведомление. Также, если вы собираетесь запускать Activity из BroadcastReceiver, вы должны использовать IntentFlag NEW_TASK.
Это нужно, чтобы обработать все уведомления в одном месте. Intents также могут быть зарегистрированы для разных BroadcastReceivers, так что вы можете ограничить область действия одним BroadcastReceiver для каждого типа уведомления.
Все это — лишь начало работы. В документации много замечательных примеров, так что не забывайте изучать ее, если есть вопросы или желание сделать что-то более продвинутое.
Уведомления
Вступление
Кроме Toast-уведомлений, существует также другой тип уведомлений, который выводится за пределами вашего приложения, а именно, в верхней части телефона в системной строке состояния в виде значка с небольшим текстом.
Уведомление может висеть в строке состояние сколь угодно долго, пока сам пока пользователь не отреагирует на него, в отличие от Toast-сообщения, которое исчезнет через несколько секунд. В Android 5.0 добавилась возможность выводить уведомление в виде отдельного небольшого всплывающего окна (если устройство не заблокировано). В особых случаях уведомление можно выводить и на экран блокировки.
Пользователь может в настройках вашего приложения отключить уведомления в любой момент. Поэтому не стоит спамить пользователя ненужными сообщениями. Также нелишним будет проводить проверку, что уведомление будет выведено на экран.
Обратите внимание, что в имени класса спрятан кот (Notification), что намекает на целевое использование уведомлений. Уведомляйте пользователя только о самом важном, например, что пора кормить кота.
Когда пользователь открывает расширенное сообщение, Android запускает объект Intent, который определён в соответствии с уведомлением. Можно также конфигурировать уведомление с добавлением звука, вибрации и мигающих индикаторов на мобильном устройстве.
Этот вид уведомления удобен в том случае, когда приложение работает в фоновом режиме и должно уведомить пользователя о каком-либо важном событии. Фоновое приложение создаёт уведомление в строке состояния, но не запускает активность самостоятельно для получения пользовательского взаимодействия. Это должен сделать только сам пользователь в удобное ему время.
Чтобы создать уведомление в строке состояния, необходимо использовать два класса:
Показываем уведомление
Добавим на экран активности кнопку и напишем для демонстрации работы уведомления.
Для начала вам надо создать идентификатор уведомления. Он нужен, чтобы можно было различать уведомления друг от друга. Ведь вы можете создать идеальное приложение, которое уведомляло бы хозяина, что кота надо покормить (первое уведомление), погладить (второе уведомление), почистить лоток (третье уведомление). Если у вас будет один идентификатор, то каждое новое уведомление затрёт предыдущее и хозяин не увидит свои недоработки. Это не дело. Для идентификатора используйте какое-нибудь число. Только не надо оригинальничать, ничего не имею против числа 836, но вам определённо нужно сходить к психологу.
Также следует создать идентификатор канала. Каналы появились в API 26, но старые устройства будут просто игнорировать данный параметр при вызове конструктора NotificationCompat.Builder.
Далее формируется внешний вид и поведение уведомления через построитель NotificationCompat.Builder. Вы можете задать текст уведомления, значок, заголовок и прочие атрибуты. Для простого примера оставил минимальный набор настроек.
Не забывайте использовать вместо строк строковые ресурсы, пример лишь для знакомства.
Запустим пример и нажмём кнопку. В строке состояния появится значок. Раскроем уведомление и увидим текст. Уведомление можно смахнуть в сторону для удаления.

Реакция на уведомления
Нажатие на уведомление ни к чему не приведёт. Нужен дополнительный код.
Создадим новые объекты Intent и PendingIntent, которые описывают намерения и целевые действия. В нашем случае мы хотим запустить нашу активность, когда пользователь среагирует на уведомление. Присоединяем объекты через setContentIntent().
Теперь можно создать уведомление и затем закрыть приложение. Если нажать на уведомление, оно откроет заново ваше приложение.
Сделаем уведомление более красивым, добавив другие необязательные настройки.
Теперь в уведомлении мы видим картинку. Метод setTicker() выводит сообщение в строке состояния на короткое время, а затем исчезает. Это работает только на старых устройствах и сейчас можно уже не использовать.
Как я уже упоминал, если вам нужно обновить уведомление, то просто ещё раз отправьте его устройству под этим же идентификатором, но с другим текстом и картинкой.
Если уведомления разного типа, то нужно обновлять идентификаторы. Вспомним урок по подсчёту ворон и изменим код.
Теперь будут появляться новые уведомления. Обычно выводятся три значка для одного приложения (на новых устройства), потом они группируются и на экране остаётся только один значок. Проверьте самостоятельно.
Совсем не обязательно запускать своё приложение, хотя это является распространённой практикой. Можете задать нужное поведение, например, запустить свой сайт по указанному адресу. Переделаем код:
Можно вывести индикатор прогресса, чтобы указать текущий ход выполнения задачи. Можно установить бесконечное выполнение:
Удаление собственных уведомлений
Вы можете из программы удалить своё уведомление, посланное по глупости (не вздумайте удалять уведомления про кормёжку кота!).
Если уведомления с указанным идентификатором не будет, то ничего страшного при удалении не произойдёт, поэтому проверку не нужно устраивать.
Использование настроек по умолчанию
Можно добавить вибрацию, звуковой сигнал или мерцание светодиодами для ваших уведомлений при помощи настроек по умолчанию. В свойстве defaults вы можете сочетать следующие константы:
Чтобы к уведомлению добавить звук и вибрации по умолчанию, используйте код:
Если хотите установить сразу все значения по умолчанию, задействуйте константу Notification.DEFAULT_ALL.
Звуковое сопровождение
Использование звуковых оповещений для уведомления пользователя о событиях, связанных с устройством (например, входящий звонок), стало привычным. Большинство стандартных событий, от входящих звонков до новых сообщений и низкого заряда батареи, объявляются с помощью звуковых мелодий. Android позволяет проигрывать любой звуковой файл на телефоне в качестве уведомления. Чтобы это сделать, нужно присвоить свойству sound путь URI:
Также можно использовать собственный звуковой файл, загруженный на устройстве или добавленный в проект в качестве ресурса.
Виброзвонок
Вы можете использовать функцию виброзвонка в телефоне, чтобы сопровождать ваше уведомление вибрацией для привлечения внимания пользователя.
Чтобы использовать виброзвонок, передайте в свойство vibrate объекта Notification массив значений типа long. Постройте массив, учитывая, что значения, отвечающие за продолжительность вибрации (в миллисекундах), чередуются со значениями, которые означают длину паузы между вибрациями.
Прежде чем использовать виброзвонок в своем приложении, необходимо получить нужные полномочия, прописав их в манифесте:
В следующем примере показано, как изменить уведомление, чтобы одна секунда вибрации сменялась одной секундой паузы на протяжении пяти секунд:
Светодиодная индикация
Объект Notification включает в себя свойства для настройки цвета и частоты мерцания светодиодов устройства. Здесь стоит обратить внимание, что конкретные модели устройств могут не содержать светодиодные индикаторы или иметь другие цвета.
Свойство ledARGB может устанавливать цвет для светодиодной подсветки. Свойства ledOffMS и ledOnMS позволяют регулировать частоту и поведение светодиодов. Вы можете включить светодиоды, присвоив свойству ledOnMS значение 1, а ledOffMS – 0. Присвоив им обоим значения 0, светодиоды можно выключить.
Настроив работу со светодиодами, необходимо также добавить флаг FLAG_SHOW_LIGHTS к свойству flags объекта Notification.
В следующем фрагменте кода показано, как включить на устройстве красный светодиод:
Текущие и настойчивые уведомления
Вы можете делать уведомления текущими и/или настойчивыми, устанавливая флаги FLAG_INSISTENT и FLAG_ONGOING_EVENT. Уведомления, помеченные как текущие, используются для представления событий, которые выполняются в данный момент времени (например, загрузка файла, фоновое проигрывание музыки). Текущие уведомления необходимы для сервисов, работающих на переднем плане. Пример установки флагов:
В расширенной статусной строке текущие события отделены от обычных, чтобы вы сразу могли их отличить.
Настойчивые уведомления непрерывно повторяют звуковые сигналы, вибрируют и мерцают светодиодами, пока не будут остановлены. Подобные уведомления, как правило, используются для событий, которые требуют немедленного и своевременного внимания, таких как входящий звонок, срабатывание будильника или время кормёжки кота. В следующем фрагменте кода показано, как сделать уведомление настойчивым:
В методе getActivity() может понадобиться изменить флаг, например.
Существуют и другие флаги. Хотя в большинстве случаев используется просто 0.
В Android 5.0 пользователь может установить собственный уровень оповещений, нажав на кнопки увеличения громкости на домашнем экране. Появится диалоговое окно, в котором задаётся один из трёх доступных уровней.
Запустить запущенную активность
Не сразу бывает заметно, но на самом деле, когда при нажатии на уведомлении у вас запускается активность, то запускается не старая активность, которая была на экране до этого, а новая. Это можно увидеть в примере, если, например, есть текстовое поле с текстом. Введите какой-нибудь текст в активности, а потом создайте уведомление, вызывающее активность. Вы увидите, что запустится новая активность с пустыми текстовым полем, хотя мы ожидали увидеть запущенную активность. Если вам нужен именно этот вариант, то используйте флаги для намерения.
Либо вы можете прописать в манифесте для нужной активности атрибут android:launchMode=»singleTop».
Меняем цвет значка
По умолчанию, значок выводится в сером круге. Вы можете изменить цвет круга, вызвав новый метод setColor(), который появился в API 21:
Анимированный значок для уведомления
Запускаем код и создаём уведомление. Вы увидите, что в строке состояния выводится анимированный значок стрелки. Такой способ стоит использовать для действительно важных сообщений, чтобы понапрасну не раздражать пользователя.
Возможно, если вы опустите метод setTicker(), то значок уже не будет анимированным, где-то работало, где-то нет. Проверяйте самостоятельно.
Вы можете попробовать поискать другие системные анимации, например, android.R.drawable.stat_sys_download или создать собственную анимацию.
На странице http://forum.xda-developers.com/showthread.php?t=1088677 энтузиасты выложили несколько готовых примеров анимации, которые можно скачать.
Расширенные возможности уведомлений
В Android 4.1 Jelly Bean появились дополнительные возможности для уведомлений через настройку стилей.
Добавьте на экран четыре кнопки.
Уведомление с тремя кнопками
Начнём с первого варианта. Теперь в уведомлениях можно размещать до трёх кнопок. Это может быть удобным, если приложение состоит из нескольких активностей или нужно предложить три разных варианта развития сценария. За появление кнопок в уведомлении отвечает метод setAction().
Обратите внимание, что у кнопок текст может обрезаться и пользователь не увидит текст, поэтому вам следует придумать «говорящие» значки, по которым будет понятен смысл нажатия. В нашем примере при нажатии на любой из трёх кнопок запустится вторая активность.
На некоторых устройствах можно увидеть уведомление без значков и с текстом. Также были варианты, когда выводились только значки.
Уведомление с длинным текстом. BigTextStyle().bigText()
Если вы внимательно смотрели на уведомление, то могли увидеть, что длинный текст, помещённый в метод setContentText(), вывелся на экран не полностью. Если информация слишком важная и вам хочется её показать в уведомлении полностью, то подойдёт вариант со стилем BigTextStyle:
Уведомление с большой картинкой: BigPictureStyle().bigPicture()
Пример с большой картинкой аналогичен с предыдущим примером. Только мы задаём уже другой стиль для уведомления. Вместо стиля длинного текста используется стиль BigPictureStyle().bigPicture():
Слишком большая картинка будет обрезана.
Уведомление в стиле InboxStyle
Есть ещё один стиль InboxStyle, напоминающий стиль писем в папке Входящие. Стиль разместит до пяти ваших строк в виде списка. Весь код приводить не буду, меняется только вызов setStyle()
Уведомление в стиле мессенджера: MessagingStyle
Стиль MessagingStyle пригодится для отображения сообщений из мессенджера или чата. Появился в Android Nougat.
В конструкторе MessagingStyle вы должны указать имя текущего пользователя, который будет видеть свои сообщения.
У класса Person есть другие полезные методы: setIcon() (значок), setData() (картинки) и др.
В setConversationTitle() указываем название беседы, удобно при разговоре двух и более котов. В поздних версиях не имеет эффекта, можно убрать.
Разговор строится через цепочку вызовов методов addMessage(), в которых указывается текст сообщения, время, отправитель. Количество сообщений может быть любым. При большом количестве (задано в MessagingStyle.MAXIMUM_RETAINED_MESSAGES) старые сообщения начнут удаляться автоматически.
Подводя итоги, следует отметить, у уведомлений очень много методов, которые можно использовать в своём приложении. Вот как может выглядеть полный набор:
Приоритет
В API 16 появился новый метод setPriority() с константами по мере увеличения: NotificationCompat.PRIORITY_MIN, NotificationCompat.PRIORITY_LOW, NotificationCompat.PRIORITY_DEFAULT, NotificationCompat.PRIORITY_HIGH, NotificationCompat.PRIORITY_MAX.
Чем выше приоритет уведомления, тем выше он находится среди остальных уведомлений. Таким образом, важные сообщения всегда будут наверху, даже если поступили позже других менее важных сообщений. Не злоупотребляйте этой возможностью и трезво оцените важность вашего уведомления.
В Android 5.0 произошли небольшие изменения в поведении. Если установлены максимальные приоритеты Notification.PRIORITY_HIGH или Notification.MAX, то при вызове сначала уведомление появится в виде плавающего окна в верхней части экрана, а только потом закроется и останется в виде стандартного уведомления в строке состояния.
Пример изменений, которые произошли в API 23:
В уведомлениях можно использовать собственный макет, используя RemoteViews. Для стилизации макета изучите классы DecoratedCustomViewStyle и DecoratedMediaCustomViewStyle. Подключается через метод setCustomContentView().
В уведомлениях появилась возможность вводить собственный текст для ответа на какое-то сообщение. Для этого используется механизм Direct Reply, который использует RemoteInput API.
NotificationListenerService. Прослушка уведомлений
В API 18 (Android 4.3) появился новый класс NotificationListenerService, позволяющий следить за уведомлениями. С тех пор я следил за этой темой. Материал был написан по горячим следам в 2015 году. Если не работает, то разбирайтесь самостоятельно.
Новый класс является службой, которая получает сигналы от системы, когда появляются или удаляются уведомления. Таким образом вы можете отслеживать не только свои уведомления (они и так вам известны), но и уведомления от других приложений. Это может быть полезным для каких-то расширений к приложениям.
Вам нужно наследоваться от данного класса, зарегистрировать его в манифесте с разрешением BIND_NOTIFICATION_LISTENER_SERVICE и включить в него специальный фильтр намерения.
У службы есть два метода onNotificationPosted() и onNotificationRemoved() с параметром StatusBarNotification, который содержит полезные методы об уведомлении.
Пользователь должен явно разрешить приложению следить за уведомлениями через Настройки | Безопасность. Если на устройстве нет приложений, которые следят за уведомлениями, то в настройках вы не увидите никаких пунктов о разрешении. Когда вы создадите такое приложение, то там появится новый пункт Доступ к уведомлениям.
Щёлкнув на нём, вы попадёте на страницу со списком программ, желающих следить за уведомлениями. Поставим флажок у своей программы.
После этого в настройках будет указано число приложений, имеющих соответствующее разрешение.
Перейдём к практической части. Подготовим разметку из нескольких кнопок и текстовой метки для вывода информации.
Создадим новую службу.
В манифесте добавляем новый блок.
Первая кнопка запускает уведомление, чтобы увидеть, что приложение работает. Если вы хотите увидеть, как приложение следит за другими уведомлениями, то запустите Play Market и скачайте какую-нибудь игру или программу. Во время скачивания и установки генерируются уведомления. На следующем скриншоте видны уведомления от приложения Загрузки во время скачивания (com.android.providers.downloads) и от процесса установки (com.android.vending).
Вы можете программно запустить раздел с разрешением на использование службы.











































