Show notification что это за приложение
Уведомления внизу экрана на Android. Откуда они берутся и что с ними делать
Ежедневно мы получаем десятки, если не сотни уведомлений от разных приложений. Они могут требовать реакции с нашей стороны, а могут не требовать, но так или иначе их можно назвать интерактивными. Узнать их очень просто. Помимо кликабельности, они отличаются тем, что появляются в шторке уведомлений. Однако есть и такие уведомления, которые материализуются в самом низу экрана, не позволяют кликнуть на себя и даже не уточняют, какое приложение их отправило. Разбираемся, что это такое.
Уведомления на Android бывают двух типов: обычные и тост
Второй тип уведомлений, упомянутых мной в предыдущем абзаце, называется тост-уведомлениями. Несмотря на то что с английского слово toast переводится как поджаренный ломтик хлеба, на языке программистов этот термин обозначает маленькое информационное окно, присутствующее в некоторых видах программного обеспечения.
Что такое тост-уведомления
Это и есть тост-уведомление
Тост-уведомления – это системные уведомления, носящие исключительно информирующий характер и не требующие каких-либо действий от пользователя. Самый известный пример тост-уведомлений – это уведомление о получении прав разработчика. Как это сделать и, самое главное, зачем, мы рассказывали в отдельной статье – обязательно почитайте.
Поскольку тост-уведомления не позволяют кликнуть на них, зачастую пользователи, во-первых, не успевают прочесть их содержимое, а, во-вторых, не представляют, какое приложение их им направило. В результате получается полная неразбериха, что не очень удобно, учитывая, что зачастую информационная ценность тост-уведомлений оказывается довольно высокой.
Как добавить тост-уведомления в шторку
Впрочем, существует приложение, которое позволяет превратить тост-уведомления в обычные с характерными признаками: кликабельностью, упоминанием принадлежности и отображением в шторке уведомлений.
Чтобы всё заработало, нужно дать приложению разрешение на работу с универсальным доступом
Тост-уведомления на Android
На Android нельзя возвращаться к чтению тост-уведомлений, но с помощью Toast Sources — можно
Несмотря на то что скорее всего вы будете нечасто обращаться к Toast Sources, рекомендую после настройки тут же спрятать его в папку с другими ненужными приложениями. Дело в том, что оно работает в пассивном режиме, автоматически выцепляя тост-уведомления из системы и интерпретируя их в обычные, которые затем размещаются в шторке уведомлений. Поэтому просто рассматривайте его как одну из системных утилит, не претендующих на регулярное взаимодействие.
Не знаю, как часто вы получаете тост-уведомления, однако я фактически начал получать их только после установки Toast Sources. Это выглядело странным, поэтому я прикинул мозгами и понял, что раньше я просто не замечал их, а теперь у меня банально нет шанса пропустить их. Во всяком случае, когда они стали появляться в шторке уведомлений, я начал осознавать, что тост-уведомления не просто существуют, но и зачастую несут в себе очень полезную информацию.
Новости, статьи и анонсы публикаций
Свободное общение и обсуждение материалов
Даже если ваш смартфон обладает большим объёмом памяти, скорее всего вы всё равно регулярно проводите там чистку, удаляя данные, которые уже не представляют большой ценности. Но так под руку может попасться не только мусор, но и что-то вполне себе ценное. Например, фотографии, которые потом гарантированно захочется восстановить. К счастью, даже если вы не опомнились сразу, возможность вернуть удалённые фото всё-таки есть.
Вы видели современные смартфоны? Ну, о чём я спрашиваю, конечно, видели. Тогда вы должны отдавать себе отчёт в том, что все они, по сути, являются одноразовыми вещицами. Стоит их случайно обронить или непроизвольно обо что-то ударить, и им придёт конец. Потому что стоимость ремонта экрана и задней панели, которые выполняются из стекла, может обойтись вам в 50-70% от розничной цены аппарата. Так что в большинстве случаев банально оказывается выгоднее просто пойти и купить новый смартфон. Хорошо, что на рынке ещё есть защищённые модели, которым не страшны бытовые повреждения.
Тяжело после айфона. Там все в одной непролазной куче, и иконки и уведомления. А как только появляется два места — всё, уже тяжело. Эх эпол, эпол, что же ты творишь с хомосапиенсами, эволюция вспять.
А по статье тост уведомления всегда были и есть, плохо когда выскакивают поверх клавиатуры.
Как можно не замечать тосты? Это абсурд!
И зачем тост уведомления в шторку помещать? Они нужны только для того чтобы донести информацию, полезную в данный момент. В шторке они будут только ненужным хламом
Как управлять уведомлениями в Android
Рассказываем, как отфильтровать информационный шум и при этом не пропустить ничего важного на устройствах с Android.
Постоянные уведомления на смартфоне не дают сосредоточиться на работе или расслабиться за любимым сериалом? Вас преследуют оповещения из соцсетей, реклама, ненужные новости? Несколько простых настроек помогут взять этот инфопоток под контроль, чтобы весь мир подождал. Рассказываем, как управлять уведомлениями в телефоне или планшете c Android.
Какие уведомления лучше оставить
Хотя мы и говорим сегодня о том, как отключить уведомления, давайте начнем с того, какие из них отключать все же не следует. Их немного, но без них есть шанс пропустить что-то важное и даже расстаться с деньгами. Вот о чем речь.
Уведомления от банковских приложений. Без них есть риск пропустить подозрительный перевод или попытку зайти в ваш личный кабинет. SMS-оповещения отключать не стоит, а вот сообщения от приложений зачастую можно выборочно заблокировать: например, убрать маркетинговые рассылки, вроде предложений оформить кредит или получить карту, и оставить подтверждения платежей и переводов и того же входа в личный кабинет.
Сообщения от цифровых магазинов. Коллекции игр и аксессуаров в Steam — заманчивая цель для мошенников, так что за такими аккаунтами тоже нужно присматривать: скажем, тоже оставить оповещения через SMS или по электронной почте, а в приложении отключить сообщения об акциях и другой «шум».
Предложения обновить операционную систему и установленные приложения. Такие апдейты часто закрывают уязвимости и защищают вас от киберпреступников.
Уведомления антивируса. Вы же не хотите пропустить сигнал о подозрительном сайте или опасном вложении в письме?
Остальной информационный шум, как правило, можно смело ставить на паузу — или полностью отключить уведомления, или сделать их беззвучными, чтобы они не отвлекали вас от того, чем вы в данный момент занимаетесь, — и вот как это сделать в смартфоне или планшете c Android.
Настраиваем уведомления на устройствах с Android
Теперь, не выпуская из виду важные оповещения, переходим к сути и начинаем отключать лишние. На самом деле способов подстроить систему под себя в Android гораздо больше, чем отключить все уведомления или часть из них: можно выбрать, хотите ли вы видеть оповещения на заблокированном экране, нужны ли вам всплывающие уведомления, хотите ли вы получать их по ночам… Решать вам.
Многие производители проектируют интерфейсы на свой лад, поэтому меню могут различаться в зависимости от устройства. Но общий принцип, как правило, не меняется.
Отключаем уведомления на Android: все и сразу
В меню настроек вашего смартфона есть отдельный пункт, который отвечает за оповещения от приложений. Логично путь к цифровому благополучию начать именно с него:
Во многих приложениях вы сможете установить гибкий режим для конкретных ситуаций — например, в мессенджерах отключить оповещения из общих каналов и разрешить их только для личных чатов.
Этот способ лучше всего использовать, если у вас установлено не очень много приложений или есть пара часов и море терпения, чтобы повозиться с параметрами. Да, настройке придется уделить некоторое время, зато результат вы получите «здесь и сейчас».
Отключаем уведомления на Android: решаем проблемы по мере поступления
У вас нет двух-трех часов на глубокое погружение в дебри настроек? Да и приложений на телефоне не пять-десять, а под сотню? Одно это может заставить годами не решать этот вопрос. Но есть альтернативный путь, морально более простой — назовем его убийством уведомлений «по горячим следам».
Когда на смартфоне прозвенит очередное оповещение, откройте «шторку», попробуйте прикоснуться к нему и подержать или плавно сдвинуть его влево/вправо/вниз (конкретное действие зависит от модели смартфона). Увидите шестеренку — нажмите на нее, чтобы перейти к настройкам оповещений такого типа, например рекламы или сводок о пробках на дорогах, для конкретного приложения.
Преимущество этого метода в том, что вам не придется сразу разбираться со всеми установленными приложениями и можно будет настроить в первую очередь те, которые вам реально мешают.
Кстати, во многих версиях Android в той же «шторке» можно отложить уведомление, чтобы не забыть о нем. Представьте, что вы общаетесь с родителями через Zoom, а телефон настойчиво просит что-то обновить. Сразу разобраться, насколько важен этот патч и какие приложения он затрагивает, не получается, но и прерывать разговор с семьей не хочется. Здесь и пригодится умение вашего телефона или планшета с Android откладывать оповещения, совсем как будильник по утрам.
Коснитесь уведомления и сдвиньте его в сторону — рядом с уже знакомой шестеренкой вы увидите иконку с часами (или колокольчиком). Нажмите на нее и выберите время, которое гаджет не будет вас отвлекать. Как только срок «тайм-аута» подойдет к концу, вы снова получите отложенное уведомление.
Переводим звонки и уведомления в беззвучный режим
Допустим, вы отключили все лишнее, но ближайшие пару часов вам очень важно провести в полной и абсолютной тишине? Блокировать важные уведомления, а потом мучительно включать их обратно, опасаясь потерять что-то важное, можно, но не нужно. Для таких случаев есть отдельный инструмент: режим Не беспокоить. В нем ваш телефон не будет подавать никакие сигналы — пока вы не вернетесь в обычный режим.
Чтобы включить режим Не беспокоить, откройте Центр уведомлений, проведя по экрану сверху вниз (реже — снизу вверх). Иконка нужной функции выглядит как дорожный знак «кирпич». Кроме того, вы можете добраться до нее через поиск в меню — все ту же строку в верхней части экрана Настроек.
В настройках режима Не беспокоить можно заблокировать все звуки и вибрацию. На всякий случай по умолчанию работает правило повторных вызовов — если в течение 15 минут кто-то попробует позвонить вам два раза подряд, о входящем звонке будет сигнализировать оповещение в шторке уведомлений (а если вы не отключаете вибрацию — то и она). Здесь же можно установить расписание, чтобы функция Не беспокоить включалась и выключалась автоматически — например, вечером и утром.
Важные оповещения можно добавить в список исключений в разделе Исключения для режима «Не беспокоить». Например, будильник находится там по умолчанию и прозвонит в любом случае. Здесь вы можете разрешить сообщать вам о вызовах от определенных контактов, напоминаниях и т. д.
Если же вы, наоборот, хотите убрать из исключений какой-либо тип оповещений, например сигнал будильника, это можно сделать в том же разделе.
Другие советы для цифрового спокойствия
Помимо общих настроек, в Android предусмотрен специальный режим концентрации внимания. Он включается в разделе Цифровое благополучие и родительский контроль. Здесь вы можете запретить приложениям присылать уведомления, а заодно и вовсе запускаться в определенные часы и дни недели.
Там же, в подразделе Панель инструментов, можно посмотреть, сколько времени вы проводите в каждом приложении и сколько уведомлений оно присылает. С этой статистикой будет проще понять, какие сервисы отвлекают вас чаще всего. Если новости, соцсети или очередная игра слишком засасывают, попробуйте ограничить время, которое будете в них проводить. Чтобы помочь вам в этом, система предложит установить специальный пароль, без которого нельзя будет запустить те или иные приложения по истечении выбранного вами срока. Разумеется, уведомления от этих сервисов приходить тоже перестанут.
Однако, если вам все же потребуется экстренно открыть «спящее» приложение, вы сможете это сделать, введя заданный вами пароль.
Мир и покой. Что дальше?
Если соцсети и другие сервисы постоянно отвлекают вас от важных дел, необязательно полностью от них отказываться. Достаточно уделить немного времени настройке, и проблема будет решена. Напоследок повторим: сообщения от антивирусов, онлайн-банков и подтверждения покупок от магазинов, а также системные уведомления глушить не следует. А как добиться еще большего цифрового комфорта, всегда можно прочитать в нашем блоге в удобное для вас время.
Android Notifications. Оповещения через Status Bar
Добрый день, хабровчане. Давно занимаюсь разработкой под Android и хотелось бы рассказать сообществу о правильном подходе к созданию уведомлений.
Ниже, помимо описанного ранее, мы рассмотрим добавление прогрессбара, обработку события по нажатию на уведомлений, различные варианты состояний уведомлений. Рассмотрим добавленный на днях в Compatibility library Notification.Builder. А также поговорим о рекомендациям по UI (design guidlines), которые гугл рекомендует соблюдать при создании уведомлений.
Guidlines
Как советуют разработчики Android в официальном гайдлайне
Когда показывать уведомления:
Когда не стоит показывать уведомления:
Хорошая практика:
Архитектура:
В качестве утилитки, отвечающей за уведомления, я в своих приложениях использую singleton, к которому можно обратиться из любого класса приложения, нужно лишь иметь ссылку на context.
В ней всегда хранятся ссылки на все созданные во время работы приложения уведомления, которые ещё отображены в статус-баре.
А для присвоения новому уведомлению уникального id используется нехитрый механизм обращения к приватному целочисленному полю, которое каждый раз увеличивается на единицу.
private static NotificationUtils instance;
private static Context context;
private NotificationManager manager; // Системная утилита, упарляющая уведомлениями
private int lastId = 0; //постоянно увеличивающееся поле, уникальный номер каждого уведомления
private HashMap notifications; //массив ключ-значение на все отображаемые пользователю уведомления
Создание уведомления с помощью NotificationCompat.Builder:
Для того чтобы воспользоваться классами, входящими в библиотеку поддержки прошлых версий (Compatibility library), нужно добавить в проект библиотеку из папки /extras/android/support/v4/android-support-v4.jar
Если же проект нацелен на Android 3.0 и выше, то добавлять ничего не нужно достаточно обратиться к Notification.Builder
public int createInfoNotification( String message) <
Intent notificationIntent = new Intent(context, HomeActivity. class ); // по клику на уведомлении откроется HomeActivity
NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
//NotificationCompat.Builder nb = new NotificationBuilder(context) //для версии Android > 3.0
.setSmallIcon(R.drawable.ic_action_picture) //иконка уведомления
.setAutoCancel( true ) //уведомление закроется по клику на него
.setTicker(message) //текст, который отобразится вверху статус-бара при создании уведомления
.setContentText(message) // Основной текст уведомления
.setContentIntent(PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT))
.setWhen(System.currentTimeMillis()) //отображаемое время уведомления
.setContentTitle( «AppName» ) //заголовок уведомления
.setDefaults(Notification.DEFAULT_ALL); // звук, вибро и диодный индикатор выставляются по умолчанию
Notification notification = nb.getNotification(); //генерируем уведомление
manager.notify(lastId, notification); // отображаем его пользователю.
notifications.put(lastId, notification); //теперь мы можем обращаться к нему по id
return lastId++;
>
Создание уведомления с произвольным отображением (Custom layout):
/**
* генерация уведомления с ProgressBar, иконкой и заголовком
*
* @param text заголовок уведомления
* @param topMessage сообщение, уотображаемое в закрытом статус-баре при появлении уведомления
* @return View уведомления.
*/
private RemoteViews createProgressNotification( String text, String topMessage) <
Notification notification = new Notification(R.drawable.ic_stat_example, topMessage, System.currentTimeMillis());
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_download_layout);
contentView.setProgressBar(R.id.notification_download_layout_progressbar, 100, 0, false );
contentView.setTextViewText(R.id.notification_download_layout_title, text);
notification.contentView = contentView;
notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT | Notification.FLAG_ONLY_ALERT_ONCE;
Intent notificationIntent = new Intent(context, NotificationUtils. class );
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;
manager.notify(lastId, notification);
notifications.put(lastId, notification);
return contentView;
>
LinearLayout
android:layout_width =»fill_parent»
android:layout_height =»wrap_content»
android:orientation =»horizontal» >
ImageView
android:id =»@+id/notification_download_layout_image»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:src =»@drawable/ic_stat_example»
android:layout_gravity =»center_vertical» />
TextView
android:id =»@+id/notification_download_layout_title»
style =»@style/NotificationTitle»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:layout_alignParentTop =»true»
android:layout_marginLeft =»10dip»
android:singleLine =»true»
android:text =»notification_download_layout_title»
android:layout_gravity =»center_vertical» />
LinearLayout >
ProgressBar
android:id =»@+id/notification_download_layout_progressbar»
style =»?android:attr/progressBarStyleHorizontal»
android:layout_width =»fill_parent»
android:layout_height =»wrap_content»
android:layout_marginTop =»4dp»
android:progress =»0″ />
в андроид 2.3 и выше ( API >10) был создан специальный ресурс, в котором системная тема указывает цвета текста уведомений. Из-за этого в старых версиях приходится использовать костыль:
В файл res/values/styles.xml прописываем:
А для поддержки API >10 Создаем файл res/values-v9/styles.xml и вписываем:
Теперь из кода нашего приложения обращаемся к утилите:
NotificationUtils n = NotificationUtils.getInstance(getActivity());
n.createInfoNotification( «info notification» );
Создаем уведомление с прогресс-баром:
int pbId = NotificationUtils.getInstance(getActivity()).createDownloadNotification( «downloading video» );
И во время выполнения потока постоянно обновляем прогресс вызовом:
В итоге получаем:
Как видно — нижнее уведомление, созданное нами при помощи билдера может быть удалено в любой момент. А уведомление с прогресс-баром размещается в верхнем блоке уведомлений, в котором пользователь не может очистить уведомления.
И напоследок маленькая хитрость:
Если не хотите дублирования в стеке одних и тех же Activity — поставьте в манифесте к нужной activity
android:launchMode=»singleTop»
Уведомления
Вступление
Кроме 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).
Вы можете программно запустить раздел с разрешением на использование службы.