show notification что это
Полный список
— шлем уведомление из сервиса
В принципе, уведомления – отдельная от сервисов тема. Но чаще всего уведомления используются именно в сервисах, поэтому я решил дать эту тему сейчас.
В андроид есть строка вверху экрана. Называется она статус-бар. Туда обычно в виде иконок сваливаются различные уведомления для пользователя (новые письма, смс и прочие). Пользователь открывает статус бар – видит там чуть более подробную инфу о событии. Дальше он может либо стереть это уведомление, либо нажать на него и перейти непосредственно к событию.
В этом уроке научимся все это проделывать. Для начала разберем уведомление на логические составляющие, чтобы проще было понять как его создавать и отправлять.
Первая часть – то, что видно в статус-баре, когда уведомление только приходит – иконка и текст. Текст потом исчезает и остается только иконка.
Вторая часть – то, что мы видим, когда открываем статус бар (тянем вниз). Там уже полноценный View с иконкой и двумя текстами, т.е. более подробная информация о событии.
Третья часть – то, что произойдет, если мы нажмем на View из второй части. Тут обычно идет вызов Activity, где мы можем просмотреть полную информацию и обработать событие.
Кроме этого есть еще несколько возможностей, по которым совсем кратко пробежимся в конце урока.
Создадим приложение и сервис. Сервис, как будто загружает файл и посылает уведомление, по нажатию на которое будет открываться приложение и отображать имя файла.
Project name: P0991_ServiceNotification
Build Target: Android 2.3.3
Application name: ServiceNotification
Package name: ru.startandroid.develop.p0991servicenotification
Create Activity: MainActivity
Добавим в strings.xml строки:
Кнопки для старт/стопа сервиса и TextView для отображения результата
Создаем сервис MyService.java и прописываем его в манифесте. В манифесте же настроим сервис так, чтобы он работал в отдельном процессе. Для этого надо в его атрибуте process написать двоеточие и какое-нить слово.
Система эту строку добавит к package сервиса и, тем самым, получит название нового процесса, в котором и запустит сервис
В onCreate мы вытаскиваем из intent и кладем в TextView текст. Этот текст мы будем отправлять из сервиса через уведомление.
onClickStart и onClickStop – это обработчики кнопок. Стартуют и останавливают сервис.
В onCreate получаем менеджер уведомлений – NotificationManager. Он нам понадобится, чтобы отправить уведомление.
В onStartCommand запускаем паузу на 5 секунд (эмулируем закачку файла) и после этого отправляем уведомление. Именно из-за этой паузы мы и используем другой процесс, чтобы не тормозило основное приложение.
В sendNotif мы создаем и отправляем уведомление. Правда, немного в иной последовательности, что я описывал выше. Сначала первая часть, потом третья, потом вторая.
Первая часть – создаем Notification. В конструкторе указываем иконку и текст, которые будут видны в статус-баре. Также мы здесь указываем время. Обычно это текущее время. Но можно указать и прошлое и будущее. По этому времени уведомления будут отсортированы в статус-баре и в его раскрытой части.
Третья часть – создаем Intent, который мы бы использовали для вызова нашего Activity. Туда помещаем имя загруженного файла. Activity его достанет и поместит в TextView. Далее мы оборачиваем этот Intent в PendingIntent, с помощью метода getActivity. На вход ему передаем контекст и Intent. Второй параметр не используется (так написано в хелпе). А четвертый – это флаги, влияющие на поведение PendingIntent. Они не относятся к теме урока, мы их не используем.
Теперь этот созданный PendingIntent содержит информацию о том, что надо вызывать Activity, а также объект Intent, который для этой цели надо использовать. Это будет использовано при нажатии на уведомлении.
Вторая часть – вызываем метод setLatestEventInfo. Передаем на вход контекст, текст-заголовок, подробный текст и PendingIntent. Теперь, когда мы откроем статус-бар, мы увидим два этих текста (заголовок и подробный). А, когда нажмем на уведомление, система использует PendingIntent для запуска Activity.
Далее мы для созданного уведомления ставим флаг FLAG_AUTO_CANCEL, чтобы оно исчезло из статус-бара после нажатия. По умолчанию оно не исчезает и продолжает висеть.
Далее вызываем метод notify для менеджера уведомлений и передаем туда ID и созданное уведомление. ID используется, если мы хотим изменить или удалить уведомление.
Все сохраним, запустим.
Жмем Start и сразу закрываем приложение кнопкой Назад.
Проходит 5 сек и появляется уведомление (первая часть)
Открываем статус-бар и видим более подробную инфу (вторая часть)
Жмем на уведомление.
Открывается наше приложение (третья часть) и в TextView появляется текст, переданный из сервиса.
Теперь вкратце пробежимся по остальным интересным возможностям уведомлений.
Обновление старого или новое уведомление
Если вы создадите новое уведомление и отправите его (notify) с тем же ID, что и у уже существующего уведомления, то новое заменит старое. Таким образом, вы можете уведомления обновлять.
Если же надо показать новое уведомление, то используйте другой ID.
Удаление
Чтобы убрать уведомление из статус-бара, используется метод cancel у менеджера уведомлений. На вход подается ID. Либо используйте метод cancelAll, чтобы удалить все уведомления.
Если хотите, чтобы уведомление появилось со стандартным звуком, добавьте флаг Notification.DEFAULT_SOUND в поле уведомления defaults.
А для использования своих звуков используется поле sound.
Чтобы проиграть файл с SD:
Чтобы использовать какую-либо из стандартных мелодий, используем Content Provider:
notif.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, «6»);
Вибра
Если хотите, чтобы уведомление появилось со стандартной виброй, добавьте флаг Notification.DEFAULT_VIBRATE в поле уведомления defaults.
А для использования своей комбинации вибры используется поле vibrate. В это поле помещается массив long-чисел. Первое – длительность паузы (в миллисекундах) перед началом вибрирования, второе – длительность вибрирования, третье – длительность паузы, четвертое – длительность вибрирования … и т.д. Т.е. создаете свою комбинацию пауз и вибрирования. И мобила при получении уведомления вам ее провибрирует.
Для работы вибры необходимо прописать права VIBRATE в манифесте.
Индикатор
Если хотите, чтобы уведомление появилось с миганием индикатора, добавьте флаг Notification.DEFAULT_LIGHTS в поле уведомления defaults.
А для использования своей комбинации мигания индикатора используются поля
ledARGB – здесь задается цвет
В итоге индикатор будет мигать с заданными значениями и с заданным цветом. В хелпе написано, что не все девайсы поддерживают разные цвета. Поэтому выбранный вами цвет не гарантируется.
Число
У Notification есть поле number. Вы можете поместить туда число больше нуля и оно отобразится на уведомлении.
Например, при notif.number = 3 уведомление будет выглядеть так:
Флаги
Добавляются в поле flags
FLAG_INSISTENT – звук уведомления будет повторяться, пока не откроют статус-бар
FLAG_ONGOING_EVENT – уведомление появляется не в обычной секции, а в ongoing (постоянные). Уведомления из этой секции не удаляются при нажатии кнопки очистки уведомлений.
FLAG_NO_CLEAR – уведомление не удалится при очистке всех уведомлений
Не очень понимаю, в чем разница между ongoing и тем, что уведомление не удалится после нажатия на кнопку очистки всех уведомлений. Но флаги такие есть, и я о них упомянул.
На следующем уроке:
— изучаем IntentService
— включаем режим Foreground для сервиса
— помещаем сервис в автозагрузку
Присоединяйтесь к нам в 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 для каждого типа уведомления.
Все это — лишь начало работы. В документации много замечательных примеров, так что не забывайте изучать ее, если есть вопросы или желание сделать что-то более продвинутое.
Полный список
В прошлом уроке мы уже рассмотрели, как отобразить Activity по нажатию на уведомление. Но там был простой случай. В этом уроке рассмотрим более интересные случаи.
Чтобы понимать все, о чем дальше пойдет речь, вам понадобятся знания об Activity Tasks Stack. Почитать об этом можно в документации или в Уроке 116.
Для примера возьмем почтовое приложение, состоящее из трех экранов: список писем (MainActivity), содержимое письма (DetailsActivity) и информация о новой версии (WhatsNewActivity). При запуске приложения MainActivity отображает письма, а по нажатию на письмо открывается DetailsActivity c содержимым письма.
У приложения есть какой-то сервис, который связан с сервером. Когда на сервере появляется новое письмо, сервис скачивает его и показывает пользователю уведомление. Пользователь нажимает на него и открывается DetailsActivity для просмотра письма.
Аналогично, сервис получает информацию о новой версии приложения и создает уведомление для этого события. По нажатию на уведомление будет открываться WhatsNewActivity, в котором будут подробно расписаны новые фичи приложения.
Но открывать два этих Activity мы будем разными способами.
DetailsActivity мы будем открывать так же, как если бы оно было открыто из MainActivity. Т.е. мы откроем сразу два Activity (одно за другим): MainActivity и DetailsActivity. Нажав Назад в открывшемся DetailsActivity пользователь попадет в MainActivity.
С экраном WhatsNewActivity ситуация другая. Он предназначен только для открытия из уведомления. Из приложения его открыть невозможно. Т.е. в приложении просто нет такого списка или такой кнопки, которые открыли бы WhatsNewActivity. Потому что это не особо важная информация, и, если вы вдруг сами захотели посмотреть ее, вы можете сходить на сайт приложения.
Давайте рассмотрим, как реализуются два этих варианта
DetailsActivity, как часть приложения
Сначала настроим DetailsActivity в манифесте:
Далее создаем уведомление. Все так же, как мы рассматривали в прошлом уроке. Отличаться будет только создание PendingIntent.
Рассмотрим по шагам, что здесь происходит.
Создаем обычный Intent для открытия DetailsActivity. Передаем туда id, чтобы Activity знало, какую информацию ему надо отобразить. Тут все понятно и обычно.
Вызываем метод )» target=»_blank» rel=»noopener noreferrer»>addParentStack и указываем в нем DetailsActivity, т.е. просим в стек вызовов добавить Activity, которое является родительским для DetailsActivity. TaskStackBuilder идет в манифест и видит, что для DetailsActivity в качестве родительского (parentActivityName) прописано MainActivity. TaskStackBuilder добавляет MainActivity в стек вызовов.
В addNextIntent мы просто передаем Intent для запуска DetailsActivity. TaskStackBuilder добавит его в свой стек вызовов.
В итоге TaskStackBuilder содержит в стеке вызовов два Activity: сначала MainActivity, а затем DetailsActivity.
Методом getPendingIntent он формирует PendingIntent, который мы сможем передать в билдер уведомления. И по нажатию на уведомление будут открыты Activity, которые были в стеке вызовов, сформированном в TaskStackBuilder.
Запускаем, жмем на уведомление
И открываются два Activity. Нажав Назад в DetailsActivity мы попадаем в MainActivity.
Все работает, но осталась одна мелочь. Уведомление не закрывается по нажатию на него. Можно использовать setAutoCancel, как мы делали в прошлом уроке, но это не совсем правильно в данном случае.
Допустим вам приходит уведомление о новом письме. Но вы пока не открывали это уведомление, а решили сразу зайти в приложение, там уже увидели новое письмо, открыли его, прочитали и закрыли приложение. Письмо теперь прочитано вами, а уведомление продолжает висеть, хотя оно уже не актуально.
Правильнее будет удалять уведомление при открытии соответствующего ему письма. Рассмотрим, как это можно реализовать.
Код создания уведомления:
Весь код нам уже знаком. Пройдусь только по части id.
У вас есть id письма (itemId), пусть он будет long. Используя itemId, вы можете создать id для уведомления (notificationId) и далее указать его в методе notify.
Теперь, чтобы удалить уведомление, вам необходимо использовать такой же notificationId в методе cancel.
Реализуем это в DetailsActivity:
Достаем itemId из Intent. Из itemId снова формируем notificationId и используем его в методе cancel.
В результате, при открытии письма в DetailsActivity, уведомление, соответствующее этому письму, будет удалено. И неважно, пришли вы на этот экран сами или по нажатию на уведомление.
Важно, чтобы notificationId, используемый при показе и удалении уведомления совпадал. В нашем примере мы вычисляем его из itemId, просто взяв int часть от long. У вас может быть другой способ получения или формирования этого id.
WhatsNewActivity, отдельное от приложения
Рассмотрим другой вариант. Напомню, что он предполагает открытие Activity отдельно от приложения.
Для этого Activity должно быть настроено следующим образом в манифесте:
launchMode установлен в singleTask, чтобы Activity искало или создавало свой таск. taskAffinity делаем пустым, чтобы Activity не ушло в основной таск приложения. excludeFromRecents нужен, чтобы таск этого Activity не отображался в recent списке приложений.
Создание уведомления выполняется по обычной схеме, только в Intent надо добавить пару флагов, чтобы Activity стартовало в новом пустом таске
В итоге, по нажатию на уведомление будет открываться Activity в отдельном от вашего приложения таске.
И его не будет видно в списке последних запущенных приложений
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
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!