Перейти к содержимому

Notifications android что это

  • автор:

Уведомления

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

Далее пользователь должен сдвинуть строку состояния экрана, чтобы увидеть расширенную информацию об уведомлении — текст, картинку. Также можно прямо в уведомлении сделать какое-то действие — написать ответ, поставить на паузу музыку и т.п. Для привлечения внимания к уведомлению можно подключить звук и вибрацию.

Уведомление может висеть в строке состояние сколь угодно долго, пока сам пока пользователь не отреагирует на него, в отличие от Toast-сообщения, которое исчезнет через несколько секунд. В Android 5.0 добавилась возможность выводить уведомление в виде отдельного небольшого всплывающего окна (если устройство не заблокировано). В особых случаях уведомление можно выводить и на экран блокировки.

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

Обратите внимание, что в имени класса спрятан кот (Notification), что намекает на целевое использование уведомлений. Уведомляйте пользователя только о самом важном, например, что пора кормить кота.

Cat

Когда пользователь открывает расширенное сообщение, Android запускает объект Intent, который определён в соответствии с уведомлением. Можно также конфигурировать уведомление с добавлением звука, вибрации и мигающих индикаторов на мобильном устройстве.

Этот вид уведомления удобен в том случае, когда приложение работает в фоновом режиме и должно уведомить пользователя о каком-либо важном событии. Фоновое приложение создаёт уведомление в строке состояния, но не запускает активность самостоятельно для получения пользовательского взаимодействия. Это должен сделать только сам пользователь в удобное ему время.

Чтобы создать уведомление в строке состояния, необходимо использовать два класса:

  • Notification — определяем свойства уведомления строки состояния: значок, расширенное сообщение и дополнительные параметры настройки (звук и др.)
  • NotificationManager — системный сервис Android, который управляет всеми уведомлениями. Экземпляр NotificationManager создаётся при помощи вызова метода from(), а затем, когда надо показать уведомление пользователю, вызывается метод notify()

В большинстве случаев вместо Notification мы будем использовать рекомендованный NotificationCompat из AndroidX.

 dependencies

Подключать эту библиотеку нет надобности, если у вас уже используется любая библиотека из AndroidX. Скорее всего оно так и есть, в проекте по умолчанию используется androidx.appcompat:appcompat, но номера версий могут отличаться, поэтому можно добавить зависимость для страховки.

Показываем уведомление

Добавим на экран активности кнопку и напишем для демонстрации работы уведомления.

Для начала вам надо создать идентификатор уведомления. Он нужен, чтобы можно было различать уведомления друг от друга. Ведь вы можете создать идеальное приложение, которое уведомляло бы хозяина, что кота надо покормить (первое уведомление), погладить (второе уведомление), почистить лоток (третье уведомление). Если у вас будет один идентификатор, то каждое новое уведомление затрёт предыдущее и хозяин не увидит свои недоработки. Это не дело. Для идентификатора используйте какое-нибудь число. Только не надо оригинальничать, ничего не имею против числа 836, но вам определённо нужно сходить к психологу.

Также следует создать идентификатор канала. Каналы появились в API 26, но старые устройства будут просто игнорировать данный параметр при вызове конструктора NotificationCompat.Builder.

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

Выводится уведомление с помощью метода notify() — своеобразный аналог метода show() у Toast из предыдущего урока.

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

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

   // Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. package ru.alexanderklimov.notification import android.os.Bundle import android.widget.Button import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat class MainActivity : AppCompatActivity() < companion object < const val NOTIFICATION_ID = 101 const val CHANNEL_ID = "channelID" >@SuppressLint("MissingPermission") override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button: Button = findViewById(R.id.button) button.setOnClickListener < // Создаём уведомление val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_action_cat_24dp) .setContentTitle("Напоминание") .setContentText("Пора покормить кота") .setAutoCancel(true) .setPriority(NotificationCompat.PRIORITY_DEFAULT) val notificationManager = NotificationManagerCompat.from(this) notificationManager.notify(NOTIFICATION_ID, builder.build()) // или //with(NotificationManagerCompat.from(this)) < // notify(NOTIFICATION_ID, builder.build()) // посылаем уведомление //>> > > 
package ru.alexanderklimov.notification; import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; public class MainActivity extends AppCompatActivity < // Идентификатор уведомления private static final int NOTIFY_ID = 101; // Идентификатор канала private static String CHANNEL_ID = "Cat channel"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentTitle("Напоминание") .setContentText("Пора покормить кота") .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build()); >>); > >

Запустим пример и нажмём кнопку. В строке состояния появится значок. Раскроем уведомление и увидим текст. Уведомление можно смахнуть в сторону для удаления.

Notification

Notification

Затем можете снова нажать кнопку и создать новое уведомление. Покормили кота, снова удалили уведомление. А можете нажать несколько раз, но уведомление будет только одно. Так что, если кот научится нажимать кнопки, то не сможет создать бесконечную ленту уведомлений.

Реакция на уведомления

Нажатие на уведомление ни к чему не приведёт. Нужен дополнительный код.

Создадим новые объекты Intent и PendingIntent, которые описывают намерения и целевые действия. В нашем случае мы хотим запустить нашу активность, когда пользователь среагирует на уведомление. Присоединяем объекты через setContentIntent().

   override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val intent = Intent(this, MainActivity::class.java) intent.apply < flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK >val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0) val button: Button = findViewById(R.id.button) button.setOnClickListener < val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_24dp) .setContentTitle("Напоминание") .setContentText("Пора покормить кота") .setAutoCancel(true) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) with(NotificationManagerCompat.from(this)) < notify(notificationId, builder.build()) // посылаем уведомление >> > 
button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < Intent notificationIntent = new Intent(MainActivity.this, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentTitle("Напоминание") .setContentText("Пора покормить кота") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(contentIntent); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build()); > >);

Теперь можно создать уведомление и затем закрыть приложение. Если нажать на уведомление, оно откроет заново ваше приложение.

Сделаем уведомление более красивым, добавив другие необязательные настройки.

 NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentTitle("Напоминание") .setContentText("Пора покормить кота") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(contentIntent) // необязательные настройки .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.hungrycat)) // большая картинка .setTicker("Последнее китайское предупреждение!") // до Lollipop .setAutoCancel(true); // автоматически закрыть уведомление после нажатия 

Теперь в уведомлении мы видим картинку. Метод setTicker() выводит сообщение в строке состояния на короткое время, а затем исчезает. Это работает только на старых устройствах и сейчас можно уже не использовать.

Notification

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

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

 // Kotlin // Объявим переменную в начале класса private var counter = 101 // Теперь у уведомлений будут новые идентификаторы notify(counter++, builder.build()); 
// Java // Объявим переменную в начале класса private int counter = 101; // Теперь у уведомлений будут новые идентификаторы notificationManager.notify(counter++, builder.build());

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

Совсем не обязательно запускать своё приложение, хотя это является распространённой практикой. Можете задать нужное поведение, например, запустить свой сайт по указанному адресу. Переделаем код:

 // Kotlin val link = "http://developer.alexanderklimov.ru/android/" val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) val pendingIntent = PendingIntent.getActivity(this, 0, webIntent, 0) val button: Button = findViewById(R.id.button) button.setOnClickListener < val builder = NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_action_cat) .setContentTitle("Посетите мой сайт") .setContentText(link) .setContentIntent(pendingIntent) .setDefaults(Notification.DEFAULT_SOUND) .setAutoCancel(true) with(NotificationManagerCompat.from(this)) < notify(NOTIFICATION_ID, builder.build()) >> 
// Java // код для webIntent напишите самостоятельно NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setContentTitle("Посетите мой сайт") .setContentText("http://developer.alexanderklimov.ru/android/") .setContentIntent(pendingIntent) .setDefaults(Notification.DEFAULT_SOUND) .setAutoCancel(true) .setSmallIcon(R.mipmap.ic_launcher); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build());

Можно вывести индикатор прогресса, чтобы указать текущий ход выполнения задачи. Можно установить бесконечное выполнение:

 .setProgress(100, 50, false) 

Удаление собственных уведомлений

Вы можете из программы удалить своё уведомление, посланное по глупости (не вздумайте удалять уведомления про кормёжку кота!).

 // Удаляем конкретное уведомление notificationManager.cancel(NOTIFY_ID); // Удаляем все свои уведомления notificationManager.cancelAll(); 

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

Использование настроек по умолчанию

Можно добавить вибрацию, звуковой сигнал или мерцание светодиодами для ваших уведомлений при помощи настроек по умолчанию. В свойстве defaults вы можете сочетать следующие константы:

  • Notification.DEFAULT_LIGHTS
  • Notification.DEFAULT_SOUND
  • Notification.DEFAULT_VIBRATE

Чтобы к уведомлению добавить звук и вибрации по умолчанию, используйте код:

 // Kotlin .setDefaults(Notification.DEFAULT_SOUND and Notification.DEFAULT_VIBRATE) 
// Java notification.defaults = Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE;

Если хотите установить сразу все значения по умолчанию, задействуйте константу Notification.DEFAULT_ALL.

Звуковое сопровождение

Использование звуковых оповещений для уведомления пользователя о событиях, связанных с устройством (например, входящий звонок), стало привычным. Большинство стандартных событий, от входящих звонков до новых сообщений и низкого заряда батареи, объявляются с помощью звуковых мелодий. Android позволяет проигрывать любой звуковой файл на телефоне в качестве уведомления. Чтобы это сделать, нужно присвоить свойству sound путь URI:

 notification.sound = ringURI; 

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

 Uri ringURI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); notification.sound = ringURI; 
 notification.sound = Uri.parse("file:///sdcard/cat.mp3"); // если знаем точный путь! 

Виброзвонок

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

Чтобы использовать виброзвонок, передайте в свойство vibrate объекта Notification массив значений типа long. Постройте массив, учитывая, что значения, отвечающие за продолжительность вибрации (в миллисекундах), чередуются со значениями, которые означают длину паузы между вибрациями.

Прежде чем использовать виброзвонок в своем приложении, необходимо получить нужные полномочия, прописав их в манифесте:

В следующем примере показано, как изменить уведомление, чтобы одна секунда вибрации сменялась одной секундой паузы на протяжении пяти секунд:

 long[] vibrate = new long[] < 1000, 1000, 1000, 1000, 1000 >; notification.vibrate = vibrate; 

В настоящее время эмулятор Android не умеет оповещать о вибрации ни визуально, ни с помощью звуковых сигналов.

Светодиодная индикация

Объект Notification включает в себя свойства для настройки цвета и частоты мерцания светодиодов устройства. Здесь стоит обратить внимание, что конкретные модели устройств могут не содержать светодиодные индикаторы или иметь другие цвета.

Свойство ledARGB может устанавливать цвет для светодиодной подсветки. Свойства ledOffMS и ledOnMS позволяют регулировать частоту и поведение светодиодов. Вы можете включить светодиоды, присвоив свойству ledOnMS значение 1, а ledOffMS – 0. Присвоив им обоим значения 0, светодиоды можно выключить.

Настроив работу со светодиодами, необходимо также добавить флаг FLAG_SHOW_LIGHTS к свойству flags объекта Notification.

В следующем фрагменте кода показано, как включить на устройстве красный светодиод:

 notification.ledARGB = Color.RED; notification.ledOffMS = 0; notification.ledOnMS = 1; notification.flags = notification.flags | Notification.FLAG_SHOW_LIGHTS; 

В настоящее время эмулятор Android не умеет визуально показывать активность светодиодов.

Текущие и настойчивые уведомления

Вы можете делать уведомления текущими и/или настойчивыми, устанавливая флаги FLAG_INSISTENT и FLAG_ONGOING_EVENT. Уведомления, помеченные как текущие, используются для представления событий, которые выполняются в данный момент времени (например, загрузка файла, фоновое проигрывание музыки). Текущие уведомления необходимы для сервисов, работающих на переднем плане. Пример установки флагов:

 notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT; 

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

Настойчивые уведомления непрерывно повторяют звуковые сигналы, вибрируют и мерцают светодиодами, пока не будут остановлены. Подобные уведомления, как правило, используются для событий, которые требуют немедленного и своевременного внимания, таких как входящий звонок, срабатывание будильника или время кормёжки кота. В следующем фрагменте кода показано, как сделать уведомление настойчивым:

 notification.flags = notification.flags | Notification.FLAG_INSISTENT; 

В методе getActivity() может понадобиться изменить флаг, например.

 PendingIntent pendingIntent = PendingIntent.getActivity( context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); 

Существуют и другие флаги. Хотя в большинстве случаев используется просто 0.

В Android 5.0 пользователь может установить собственный уровень оповещений, нажав на кнопки увеличения громкости на домашнем экране. Появится диалоговое окно, в котором задаётся один из трёх доступных уровней.

Уровень оповещений

Запустить запущенную активность

Не сразу бывает заметно, но на самом деле, когда при нажатии на уведомлении у вас запускается активность, то запускается не старая активность, которая была на экране до этого, а новая. Это можно увидеть в примере, если, например, есть текстовое поле с текстом. Введите какой-нибудь текст в активности, а потом создайте уведомление, вызывающее активность. Вы увидите, что запустится новая активность с пустыми текстовым полем, хотя мы ожидали увидеть запущенную активность. Если вам нужен именно этот вариант, то используйте флаги для намерения.

 Intent intent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

Либо вы можете прописать в манифесте для нужной активности атрибут android:launchMode=»singleTop».

Меняем цвет значка

По умолчанию, значок выводится в сером круге. Вы можете изменить цвет круга, вызвав новый метод setColor(), который появился в API 21:

 NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) . .setColor(Color.GREEN) .build(); 

Анимированный значок для уведомления

Покажу один фокус. Возьмём код из примера и заменим одну строчку, которая отвечает за вывод маленького значка — .setSmallIcon(android.R.drawable.stat_sys_upload):

 NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(android.R.drawable.stat_sys_upload) . // другой код .setAutoCancel(true); // автоматически закрыть уведомление после нажатия 

Запускаем код и создаём уведомление. Вы увидите, что в строке состояния выводится анимированный значок стрелки. Такой способ стоит использовать для действительно важных сообщений, чтобы понапрасну не раздражать пользователя.

Анимированный значок для уведомлений

Возможно, если вы опустите метод setTicker(), то значок уже не будет анимированным, где-то работало, где-то нет. Проверяйте самостоятельно.

Вы можете попробовать поискать другие системные анимации, например, android.R.drawable.stat_sys_download или создать собственную анимацию.

На странице http://forum.xda-developers.com/showthread.php?t=1088677 энтузиасты выложили несколько готовых примеров анимации, которые можно скачать.

Расширенные возможности уведомлений

В Android 4.1 Jelly Bean появились дополнительные возможности для уведомлений через настройку стилей.

Добавьте на экран четыре кнопки.

Уведомление с тремя кнопками

Начнём с первого варианта. Теперь в уведомлениях можно размещать до трёх кнопок. Это может быть удобным, если приложение состоит из нескольких активностей или нужно предложить три разных варианта развития сценария. За появление кнопок в уведомлении отвечает метод setAction().

 Intent notificationIntent = new Intent(MainActivity.this, SecondActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentTitle("Посылка") .setContentText("Это я, почтальон Печкин. Принес для вас посылку") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.hungrycat)) // большая картинка .addAction(R.drawable.ic_lock_open_black_24dp, "Открыть", pendingIntent) .addAction(R.drawable.ic_refresh_white_24dp, "Отказаться", pendingIntent) .addAction(R.drawable.ic_pets_black_24dp, "Другой вариант", pendingIntent) .setAutoCancel(true); // автоматически закрыть уведомление после нажатия NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build()); 

setAction()

Обратите внимание, что у кнопок текст может обрезаться и пользователь не увидит текст, поэтому вам следует придумать «говорящие» значки, по которым будет понятен смысл нажатия. В нашем примере при нажатии на любой из трёх кнопок запустится вторая активность.

На некоторых устройствах можно увидеть уведомление без значков и с текстом. Также были варианты, когда выводились только значки.

setAction()

Уведомление с длинным текстом. BigTextStyle().bigText()

Если вы внимательно смотрели на уведомление, то могли увидеть, что длинный текст, помещённый в метод setContentText(), вывелся на экран не полностью. Если информация слишком важная и вам хочется её показать в уведомлении полностью, то подойдёт вариант со стилем BigTextStyle:

 // Kotlin .setStyle(NotificationCompat.BigTextStyle() .bigText("Когда кормить будут? Далее идёт очень длинный текст про бедного котика, которого морят голодом уже целых три минуты")) 
// Java Intent notificationIntent = new Intent(MainActivity.this, SecondActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); String bigText = "Это я, почтальон Печкин. Принёс для вас посылку. " + "Только я вам её не отдам. Потому что у вас документов нету. "; NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentTitle("Посылка") .setContentText("Это я, почтальон Печкин. Принес для вас посылку") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.hungrycat)) // большая картинка .addAction(R.drawable.ic_pets_black_24dp, "Запустить активность", pendingIntent) .setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)) .setAutoCancel(true); // автоматически закрыть уведомление после нажатия NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build());

BigTextStyle

Уведомление с большой картинкой: BigPictureStyle().bigPicture()

Пример с большой картинкой аналогичен с предыдущим примером. Только мы задаём уже другой стиль для уведомления. Вместо стиля длинного текста используется стиль BigPictureStyle().bigPicture():

 // Kotlin .setStyle( NotificationCompat.BigPictureStyle() .bigPicture(BitmapFactory.decodeResource(resources,R.drawable.hungrycat)) .bigLargeIcon(BitmapFactory.decodeResource(resources,R.drawable.table_cat)) .setBigContentTitle("Beautiful Cat") .setSummaryText("Голодный кот") ) 
// Java Intent notificationIntent = new Intent(MainActivity.this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentTitle("Посылка") .setContentText("Это я, почтальон Печкин. Принёс для вас посылку") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.hungrycat)) // большая картинка .addAction(R.drawable.ic_pets_black_24dp, "Запустить активность", pendingIntent) // большая картинка из ресурсов .setStyle(new NotificationCompat.BigPictureStyle() .bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.hungrycat))) .setAutoCancel(true); // автоматически закрыть уведомление после нажатия NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build());

BigPictureStyle

Слишком большая картинка будет обрезана.

Уведомление в стиле InboxStyle

Есть ещё один стиль InboxStyle, напоминающий стиль писем в папке Входящие. Стиль разместит до пяти ваших строк в виде списка. Весь код приводить не буду, меняется только вызов setStyle()

 // Kotlin .setStyle( NotificationCompat.InboxStyle() .addLine("This is first line") .addLine("This is second line") .addLine("This is third line") .addLine("This is fourth line") .addLine("This is fifth line") .setBigContentTitle("This is Content Title.") .setSummaryText("This is summary text.") ) 
// Java . .setStyle(new NotificationCompat.InboxStyle() .addLine("Первое сообщение").addLine("Второе сообщение") .addLine("Третье сообщение").addLine("Четвертое сообщение") .setSummaryText("+2 more"))

InboxStyle

Уведомление в стиле мессенджера: MessagingStyle

Стиль MessagingStyle пригодится для отображения сообщений из мессенджера или чата. Появился в Android Nougat.

 // Kotlin button.setOnClickListener < val sender = Person.Builder() .setName("Мурзик") //.setIcon(. ) // можно добавить значок .build() val messagingStyle = NotificationCompat.MessagingStyle(sender) .addMessage("Хозяин, когда кормить будут?", Date().time, sender) val builder = NotificationCompat.Builder(this, "Cat channel") .setSmallIcon(R.drawable.ic_pets_black_24dp) .setStyle(messagingStyle) val channel = NotificationChannel("Cat channel", "channel", NotificationManager .IMPORTANCE_DEFAULT).apply < description = "Feed cat" >with(NotificationManagerCompat.from(this)) < createNotificationChannel(channel) notify(notificationId, builder.build()) >> 
// Java Intent notificationIntent = new Intent(MainActivity.this, SecondActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); Person murzik = new Person.Builder().setName("Мурзик").build(); Person vaska = new Person.Builder().setName("Васька").build(); NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle (murzik) .setConversationTitle("Android chat") .addMessage("Привет котаны!", System.currentTimeMillis(), murzik) .addMessage("А вы знали, что chat по-французски кошка?", System .currentTimeMillis(), murzik) .addMessage("Круто!", System.currentTimeMillis(), vaska) .addMessage("Ми-ми-ми", System.currentTimeMillis(), vaska) .addMessage("Мурзик, откуда ты знаешь французский?", System.currentTimeMillis(), vaska) .addMessage("Шерше ля фам, т.е. ищите кошечку!", System.currentTimeMillis(), murzik); NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pets_black_24dp) .setContentIntent(pendingIntent) .addAction(R.drawable.ic_pets_black_24dp, "Запустить активность", pendingIntent) .setStyle(messagingStyle) .setAutoCancel(true); // автоматически закрыть уведомление после нажатия NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this); notificationManager.notify(NOTIFY_ID, builder.build());

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

У класса Person есть другие полезные методы: setIcon() (значок), setData() (картинки) и др.

В setConversationTitle() указываем название беседы, удобно при разговоре двух и более котов. В поздних версиях не имеет эффекта, можно убрать.

Разговор строится через цепочку вызовов методов addMessage(), в которых указывается текст сообщения, время, отправитель. Количество сообщений может быть любым. При большом количестве (задано в MessagingStyle.MAXIMUM_RETAINED_MESSAGES) старые сообщения начнут удаляться автоматически.

MessagingStyle

Подводя итоги, следует отметить, у уведомлений очень много методов, которые можно использовать в своём приложении. Вот как может выглядеть полный набор:

 new Notification.Builder(this.getApplicationContext()) .setAutoCancel(boolean autoCancel) .setContent(RemoteViews views) .setContentInfo(CharSequence info) .setContentIntent(PendingIntent intent) .setContentText(CharSequence text) .setContentTitle(CharSequence title) .setDefaults(int defaults) .setDeleteIntent(PendingIntent intent)) .setFullScreenIntent(PendingIntent intent, boolean highPriority) .setLargeIcon(Bitmap icon) .setLights(int argb, int onMs, int offMs) .setNumber(int number) .setOngoing(boolean ongoing) .setOnlyAlertOnce(boolean onlyAlertOnce) .setPriority(int pri) .setProgress(int max, int progress, boolean indeterminate) .setShowWhen(boolean show) .setSmallIcon(int icon, int level) .setSmallIcon(int icon) .setSound(Uri sound) .setSound(Uri sound, int streamType) .setStyle(Notification.Style style) .setSubText(CharSequence text) .setTicker(CharSequence tickerText, RemoteViews views) .setTicker(CharSequence tickerText) .setUsesChronometer(boolean b) .setVibrate(long[] pattern) .setWhen(long when) .addAction(int icon, CharSequence title, PendingIntent intent) .build() 
  • setSmallIcon() устанавливает маленький значок, который выводится в строке состояния, а также в правой части открытого уведомления.
  • setLargeIcon() устанавливает большой значок, который выводится в открытом уведомлении слева.
  • setWhen() определяет время для уведомления, по умолчанию время создания уведомления
  • setTicker() выводит временную строку в строке состояния, которая затем исчезает. Остаётся только маленький значок (см. выше)
  • setNumber() добавляет число справа от уведомления (не везде работает)
  • setShowWhen() — показывать ли время в уведомлении (в Android 7.0 по умолчанию не показывается)
  • setUsesChronometer() выводит счётчик вместо времени, показывающий сколько прошло от времени when. Полезно для уведомления секундомера или звонка
  • setContentInfo() добавляет текст справа от уведомления (в новых версиях сверху)
  • setColor() закрашивает значок и название приложения указанным цветом
  • setOngoing() выводит уведомление поверх обычных уведомлений, такое уведомление нельзя закрыть или смахнуть.
  • setVibrate() — виброзвонок
  • setSound() — звук
  • setLights() — цвет LED-индикатора
  • setPriority() устанавливает приоритет от -2 (NotificationCompat.PRIORITY_MIN) до 2 (NotificationCompat.PRIORITY_MAX)
  • setTimeoutAfter() (появилось в API 26) — устанавливает таймаут, после которого уведомление удалится
  • setProgress() — индикатор прогресса

Приоритет

Не все уведомления одинаковы важны. Например, напоминание о том, что пора кормить кота — это сверхважное сообщение (не обсуждается). Угроза землетрясения, цунами, урагана — тоже очень важные сообщения. Новые версии программы, новое письмо и т.д. — не слишком важные уведомления, которые можно почитать после того, как покормили кота.

В API 16 появился новый метод setPriority() с константами по мере увеличения: NotificationCompat.PRIORITY_MIN, NotificationCompat.PRIORITY_LOW, NotificationCompat.PRIORITY_DEFAULT, NotificationCompat.PRIORITY_HIGH, NotificationCompat.PRIORITY_MAX.

 . .setPriority(NotificationCompat.PRIORITY_HIGH) . .build(); 

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

В Android 5.0 произошли небольшие изменения в поведении. Если установлены максимальные приоритеты Notification.PRIORITY_HIGH или Notification.MAX, то при вызове сначала уведомление появится в виде плавающего окна в верхней части экрана, а только потом закроется и останется в виде стандартного уведомления в строке состояния.

В Android 8.0 вместо приоритетов стали использовать важность — IMPORTANCE_XXX.

Напоследок дам совет — читайте документацию. Google постоянно вносит какие-то изменения и добавления. Практически в каждой новой версии Android что-то менялось. Я не в состоянии отслеживать новинки и оперативно добавлять в статью.

Пример изменений, которые произошли в API 23:

  • Удалили метод setLatestEventInfo()
  • Добавили новые методы getLargeIcon() и getSmallIcon()
  • Добавили новое поле класса CATEGORY_REMINDER и объявили устаревшими поля icon и largeIcon.

В уведомлениях можно использовать собственный макет, используя RemoteViews. Для стилизации макета изучите классы DecoratedCustomViewStyle и DecoratedMediaCustomViewStyle. Подключается через метод setCustomContentView().

 RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_custom_view); remoteViews.setImageViewResource(R.id.image_icon, iconResource); remoteViews.setTextViewText(R.id.text_title, title); remoteViews.setTextViewText(R.id.text_message, message); remoteViews.setImageViewResource(R.id.image_end, imageResource); Notification.Builder builder = new Notification.Builder(context) .setSmallIcon(R.drawable.ic_phonelink_ring_primary_24dp) .setCustomContentView(remoteViews) .setStyle(new Notification.DecoratedCustomViewStyle()); .setAutoCancel(true); 

В уведомлениях появилась возможность вводить собственный текст для ответа на какое-то сообщение. Для этого используется механизм Direct Reply, который использует RemoteInput API.

NotificationListenerService. Прослушка уведомлений

В API 18 (Android 4.3) появился новый класс NotificationListenerService, позволяющий следить за уведомлениями. С тех пор я не следил за этой темой. Материал был написан по горячим следам в 2015 году. Если не работает, то разбирайтесь самостоятельно.

Новый класс является службой, которая получает сигналы от системы, когда появляются или удаляются уведомления. Таким образом вы можете отслеживать не только свои уведомления (они и так вам известны), но и уведомления от других приложений. Это может быть полезным для каких-то расширений к приложениям.

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

У службы есть два метода onNotificationPosted() и onNotificationRemoved() с параметром StatusBarNotification, который содержит полезные методы об уведомлении.

Пользователь должен явно разрешить приложению следить за уведомлениями через Настройки | Безопасность. Если на устройстве нет приложений, которые следят за уведомлениями, то в настройках вы не увидите никаких пунктов о разрешении. Когда вы создадите такое приложение, то там появится новый пункт Доступ к уведомлениям.

NotificationListenerService

Щёлкнув на нём, вы попадёте на страницу со списком программ, желающих следить за уведомлениями. Поставим флажок у своей программы.

NotificationListenerService

NotificationListenerService

После этого в настройках будет указано число приложений, имеющих соответствующее разрешение.

NotificationListenerService

Перейдём к практической части. Подготовим разметку из нескольких кнопок и текстовой метки для вывода информации.

Создадим новую службу.

 package ru.alexanderklimov.testapplication; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.util.Log; public class NLService extends NotificationListenerService < private String TAG = this.getClass().getSimpleName(); private NLServiceReceiver mReceiver; @Override public void onCreate() < super.onCreate(); mReceiver = new NLServiceReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("ru.alexanderklimov.NOTIFICATION_LISTENER_SERVICE_EXAMPLE"); registerReceiver(mReceiver, filter); >@Override public void onDestroy() < super.onDestroy(); unregisterReceiver(mReceiver); >@Override public void onNotificationPosted(StatusBarNotification sbn) < Log.i(TAG, "onNotificationPosted"); Log.i(TAG, "ID :" + sbn.getId() + "\\t" + sbn.getNotification().tickerText + "\\t" + sbn.getPackageName()); Intent intent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_EXAMPLE"); intent.putExtra("notification_event", "onNotificationPosted:\\n" + sbn.getPackageName() + "\\n"); sendBroadcast(intent); >@Override public void onNotificationRemoved(StatusBarNotification sbn) < Log.i(TAG, "onNOtificationRemoved"); Log.i(TAG, "ID :" + sbn.getId() + "\\t" + sbn.getNotification().tickerText + "\\t" + sbn.getPackageName()); Intent intent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_EXAMPLE"); intent.putExtra("notification_event", "onNotificationRemoved:\\n" + sbn.getPackageName() + "\\n"); sendBroadcast(intent); >class NLServiceReceiver extends BroadcastReceiver < @Override public void onReceive(Context context, Intent intent) < if (intent.getStringExtra("command").equals("clearall")) < NLService.this.cancelAllNotifications(); >else if (intent.getStringExtra("command").equals("list")) < Intent notificationIntent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_EXAMPLE"); notificationIntent.putExtra("notification_event", "======="); sendBroadcast(notificationIntent); int i = 1; for (StatusBarNotification sbn : NLService.this.getActiveNotifications()) < Intent infoIntent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_EXAMPLE"); infoIntent.putExtra("notification_event", i + " " + sbn.getPackageName() + "\\n"); sendBroadcast(infoIntent); i++; >Intent listIntent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_EXAMPLE"); listIntent.putExtra("notification_event", "Notification List"); sendBroadcast(listIntent); > > > > 

В манифесте добавляем новый блок.

 package ru.alexanderklimov.testapplication; import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.widget.TextView; public class MainActivity extends ActionBarActivity < private TextView mInfoTextView; private NotificationBroadcastReceiver mReceiver; public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("NotificationListenerService Demo"); mInfoTextView = (TextView) findViewById(R.id.textView); mReceiver = new NotificationBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("ru.alexanderklimov.NOTIFICATION_LISTENER_EXAMPLE"); registerReceiver(mReceiver, filter); >@Override protected void onDestroy() < super.onDestroy(); unregisterReceiver(mReceiver); >public void onButtonClicked(View view) < if(view.getId() == R.id.buttonCreateNotification)< NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle("Важное уведомление"); builder.setContentText("Пора кормить кота!"); builder.setTicker("Хозяин, проснись!"); builder.setSmallIcon(R.drawable.ic_launcher); builder.setAutoCancel(true); manager.notify((int) System.currentTimeMillis(), builder.build()); >else if(view.getId() == R.id.buttonClearNotification) < Intent intent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_SERVICE_EXAMPLE"); intent.putExtra("command", "clearall"); sendBroadcast(intent); >else if(view.getId() == R.id.buttonListNotification) < Intent intent = new Intent("ru.alexanderklimov.NOTIFICATION_LISTENER_SERVICE_EXAMPLE"); intent.putExtra("command", "list"); sendBroadcast(intent); >> class NotificationBroadcastReceiver extends BroadcastReceiver < @Override public void onReceive(Context context, Intent intent) < String temp = intent.getStringExtra("notification_event") + "\\n" + mInfoTextView.getText(); mInfoTextView.setText(temp); >> > 

Первая кнопка запускает уведомление, чтобы увидеть, что приложение работает. Если вы хотите увидеть, как приложение следит за другими уведомлениями, то запустите Play Market и скачайте какую-нибудь игру или программу. Во время скачивания и установки генерируются уведомления. На следующем скриншоте видны уведомления от приложения Загрузки во время скачивания (com.android.providers.downloads) и от процесса установки (com.android.vending).

NotificationListenerService

Если вы помните, в предупреждающем сообщении говорилось о возможности удалять уведомления. Третья кнопка позволяет это сделать. Вот почему эта настройка относится к разделу безопасности — ваша программа может удалять поступающие уведомления без ведома владельца устройства.

Вы можете программно запустить раздел с разрешением на использование службы.

 // API 22 Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null)

В API 19 появился более широкий доступ к элементам уведомления. Поэтому через метод sbn.getNotification() вы можете получить объект класса Notification и вытащить из него картинки (Large Icon), текст и т.д.

 Notification mNotification=sbn.getNotification(); Bundle extras = mNotification.extras; String notificationTitle = extras.getString(Notification.EXTRA_TITLE); int notificationIcon = extras.getInt(Notification.EXTRA_SMALL_ICON); Bitmap notificationLargeIcon = ((Bitmap) extras.getParcelable(Notification.EXTRA_LARGE_ICON)); CharSequence notificationText = extras.getCharSequence(Notification.EXTRA_TEXT); CharSequence notificationSubText = extras.getCharSequence(Notification.EXTRA_SUB_TEXT); 

Локальные уведомления в Android

В этом разделе показано, как реализовать локальные уведомления в Xamarin.Android. В ней описываются различные элементы пользовательского интерфейса уведомления Android, а также описываются api, связанные с созданием и отображением уведомления.

Общие сведения о локальных уведомлениях

Android предоставляет две области, управляемые системой, для отображения значков уведомлений и сведений об уведомлениях для пользователя. При первой публикации уведомления его значок отображается в области уведомлений, как показано на следующем снимке экрана:

Пример области уведомлений на устройстве

Чтобы получить сведения об уведомлении, пользователь может открыть панель уведомлений (которая разворачивает каждый значок уведомления, чтобы отобразить содержимое уведомления) и выполнить любые действия, связанные с уведомлениями. На следующем снимке экрана показана панель уведомлений , соответствующая области уведомлений, показанной выше:

Пример панели уведомлений с тремя уведомлениями

Уведомления Android используют два типа макетов:

  • Базовый макет — компактный, фиксированный формат презентации.
  • Расширенный макет — формат презентации, который может расширяться до большего размера для отображения дополнительных сведений.

Каждый из этих типов макетов (и их создание) описан в следующих разделах.

В этом руководстве рассматриваются API NotificationCompat из библиотеки поддержки Android. Эти API обеспечивают максимальную обратную совместимость с Android 4.0 (API уровня 14).

Базовый макет

Все уведомления Android основаны на базовом формате макета, который, как минимум, включает следующие элементы:

  1. Значок уведомления, представляющий исходное приложение, или тип уведомления, если приложение поддерживает различные типы уведомлений.
  2. Название уведомления или имя отправителя, если уведомление является личным сообщением.
  3. Сообщение уведомления.
  4. Метка времени.

Эти элементы отображаются, как показано на следующей схеме:

Расположение элементов уведомления

Высота базовых макетов ограничена 64 не зависящими от плотности пикселями (dp). Android создает этот базовый стиль уведомлений по умолчанию.

При необходимости в уведомлениях может отображаться большой значок, представляющий приложение или фотографию отправителя. При использовании большого значка в уведомлении в Android 5.0 и более поздних версиях маленький значок уведомления отображается в виде значка над большим значком:

Фотография с простым уведомлением

Начиная с Android 5.0 уведомления также могут отображаться на экране блокировки:

Пример уведомления на экране блокировки

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

В Android 5.0 появился высокоприоритетный формат презентации уведомлений, который называется Heads-up. Всплывающие уведомления скользит вниз от верхней части экрана на несколько секунд, а затем вернитесь обратно в область уведомлений:

Пример уведомления о голове

Уведомления с заголовками позволяют пользовательскому интерфейсу системы помещать важную информацию перед пользователем, не нарушая состояние текущего выполняемого действия.

Android включает поддержку метаданных уведомлений, чтобы уведомления можно было сортировать и отображать интеллектуально. Метаданные уведомлений также управляют отображением уведомлений на экране блокировки и в формате heads-up. Приложения могут задавать следующие типы метаданных уведомлений:

  • Приоритет — уровень приоритета определяет способ и время представления уведомлений. Например, в Android 5.0 высокоприоритетные уведомления отображаются как уведомления с высоким приоритетом.
  • Видимость — указывает, сколько содержимого уведомлений должно отображаться при отображении уведомления на экране блокировки.
  • Категория — информирует систему о том, как обрабатывать уведомление в различных обстоятельствах, например, когда устройство находится в режиме «Не беспокоить «.

Visibility и Category появились в Android 5.0 и недоступны в более ранних версиях Android. Начиная с Android 8.0 , каналы уведомлений используются для управления способом представления уведомлений пользователю.

Развернутые макеты

Начиная с Android 4.1, уведомления можно настроить с помощью развернутых стилей макета, которые позволяют пользователю увеличивать высоту уведомления для просмотра дополнительного содержимого. Например, в следующем примере показано расширенное уведомление макета в режиме контракта:

Уведомление о контракте

При развертывании этого уведомления отображается все сообщение:

Развернутое уведомление

Android поддерживает три расширенных стиля макета для уведомлений с одним событием:

  • Большой текст — в режиме контракта отображает фрагмент первой строки сообщения, за которым следуют две точки. В развернутом режиме отображается все сообщение (как показано в приведенном выше примере).
  • Папка «Входящие» — в режиме контракта отображает количество новых сообщений. В расширенном режиме отображает первое сообщение электронной почты или список сообщений в папке «Входящие».
  • Изображение — в режиме контракта отображает только текст сообщения. В развернутом режиме отображает текст и изображение.

Помимо базового уведомления (далее в этой статье) объясняется, как создавать уведомления о большом тексте, папке «Входящие» и «Изображения «.

Каналы уведомлений

Начиная с Android 8.0 (Oreo), вы можете использовать функцию каналов уведомлений , чтобы создать настраиваемый пользователем канал для каждого типа уведомлений, которые вы хотите отобразить. Каналы уведомлений позволяют группировать уведомления, чтобы все уведомления, опубликованные в канале, демонстрировали одинаковое поведение. Например, у вас может быть канал уведомлений, предназначенный для уведомлений, требующих немедленного внимания, и отдельный более «тихий» канал, который используется для информационных сообщений.

Приложение YouTube , установленное с Android Oreo, содержит две категории уведомлений: уведомления о скачивании и общие уведомления:

Экраны уведомлений для YouTube в Android Oreo

Каждая из этих категорий соответствует каналу уведомлений. Приложение YouTube реализует канал уведомлений о скачивании и канал общих уведомлений . Пользователь может нажать кнопку Скачать уведомления, чтобы отобразить экран параметров для канала уведомлений о скачивании приложения:

Экран уведомлений о скачивании для приложения YouTube

На этом экране пользователь может изменить поведение канала уведомлений о скачивании , выполнив следующие действия:

  • Задайте для параметра Уровень важности значение Срочный, Высокий, Средний или Низкий, который настраивает уровень звукового и визуального прерывания.
  • Включите или отключите точку уведомления.
  • Включите или выключите мигающий индикатор.
  • Отображение или скрытие уведомлений на экране блокировки.
  • Переопределите параметр Не беспокоить .

Канал общих уведомлений имеет аналогичные параметры:

Экран общих уведомлений для приложения YouTube

Обратите внимание, что у вас нет абсолютного контроля над взаимодействием каналов уведомлений с пользователем— пользователь может изменить параметры для любого канала уведомлений на устройстве, как показано на снимках экрана выше. Однако можно настроить значения по умолчанию (как описано ниже). Как показано в этих примерах, новая функция каналов уведомлений позволяет предоставлять пользователям детальный контроль над различными видами уведомлений.

Создание уведомлений

Чтобы создать уведомление в Android, используйте класс NotificationCompat.Builder из пакета NuGet Xamarin.Android.Support.v4 . Этот класс позволяет создавать и публиковать уведомления в более ранних версиях Android. NotificationCompat.Builder также обсуждается.

NotificationCompat.Builder предоставляет методы для настройки различных параметров в уведомлении, например:

  • Содержимое, включая заголовок, текст сообщения и значок уведомления.
  • Стиль уведомления, например большой текст, папка «Входящие» или стиль изображения .
  • Приоритет уведомления: минимальный, низкий, по умолчанию, высокий или максимальный. В Android 8.0 и более поздних версиях приоритет задается через канал уведомлений.
  • Видимость уведомления на экране блокировки: общедоступное, закрытое или секретное.
  • Метаданные категории, которые помогают Android классифицировать и фильтровать уведомление.
  • Необязательное намерение, указывающее действие, которое запускается при нажатии уведомления.
  • Идентификатор канала уведомлений, в котором будет опубликовано уведомление (Android 8.0 и более поздних версий).

После установки этих параметров в построителе создается объект уведомления, содержащий параметры. Чтобы опубликовать уведомление, передайте этот объект уведомления в диспетчер уведомлений. Android предоставляет класс NotificationManager , который отвечает за публикацию уведомлений и их отображение для пользователя. Ссылку на этот класс можно получить из любого контекста, например из действия или службы.

Создание канала уведомлений

Приложения, работающие в Android 8.0, должны создавать канал уведомлений для своих уведомлений. Каналу уведомлений требуются следующие три элемента информации:

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

Приложениям потребуется проверка версию Android, которую они выполняют. Устройства с версиями более ранних версий, чем Android 8.0, не должны создавать канал уведомлений. Следующий метод является одним из примеров создания канала уведомлений в действии:

void CreateNotificationChannel() < if (Build.VERSION.SdkInt < BuildVersionCodes.O) < // Notification channels are new in API 26 (and not a part of the // support library). There is no need to create a notification // channel on older versions of Android. return; >var channelName = Resources.GetString(Resource.String.channel_name); var channelDescription = GetString(Resource.String.channel_description); var channel = new NotificationChannel(CHANNEL_ID, channelName, NotificationImportance.Default) < Description = channelDescription >; var notificationManager = (NotificationManager) GetSystemService(NotificationService); notificationManager.CreateNotificationChannel(channel); > 

Канал уведомлений должен создаваться при каждом создании действия. CreateNotificationChannel Для метода он должен вызываться в методе OnCreate действия.

Создание и публикация уведомления

Чтобы создать уведомление в Android, выполните следующие действия.

  1. Создадите экземпляр объекта NotificationCompat.Builder .
  2. Вызовите различные методы для объекта , NotificationCompat.Builder чтобы задать параметры уведомления.
  3. Вызовите метод Build объекта , NotificationCompat.Builder чтобы создать экземпляр объекта уведомления.
  4. Вызовите метод Notify диспетчера уведомлений, чтобы опубликовать уведомление.

Для каждого уведомления необходимо указать по крайней мере следующие сведения:

  • Небольшой значок (размер 24×24 dp)
  • Короткий заголовок
  • Текст уведомления

В следующем примере кода показано, как с помощью NotificationCompat.Builder создать базовое уведомление. Обратите внимание, что NotificationCompat.Builder методы поддерживают цепочки методов, то есть каждый метод возвращает объект построителя, чтобы можно было использовать результат последнего вызова метода для вызова следующего вызова метода:

// Instantiate the builder and set notification elements: NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .SetContentTitle ("Sample Notification") .SetContentText ("Hello World! This is my first notification!") .SetSmallIcon (Resource.Drawable.ic_notification); // Build the notification: Notification notification = builder.Build(); // Get the notification manager: NotificationManager notificationManager = GetSystemService (Context.NotificationService) as NotificationManager; // Publish the notification: const int notificationId = 0; notificationManager.Notify (notificationId, notification); 

В этом примере создается новый NotificationCompat.Builder объект с именем builder вместе с идентификатором используемого канала уведомлений. Заголовок и текст уведомления задаются, а значок уведомления загружается из раздела Resources/drawable/ic_notification.png. Вызов метода построителя Build уведомлений создает объект уведомления с этими параметрами. Следующим шагом является вызов Notify метода диспетчера уведомлений. Чтобы найти диспетчер уведомлений, вызовите GetSystemService , как показано выше.

Метод Notify принимает два параметра: идентификатор уведомления и объект уведомления. Идентификатор уведомления — это уникальное целое число, которое идентифицирует уведомление для приложения. В этом примере идентификатор уведомления равен нулю (0); однако в рабочем приложении необходимо присвоить каждому уведомлению уникальный идентификатор. Повторное использованием предыдущего значения идентификатора в вызове метода приводит к Notify перезаписи последнего уведомления.

При выполнении этого кода на устройстве Android 5.0 создается уведомление, которое выглядит следующим образом:

Результат уведомления для примера кода

Значок уведомления отображается в левой части уведомления. На этом изображении обведенного «i» есть альфа-канал, благодаря которому Android может нарисовать за ним серый круглый фон. Вы также можете указать значок без альфа-канала. Сведения о том, как отобразить фотографическое изображение в виде значка , см. далее в этой статье.

Метка времени задается автоматически, но вы можете переопределить этот параметр, вызвав метод SetWhen построителя уведомлений. Например, в следующем примере кода для метки времени устанавливается текущее время:

builder.SetWhen (Java.Lang.JavaSystem.CurrentTimeMillis()); 

Включение звука и вибрации

Если вы хотите, чтобы в уведомлении также воспроизводились звуки, можно вызвать метод SetDefaults построителя уведомлений и передать NotificationDefaults.Sound флаг:

// Instantiate the notification builder and enable sound: NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .SetContentTitle ("Sample Notification") .SetContentText ("Hello World! This is my first notification!") .SetDefaults (NotificationDefaults.Sound) .SetSmallIcon (Resource.Drawable.ic_notification); 

Этот вызов приведет к SetDefaults тому, что устройство воспроизводит звук при публикации уведомления. Если вы хотите, чтобы устройство вибрирует, а не воспроизводит звук, вы можете передать NotificationDefaults.Vibrate SetDefaults. в . Если вы хотите, чтобы устройство воспроизводило звук и вибрирует устройство, вы можете передать оба флага в SetDefaults :

builder.SetDefaults (NotificationDefaults.Sound | NotificationDefaults.Vibrate); 

Если включить звук, не указывая звук для воспроизведения, Android использует системный звук уведомления по умолчанию. Однако вы можете изменить звук, который будет воспроизводиться, вызвав метод SetSound построителя уведомлений. Например, чтобы воспроизвести звук будильника с уведомлением (вместо звука уведомления по умолчанию), можно получить универсальный код ресурса (URI) для звукового сигнала будильника из RingtoneManager и передать его в SetSound :

builder.SetSound (RingtoneManager.GetDefaultUri(RingtoneType.Alarm)); 

Кроме того, вы можете использовать системный звук мелодии звонка по умолчанию для уведомления:

builder.SetSound (RingtoneManager.GetDefaultUri(RingtoneType.Ringtone)); 

После создания объекта уведомления можно задать свойства уведомления для объекта уведомления (а не настраивать их заранее с помощью NotificationCompat.Builder методов). Например, вместо вызова SetDefaults метода для включения вибрации в уведомлении можно напрямую изменить битовый флаг свойства По умолчанию уведомления:

// Build the notification: Notification notification = builder.Build(); // Turn on vibrate: notification.Defaults |= NotificationDefaults.Vibrate; 

В этом примере устройство вибрирует при публикации уведомления.

Обновление уведомления

Если вы хотите обновить содержимое уведомления после его публикации, можно повторно использовать существующий NotificationCompat.Builder объект для создания нового объекта уведомления и публикации этого уведомления с идентификатором последнего уведомления. Пример:

// Update the existing notification builder content: builder.SetContentTitle ("Updated Notification"); builder.SetContentText ("Changed to this message."); // Build a notification object with updated content: notification = builder.Build(); // Publish the new notification with the existing ID: notificationManager.Notify (notificationId, notification); 

В этом примере существующий NotificationCompat.Builder объект используется для создания нового объекта уведомления с другим заголовком и сообщением. Новый объект уведомления публикуется с использованием идентификатора предыдущего уведомления, который обновляет содержимое ранее опубликованного уведомления:

Обновленное уведомление

Текст предыдущего уведомления используется повторно — только заголовок и текст уведомления изменяются, пока уведомление отображается на панели уведомлений. Текст заголовка изменится с «Пример уведомления» на «Обновленное уведомление», а текст сообщения изменится с «Hello World! Это мое первое уведомление!» На «Изменено на это сообщение».

Уведомление остается видимым до тех пор, пока не произойдет одно из трех действий:

  • Пользователь закрывает уведомление (или нажимает кнопку Очистить все).
  • Приложение выполняет вызов NotificationManager.Cancel , передав уникальный идентификатор уведомления, назначенный при публикации уведомления.
  • Приложение вызывает NotificationManager.CancelAll .

Дополнительные сведения об обновлении уведомлений Android см. в разделе Изменение уведомления.

Запуск действия из уведомления

В Android уведомление обычно связывается с действием — действием, которое запускается, когда пользователь касается уведомления. Это действие может находиться в другом приложении или даже в другой задаче. Чтобы добавить действие в уведомление, создайте объект PendingIntent и свяжите PendingIntent с уведомлением. — PendingIntent это особый тип намерения, который позволяет приложению-получателю выполнять предопределенный фрагмент кода с разрешениями отправляющего приложения. Когда пользователь касается уведомления, Android запускает действие, указанное в PendingIntent .

В следующем фрагменте кода показано, как создать уведомление с элементом , PendingIntent которое запустит действие исходного приложения: MainActivity

// Set up an intent so that tapping the notifications returns to this app: Intent intent = new Intent (this, typeof(MainActivity)); // Create a PendingIntent; we're only using one PendingIntent (ID = 0): const int pendingIntentId = 0; PendingIntent pendingIntent = PendingIntent.GetActivity (this, pendingIntentId, intent, PendingIntentFlags.OneShot); // Instantiate the builder and set notification elements, including pending intent: NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .SetContentIntent (pendingIntent) .SetContentTitle ("Sample Notification") .SetContentText ("Hello World! This is my first action notification!") .SetSmallIcon (Resource.Drawable.ic_notification); // Build the notification: Notification notification = builder.Build(); // Get the notification manager: NotificationManager notificationManager = GetSystemService (Context.NotificationService) as NotificationManager; // Publish the notification: const int notificationId = 0; notificationManager.Notify (notificationId, notification); 

Этот код очень похож на код уведомления в предыдущем разделе, за исключением того, что PendingIntent в объект уведомления добавляется . В этом примере PendingIntent объект связан с действием исходного приложения перед его передачей в метод SetContentIntent построителя уведомлений. Флаг PendingIntentFlags.OneShot передается методу PendingIntent.GetActivity , PendingIntent чтобы использовать только один раз. При выполнении этого кода отображается следующее уведомление:

Уведомление о первом действии

При нажатии этого уведомления пользователь возвращается к исходному действию.

В рабочем приложении ваше приложение должно обрабатывать стек назад , когда пользователь нажимает кнопку Назад в действии уведомления (если вы не знакомы с задачами Android и стеком back, см. статьи Задачи и стек назад). В большинстве случаев при переходе назад из действия уведомления пользователь должен вернуться из приложения и обратно на начальный экран. Для управления задним стеком ваше приложение использует класс TaskStackBuilder для создания PendingIntent стека назад.

Другое реальное соображение заключается в том, что исходному действию может потребоваться отправить данные в действие уведомления. Например, уведомление может означать, что получено текстовое сообщение, а действие уведомления (экран просмотра сообщения) требует идентификатор сообщения для отображения сообщения пользователю. Действие, создающее PendingIntent , может использовать метод Intent.PutExtra для добавления данных (например, строки) в намерение, чтобы эти данные передавались в действие уведомления.

В следующем примере кода показано, как использовать TaskStackBuilder для управления задним стеком, а также приведен пример отправки одной строки сообщения в действие уведомления с именем SecondActivity :

// Setup an intent for SecondActivity: Intent secondIntent = new Intent (this, typeof(SecondActivity)); // Pass some information to SecondActivity: secondIntent.PutExtra ("message", "Greetings from MainActivity!"); // Create a task stack builder to manage the back stack: TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this); // Add all parents of SecondActivity to the stack: stackBuilder.AddParentStack (Java.Lang.Class.FromType (typeof (SecondActivity))); // Push the intent that starts SecondActivity onto the stack: stackBuilder.AddNextIntent (secondIntent); // Obtain the PendingIntent for launching the task constructed by // stackbuilder. The pending intent can be used only once (one shot): const int pendingIntentId = 0; PendingIntent pendingIntent = stackBuilder.GetPendingIntent (pendingIntentId, PendingIntentFlags.OneShot); // Instantiate the builder and set notification elements, including // the pending intent: NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .SetContentIntent (pendingIntent) .SetContentTitle ("Sample Notification") .SetContentText ("Hello World! This is my second action notification!") .SetSmallIcon (Resource.Drawable.ic_notification); // Build the notification: Notification notification = builder.Build(); // Get the notification manager: NotificationManager notificationManager = GetSystemService (Context.NotificationService) as NotificationManager; // Publish the notification: const int notificationId = 0; notificationManager.Notify (notificationId, notification); 

В этом примере кода приложение состоит из двух действий: MainActivity (который содержит приведенный выше код уведомления) и SecondActivity , экран, который пользователь видит после нажатия уведомления. При выполнении этого кода отображается простое уведомление (аналогично предыдущему примеру). При нажатии на уведомление пользователь перейдет на SecondActivity экран:

Снимок экрана второго действия

Строковое сообщение (переданное в метод намерения PutExtra ) извлекается в SecondActivity с помощью следующей строки кода:

// Get the message from the intent: string message = Intent.Extras.GetString ("message", ""); 

Полученное сообщение «Greetings from MainActivity!», отображается на SecondActivity экране, как показано на снимке экрана выше. Когда пользователь нажимает кнопку Назад в SecondActivity среде , навигация выводит из приложения и возвращается на экран перед запуском приложения.

Дополнительные сведения о создании ожидающих намерений см. в разделе PendingIntent.

Помимо базового уведомления

Уведомления по умолчанию поддерживают простой базовый формат макета в Android, но вы можете улучшить этот базовый формат, выполнив дополнительные NotificationCompat.Builder вызовы методов. В этом разделе вы узнаете, как добавить большой значок фотографии в уведомление, а также увидите примеры создания уведомлений о развернутом макете.

Формат большого значка

Уведомления Android обычно отображают значок исходного приложения (в левой части уведомления). Однако в уведомлениях может отображаться изображение или фотография ( большой значок) вместо стандартного маленького значка. Например, приложение для обмена сообщениями может отображать фотографию отправителя, а не значок приложения.

Ниже приведен пример простого уведомления Android 5.0, в котором отображается только небольшой значок приложения:

Пример обычного уведомления

Ниже приведен снимок экрана с уведомлением после изменения его для отображения большого значка— в нем используется значок, созданный на основе изображения обезьяны кода Xamarin:

Пример уведомления о большом значке

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

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

builder.SetLargeIcon (BitmapFactory.DecodeResource (Resources, Resource.Drawable.monkey_icon)); 

Этот пример кода открывает файл изображения в папке Resources/drawable/monkey_icon.png, преобразует его в растровое изображение и передает полученное растровое изображение в NotificationCompat.Builder . Как правило, разрешение исходного изображения больше, чем у маленького значка, но не намного больше. Слишком большое изображение может привести к ненужным операциям изменения размера, которые могут задержать отправку уведомления.

Стиль большого текста

Стиль «Большой текст» — это расширенный шаблон макета, который используется для отображения длинных сообщений в уведомлениях. Как и все уведомления о развернутом макете, уведомление о большом тексте изначально отображается в компактном формате презентации:

Пример уведомления с большим текстом

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

Развернутое уведомление о большом тексте

Этот расширенный формат макета также включает текст сводки в нижней части уведомления. Максимальная высота уведомления о большом тексте составляет 256 dp.

Чтобы создать уведомление о большом тексте , создайте NotificationCompat.Builder экземпляр объекта , как и раньше, а затем создайте и добавьте в объект объект NotificationCompat.Builder BigTextStyle. Вот пример:

// Instantiate the Big Text style: Notification.BigTextStyle textStyle = new Notification.BigTextStyle(); // Fill it with text: string longTextMessage = "I went up one pair of stairs."; longTextMessage += " / Just like me. "; //. textStyle.BigText (longTextMessage); // Set the summary text: textStyle.SetSummaryText ("The summary text goes here."); // Plug this style into the builder: builder.SetStyle (textStyle); // Create the notification and publish it . 

В этом примере текст сообщения и текст сводки хранятся в объекте BigTextStyle ( textStyle ) перед его передачей в NotificationCompat.Builder.

Стиль изображения

Стиль изображения (также называемый стилем большого рисунка ) — это расширенный формат уведомлений, который можно использовать для отображения изображения в тексте уведомления. Например, приложение для снимка экрана или приложение для фотографий может использовать стиль уведомления изображения , чтобы предоставить пользователю уведомление о последнем изображении, которое было записано. Обратите внимание, что максимальная высота уведомления об изображении составляет 256 дп. Android изменит размер изображения в соответствии с этим ограничением по максимальной высоте в пределах доступной памяти.

Как и все уведомления о развернутом макете, уведомления об изображении сначала отображаются в компактном формате, в котором отображается фрагмент сопроводичного текста сообщения:

Уведомление о компактном изображении не отображает изображение

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

Уведомление о развернутом изображении отображает изображение

Обратите внимание, что при отображении уведомления в компактном формате отображается текст уведомления (текст, передаваемый методу построителя SetContentText уведомлений, как показано ранее). Однако при развертывании уведомления для отображения изображения отображается текст сводки над изображением.

Чтобы создать уведомление Image , необходимо создать NotificationCompat.Builder экземпляр объекта, как и раньше, а затем создать и вставить объект BigPictureStyle в NotificationCompat.Builder объект . Пример:

// Instantiate the Image (Big Picture) style: Notification.BigPictureStyle picStyle = new Notification.BigPictureStyle(); // Convert the image to a bitmap before passing it into the style: picStyle.BigPicture (BitmapFactory.DecodeResource (Resources, Resource.Drawable.x_bldg)); // Set the summary text that will appear with the image: picStyle.SetSummaryText ("The summary text goes here."); // Plug this style into the builder: builder.SetStyle (picStyle); // Create the notification and publish it . 

Как и метод SetLargeIcon NotificationCompat.Builder , методу BigPicture BigPictureStyle требуется точечный рисунок изображения, которое должно отображаться в тексте уведомления. В этом примере метод DecodeResource считывает файл изображения, расположенный BitmapFactory в папке Resources/drawable/x_bldg.png , и преобразует его в растровое изображение.

Вы также можете отображать изображения, которые не упаковываются в качестве ресурса. Например, следующий пример кода загружает изображение из локального карта SD и отображает его в уведомлении об изображении:

// Using the Image (Big Picture) style: Notification.BigPictureStyle picStyle = new Notification.BigPictureStyle(); // Read an image from the SD card, subsample to half size: BitmapFactory.Options options = new BitmapFactory.Options(); options.InSampleSize = 2; string imagePath = "/sdcard/Pictures/my-tshirt.jpg"; picStyle.BigPicture (BitmapFactory.DecodeFile (imagePath, options)); // Set the summary text that will appear with the image: picStyle.SetSummaryText ("Check out my new T-Shirt!"); // Plug this style into the builder: builder.SetStyle (picStyle); // Create notification and publish it . 

В этом примере файл изображения, расположенный в папке /sdcard/Pictures/my-tshirt.jpg , загружается, изменяется до половины исходного размера, а затем преобразуется в растровое изображение для использования в уведомлении:

Пример изображения футболки в уведомлении

Если вы не знаете размер файла изображения заранее, рекомендуется заключить вызов BitmapFactory.DecodeFile в обработчик исключений OutOfMemoryError . Если изображение слишком велико, для изменения размера android может возникнуть исключение.

Дополнительные сведения о загрузке и декодирования больших растровых изображений см. в разделе Эффективная загрузка больших растровых изображений.

Стиль папки «Входящие»

Формат папки «Входящие» — это расширенный шаблон макета, предназначенный для отображения отдельных строк текста (например, сводки по электронной почте) в тексте уведомления. Уведомление в формате «Входящие» сначала отображается в компактном формате:

Пример компактного уведомления о папке

Когда пользователь перетаскивает уведомление вниз, оно разворачивается, чтобы отобразить сводку по электронной почте, как показано на снимке экрана ниже:

Пример развернутого уведомления в папке

Чтобы создать уведомление папки «Входящие», создайте экземпляр NotificationCompat.Builder объекта, как и раньше, и добавьте InboxStyle в NotificationCompat.Builder . Вот пример:

// Instantiate the Inbox style: Notification.InboxStyle inboxStyle = new Notification.InboxStyle(); // Set the title and text of the notification: builder.SetContentTitle ("5 new messages"); builder.SetContentText ("chimchim@xamarin.com"); // Generate a message summary for the body of the notification: inboxStyle.AddLine ("Cheeta: Bananas on sale"); inboxStyle.AddLine ("George: Curious about your blog post"); inboxStyle.AddLine ("Nikko: Need a ride to Evolve?"); inboxStyle.SetSummaryText ("+2 more"); // Plug this style into the builder: builder.SetStyle (inboxStyle); 

Чтобы добавить новые строки текста в текст уведомления, вызовите метод InboxStyle Addline объекта (максимальная высота уведомления в папке «Входящие» — 256 dp). Обратите внимание, что в отличие от стиля «Большой текст» , стиль папки «Входящие» поддерживает отдельные строки текста в тексте уведомления.

Вы также можете использовать стиль «Входящие» для любого уведомления, которое должно отображать отдельные строки текста в расширенном формате. Например, стиль уведомлений в папке «Входящие» можно использовать для объединения нескольких ожидающих уведомлений в сводное уведомление. Вы можете обновить одно уведомление в стиле «Входящие» новыми строками содержимого уведомлений (см. раздел Обновление уведомления выше), а не создавать непрерывный поток новых, в основном похожих уведомлений.

Настройка метаданных

NotificationCompat.Builder включает методы, которые можно вызвать для задания метаданных уведомления, таких как приоритет, видимость и категория. Android использует эти сведения вместе с параметрами параметров пользователя, чтобы определить, как и когда следует отображать уведомления.

Параметры приоритета

Приложениям, работающим в Android 7.1 и более ранних версиях, необходимо задать приоритет непосредственно в самом уведомлении. Параметр приоритета уведомления определяет два результата при публикации уведомления:

  • Где уведомление отображается относительно других уведомлений. Например, уведомления с высоким приоритетом отображаются над уведомлениями с более низким приоритетом на панели уведомлений независимо от того, когда каждое уведомление было опубликовано.
  • Отображается ли уведомление в формате уведомления Heads-up (Android 5.0 и более поздние версии). Только уведомления с высоким и максимальным приоритетом отображаются в виде уведомлений heads-up.

Xamarin.Android определяет следующие перечисления для настройки приоритета уведомлений:

  • NotificationPriority.Max — оповещает пользователя о срочном или критическом состоянии (например, о входящем вызове, пошаговом маршруте или оповещении о чрезвычайных ситуациях). На устройствах Android 5.0 и более поздних версий уведомления с максимальным приоритетом отображаются в формате Heads-up.
  • NotificationPriority.High — информирует пользователя о важных событиях (таких как важные сообщения электронной почты или получение сообщений чата в режиме реального времени). На устройствах Android 5.0 и более поздних версий уведомления с высоким приоритетом отображаются в формате Heads-up.
  • NotificationPriority.Default — уведомляет пользователя об условиях, имеющих средний уровень важности.
  • NotificationPriority.Low — для несрочной информации, о которую пользователь должен быть проинформирован (например, напоминания об обновлениях программного обеспечения или обновления социальных сетей).
  • NotificationPriority.Min — для получения фоновой информации, которую пользователь замечает только при просмотре уведомлений (например, сведения о местоположении или погоде).

Чтобы задать приоритет уведомления, вызовите метод NotificationCompat.Builder SetPriority объекта , передав уровень приоритета. Пример:

builder.SetPriority (NotificationPriority.High); 

В следующем примере в верхней части панели уведомлений отображается уведомление с высоким приоритетом «Важное сообщение!»:

Пример уведомления с высоким приоритетом

Так как это уведомление является высокоприоритетным, оно также отображается в виде уведомления Heads-up над экраном текущей активности пользователя в Android 5.0:

Пример уведомления heads-up

В следующем примере уведомление с низким приоритетом «Мысль за день» отображается под уведомлением уровня заряда батареи с более высоким приоритетом:

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

Так как уведомление «Мысль за день» является уведомлением с низким приоритетом, Android не будет отображать его в формате Heads-up.

В Android 8.0 и более поздних версиях приоритет канала уведомлений и пользовательские параметры определяют приоритет уведомления.

Параметры видимости

Начиная с Android 5.0, параметр видимости доступен для управления объемом содержимого уведомлений, отображаемым на экране защищенной блокировки. Xamarin.Android определяет следующие перечисления для настройки видимости уведомлений:

  • NotificationVisibility.Public — Полное содержимое уведомления отображается на экране безопасной блокировки.
  • NotificationVisibility.Private — На экране безопасной блокировки отображаются только важные сведения (например, значок уведомления и имя приложения, которое его опубликовало), но остальные сведения уведомления скрыты. По умолчанию для всех уведомлений используется значение NotificationVisibility.Private .
  • NotificationVisibility.Secret — На экране безопасной блокировки ничего не отображается, даже значок уведомления. Содержимое уведомления доступно только после того, как пользователь разблокирует устройство.

Чтобы задать видимость уведомления, приложения вызывают SetVisibility метод NotificationCompat.Builder объекта , передавая параметр видимости. Например, этот вызов делает SetVisibility уведомление Private :

builder.SetVisibility (NotificationVisibility.Private); 

Private При публикации уведомления на экране безопасной блокировки отображаются только имя и значок приложения. Вместо уведомления пользователь видит сообщение «Разблокируйте устройство, чтобы увидеть это уведомление»:

Уведомление о разблокировке устройства

В этом примере NotificationsLab — это имя исходного приложения. Эта отредактированная версия уведомления отображается только в том случае, если экран блокировки защищен (т. е. защищенный с помощью ПИН-кода, шаблона или пароля). Если экран блокировки не защищен, все содержимое уведомления будет доступно на экране блокировки.

Параметры категории

Начиная с Android 5.0, предопределенные категории доступны для ранжирования и фильтрации уведомлений. Xamarin.Android предоставляет следующие перечисления для этих категорий:

  • Notification.CategoryCall — входящий телефонный звонок.
  • Notification.CategoryMessage — входящее текстовое сообщение.
  • Notification.CategoryAlarm — условие тревоги или истечение срока действия таймера.
  • Notification.CategoryEmail — входящее сообщение электронной почты.
  • Notification.CategoryEvent — событие календаря.
  • Notification.CategoryPromo — рекламное сообщение или объявление.
  • Notification.CategoryProgress — ход выполнения фоновой операции.
  • Notification.CategorySocial — Обновление социальных сетей.
  • Notification.CategoryError — сбой фоновой операции или процесса проверки подлинности.
  • Notification.CategoryTransport — обновление воспроизведения мультимедиа.
  • Notification.CategorySystem — зарезервировано для использования в системе (состояние системы или устройства).
  • Notification.CategoryService — указывает, что фоновая служба запущена.
  • Notification.CategoryRecommendation — сообщение рекомендации, связанное с текущим запущенным приложением.
  • Notification.CategoryStatus — сведения об устройстве.

При сортировке уведомлений приоритет уведомления имеет приоритет над параметрами категории. Например, уведомление с высоким приоритетом будет отображаться как Heads-up, даже если оно относится к Promo категории. Чтобы задать категорию уведомления, вызовите SetCategory метод NotificationCompat.Builder объекта , передавая параметр категории. Пример:

builder.SetCategory (Notification.CategoryCall); 

Функция «Не беспокоить » (новая в Android 5.0) фильтрует уведомления по категориям. Например, экран Не беспокоить в разделе Параметры позволяет пользователю исключить уведомления о телефонных звонках и сообщениях:

Не беспокоить переключатели экрана

Если пользователь настроит параметр Не беспокоить , чтобы блокировать все прерывания, кроме телефонных звонков (как показано на снимке экрана выше), Android позволяет отображать уведомления с параметром Notification.CategoryCall категории , пока устройство находится в режиме «Не беспокоить «. Обратите внимание, что Notification.CategoryAlarm уведомления никогда не блокируются в режиме «Не беспокоить «.

В примере LocalNotifications показано, как использовать NotificationCompat.Builder для запуска второго действия из уведомления. Этот пример кода описан в пошаговом руководстве Использование локальных уведомлений в Xamarin.Android .

Стили уведомлений

Для создания уведомлений в стиле «Большой текст», «Изображение» или «Входящие» с NotificationCompat.Builder помощью приложения необходимо использовать версии совместимости этих стилей. Например, чтобы использовать стиль «Большой текст «, создайте NotificationCompat.BigTextstyle экземпляр :

NotificationCompat.BigTextStyle textStyle = new NotificationCompat.BigTextStyle(); // Plug this style into the builder: builder.SetStyle (textStyle); 

Аналогичным образом приложение может использовать NotificationCompat.InboxStyle и NotificationCompat.BigPictureStyle для стилей «Входящие» и «Изображения » соответственно.

Приоритет и категория уведомления

NotificationCompat.Builder SetPriority поддерживает метод (доступен начиная с Android 4.1). SetCategory Однако метод не поддерживается, NotificationCompat.Builder так как категории являются частью новой системы метаданных уведомлений, которая появилась в Android 5.0.

Для поддержки более старых версий Android, где SetCategory он недоступен, код может проверка уровень API в среде выполнения для условного вызова SetCategory , если уровень API равен или больше Android 5.0 (уровень API 21):

if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)

В этом примере для целевой платформы приложения задано значение Android 5.0, а для параметра Минимальная версия AndroidAndroid 4.1 (уровень API 16). Так как SetCategory доступен на уровне API 21 и более поздних версий, этот пример кода вызывается SetCategory только тогда, когда он доступен. Он не будет вызываться SetCategory , если уровень API меньше 21.

Видимость экрана блокировки

Так как Android не поддерживал уведомления на экране блокировки до Android 5.0 (уровень API 21), NotificationCompat.Builder метод не поддерживается SetVisibility . Как описано выше для SetCategory , ваш код может проверка уровень API во время выполнения и вызывать SetVisiblity только тогда, когда он доступен:

if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)

Итоги

В этой статье объясняется, как создавать локальные уведомления в Android. В нем описана структура уведомления, описано, как использовать NotificationCompat.Builder для создания уведомлений, как стили уведомлений в больших значках, большом тексте, изображениях и папке «Входящие» , как задать параметры метаданных уведомления, такие как приоритет, видимость и категория, а также как запускать действие из уведомления. В этой статье также описано, как эти параметры уведомлений работают с новыми функциями «Голова вверх», «Экран блокировки» и «Не беспокоить» , появившиеся в Android 5.0. Наконец, вы узнали, как использовать NotificationCompat.Builder для обеспечения совместимости уведомлений с более ранними версиями Android.

Рекомендации по разработке уведомлений для Android см. в разделе Уведомления.

Связанные ссылки

  • NotificationsLab (пример)
  • LocalNotifications (пример)
  • Пошаговое руководство по локальным уведомлениям для Android
  • Уведомление пользователя
  • Уведомление
  • NotificationManager
  • NotificationCompat.Builder
  • PendingIntent

Пуш-уведомления

Пуш-уведомления (англ. push notifications) — это короткие сообщения, которые отображаются на мобильном или десктопном экране устройства пользователя. Такие оповещения могут отправлять сайты или приложения с целью информирования о своих обновлениях, товарах и услугах. Это мощный маркетинговый инструмент, который используют в самых разных сферах бизнеса.

Типы пуш-уведомлений

Пуш-уведомления от мобильных приложений («мобильные») — это оповещения, которые приходят исключительно на смартфон пользователя от установленных на нём приложений. Они отображаются в «шторке» на экране устройства. В зависимости от настроек пользователя о пуше может дополнительно извещать звук или световой индикатор смартфона. Почти все современные телефоны с разными операционными системами (Android, iOS) поддерживают технологию пуш-уведомлений от приложений.

Пуши отлично подходят для уведомлений в приложении для заказа услуг или покупок. Пуши функциональны — например, с помощью диплинк-ссылки промокод из пуш-рассылки автоматически подставится в заказ. После настройки приложения пуш-рассылку можно завести за пару минут.

Браузерные пуш-уведомления (web push notifications) — это сообщения, которые веб-ресурсы отправляют своим подписчикам через браузер (поддерживаются Chrome, Opera, Safari, Yandex, Firefox). Такие пуши приходят как на мобильные устройства (на ОС Android), так и на ПК, ноутбуки, планшеты. Именно браузерные пуш-уведомления — основа маркетингового канала пуш-рассылок.

Маркетинговые виды пушей

  • Триггерные. Отправляются, когда пользователь совершил (или — не совершил!) действие, на которое реагирует система.
  • Транзакционные. Такие, как подтверждение оплаты, смена статуса заявки и другие.
  • Контентные. Новая информация о продукте, изменения в работе компании и прочее.

Как устроена работа пушей

Мобильные пуши

Чтобы получить возможность отправлять пуш-уведомления для мобильных приложений Android, нужно зарегистрироваться и связать приложение в специальном сервисе — Google Firebase.

У мобильных приложений есть 4 варианта настройки:
Google Firebase Cloud Messaging — для Android и iOS;
Apple Push Notification Service — только для iOS;
Yandex.AppMetrica — для Android и iOS;
Huawei Mobile Services — для Android и iOS.Для подключения к CDP:
для Android — JSON-файл закрытого ключа Google Firebase;
для IOS — генерация APN-токена на Apple Push Notification.

Браузерные пуш-уведомления

Технология браузерных пуш-уведомлений работает иначе, чем рассылка пушей от мобильных приложений. Чтобы передать сообщение от сайта пользователю, когда тот его уже покинул, требуется цепочка действий, связанных с внешними ресурсами. Так, уведомление отправляют с сервера сайта на облачный сервер сообщений — и уже оттуда месседж приходит в браузер клиента, подписанного на рассылку.

Как это выглядит технически

  1. Посетитель приходит на сайт;
  2. Появляется окно подписки на пуш-рассылку;
  3. Пользователь в один клик становится подписчиком;
  4. Подписчику присваивается ID;
  5. Теперь сайт может отправлять подписчику пуш-сообщения.

Несмотря на сложный принцип, для конечного потребителя технология выглядит очень легко. Браузерное пуш-уведомление появляется поверх всех раскрытых окон и на некоторое время задерживается на экране десктопного устройства.

Чтобы получать браузерные сообщения, пользователю достаточно дать согласие на их приём. Процедура подписки максимально упрощена и осуществляется в один клик по кнопке «Разрешить» в сервисном окне браузера. Лёгкая подписка помогает быстро наращивать базу.

Подписчику не нужно сообщать свои личные данные: номер телефона, электронный адрес и другую информацию, которая требуется, например, при подписке на email-рассылку.

Простая процедура и отсутствие необходимости предоставлять данные о себе — вот основа позитивного взаимодействия с подписчиком. А функциональные возможности пушей (такие, как сегментация клиентской базы) позволяют создавать рассылки, которые будут максимально полезны и для получателя, и для конверсии сайта.

Структура пуш-уведомления

Мобайл-пуши
Пуш-уведомления mobile-версии поддерживают заголовок, текст, картинку, иконку бренда. Сам пуш является кнопкой.

Веб-пуши

Вот полный набор элементов для универсального пуша, который одинаково хорошо будет отображаться в любом браузере и на любой системе (macOS/Windows):

  • Заголовок от 20 до 40 символов, но в зависимости от разных браузеров на Windows количество символов может быть увеличено до 60.
  • Текст сообщения до 80 символов, но для Windows среднее количество может доходить до 120 символов.
  • Стандартная сменная картинка (192х192 пикселя).
  • Дополнительные кнопки. Возможно разместить до двух кнопок.
  • Эмодзи или смайлы. Коммуникации с использованием Emoji на 85% эффективнее. Рекомендация: лучше отправлять не более двух эмодзи в одном сообщении.
  • Ссылка на заданную отправителем страницу веб-ресурса.
  • Utm-метки для ссылок.

Нужно иметь в виду, что структура пуш-уведомления может меняться в зависимости от браузера.

Примеры отображения пушей

Такая вариативность открывает массу возможностей по донесению информации до клиента. Большие картинки задействуют для имиджевых кампаний, ведь графическая информация привлекает внимание быстрее, чем текст. Кнопки используют для сегментации подписчиков, чаще всего — для перехода на разные страницы сайта. Также кнопки подходят для распределения посетителей по различным признакам.

Приведём примеры применения таких уведомлений в разных сферах.

Интернет-торговля

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

  • Акции и скидки на товары в избранном.
  • Статус заказа, оплата, отправка, получение.
  • Необходимость оценить товар и доставку.
  • Брошенный товар в корзине или незавершённое оформление.
  • Персональные предложения.
  • Скидка на товар, который заинтересовал пользователя.
  • Дополнительные товары.

Банки

Деньги — вопрос серьёзный, поэтому пользователи хотят быть в курсе событий, которые происходят с их счетами. Особенно во времена, когда процветает интернет-мошенничество.

Вот что банки присылают с помощью пушей.

  • Персональные предложения по кредитам и вкладам.
  • Напоминания о сроке кредита.
  • Сообщение о перевыпуске карты.
  • Операции со счётом: покупка, пополнение.
  • Предупреждения о подозрительных операциях.
  • Одноразовые пароли для входа в систему.

Рекрутинговые сайты

Для человека, который ищет работу, скорость реакции на все изменения по статусу на сайте вакансии — это важно. Рекрутинговые сервисы помогают пользователям держать руку на пульсе. Вот какие уведомления они присылают уведомления.

  • Просмотр резюме.
  • Приглашения на собеседования.
  • Новых вакансии по критериям пользователя.
  • Другая дополнительная информация, которая ускорит поиск работы.

Недвижимость

В сфере недвижимости скорость тоже важна, особенно при аренде жилья: хорошие квартиры разлетаются в первые часы после публикации объявления. Некоторые пользователи мониторят предложения на специальных сайтах или в разделах на сайтах агрегаторов (например, «Авито»).

Посмотрите на варианты для пуш-уведомлений в этой сфере.

  • Появление новых объектов на продажу или для аренды.
  • Изменение цен на объекты, которые пользователь просматривал или добавил в избранное.
  • Акции от строительных компаний.

Медицинская организация

Частные клиники используют пуши с разными целями.

  • Напоминать клиенту о записи.
  • Сообщать об изменениях в расписании врачей.
  • Уведомлять о готовности анализов и справок.
  • Сообщать об акциях.

Обучение

Проблема сферы обучения — потеря мотивации учеников. Не все могут пройти курс вовремя и до конца. Их нужно «подталкивать», что успешно делают пуш-сообщения. Вот о чём они напоминают.

  • Необходимость пройти урок.
  • Время события (вебинара, конференции, встречи с наставником).
  • Сдача домашнего задания.
  • Скидки на дополнительные курсы.
  • Ответы от менторов и наставников на вопросы ученика.

Возможно, самый известный пример пуш-уведомлений в обучении — кейс приложения для изучения иностранных языков Duolingo. Зелёная сова на иконке пуш-уведомлений и тон сообщений даже стали мемом.

Бухгалтерия и госуслуги

Страшный сон бухгалтера и предпринимателя — не сдать вовремя налоговую отчётность и не успеть заплатить налоги. Через пуши удобно получать уведомления о сроках по отчётам и спать спокойно.

Как работают пуши

Первый этап — сбор базы подписчиков

Собрать базу для пушей можно с помощью любого специализированного сервиса — есть те, которые помогают в решении именно этого вопроса, а не в сборе базы вообще.

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

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

Самое главное для эффективного сбора подписчиков — предлагать пользователю релевантный повод подписаться на вас. Также важно сегментировать подписки по интересам, географии, полу, возрасту и прочему. Так в будущем вы сможете предлагать пользователям полезные и интересные уведомления.

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

В среднем конверсия в подписку составляет 1–10% от числа неуникальных посещений.

Какие клиентские данные попадают в базу во время подписки на пуши?

  • pushToken — токен пользователя;
  • os — операционная система;
  • userAgent — используемый браузер;
  • userAgentVersion — версия браузера;
  • userAgentLang — локализация браузера (язык пользователя);
  • ip — адрес, с которого осуществлена подписка;
  • subscriptionPage — страница, на которой осуществлена подписка;
  • appUid — идентификатор приложения (служебное поле);
  • contactId — идентификатор создаваемого контакта, по которому его определяет система.

Второй этап — планирование рассылок

Важно постоянно поддерживать интерес клиента к информации сайта. Для этого необходимо учитывать такие факторы:

  • частота рассылки;
  • время и длительность отправки уведомлений;
  • время отображения сообщения на экране получателя;
  • актуальность тематики.

На этапе планирования задают цели кампании, от которых будет зависеть формат, внешний вид, длительность рассылки и прочее. Так, целью может быть сегментация подписчиков (уведомление с кнопками), информирование о новой услуге, напоминание о платеже, поздравление, приглашение и многое другое.

Третий этап — рассылка пушей и анализ результатов

На этом этапе важно оценить реакцию подписчиков на полученное сообщение. Именно результаты кампании покажут, насколько верным был предварительный расчёт. Каждая новая кампания даёт бесценные сведения и опыт, который можно применять для повышения конверсии в дальнейшем.

Преимущества и недостатки

Преимущества мобайл пуш-уведомлений

  1. Низкая стоимость. Цена отправки мобильного пуша — 0 рублей.
  2. Высокая читаемость. Вы можете быть уверены, что ваше сообщение не пропустят.
  3. Быстрое время отклика. В среднем мобильный пуш читают в течение 20 секунд после разблокировки телефона.

Недостатки мобайл пуш-уведомлений

  1. Разработка приложений. Мобильный пуш отправляется из приложения. Нет приложения — нет и мобильных пушей.
  2. Короткие сообщения. Весь важный текст уместить не удастся.
  3. Требуется разрешение. Пользователь должен согласиться на получение пушей.

Преимущества веб пуш-уведомлений

  1. Увеличивают вовлечённость, лояльность и продажи. Использование пуш-уведомлений позволяет информировать клиентов о статусе заказов, свежем контенте в блоге, последних обновлениях и распродажах.
  2. Имеют высокий показатель кликабельности. Пуш-кампании имеют высокий CTR, так как привлекают внимание пользователей на любом сайте.
  3. Отправлять пуш-уведомления можно определённым группам, а не слать всем без разбора. Так предложения могут быть более персонализированы.
  4. Гибкость настройки стиля уведомления.
  5. Подписка и отписка за пару кликов. Чтобы подписаться, нужно нажать всего на одну кнопку во всплывающем окне браузера. Отписаться от пушей так же просто.
  6. Вся информация сразу. Нет необходимости открывать уведомление — всё отображается прямо во всплывающем окне.
  7. Предоставляют возможность офлайн-рассылки. Если подписчики были не в сети, когда вы отправили пуш-кампанию, они всё равно увидят её, как только подключатся к интернету.
  8. Поддерживаются всеми популярными браузерами. Google Chrome, Firefox, Opera и даже смартфоны поддерживают получение пуш-уведомлений.
  9. Исключают спам. Пуш-уведомления исключают отправку спама, так как пользователям не нужно предоставлять личную информацию. Сразу после подтверждения запроса на подписку посетителю присваивается идентификатор, который позволяет отправлять пуш-сообщения.
  10. Легко устанавливаются. С помощью нескольких строк кода можно легко настроить подходящий сервис уведомлений.

Недостатки веб пуш-уведомлений

  1. Не вовремя. Зачастую уведомления просто отвлекают — особенно те, на которые давно подписались, но уже забыли. Или, наоборот, стоит отойти от компьютера, так приходит уведомление с важной информацией, которую очень легко «проворонить», ведь пуш-уведомление висит около 15 секунд.
  2. Недобросовестные рассылки. Не все маркетологи умеют настраивать персонализированные рассылки, поэтому нередко вместо полезной информации приходит неинтересная реклама.
  3. Автоматическая отписка при очистке cookie/кэша. Для возобновления необходимо снова возвращаться на сайт.
  4. Короткое время для коммуникации. Пуши скроются через несколько секунд или клиент их быстро закроет.
  5. Большой процент недоставок. Если клиент долгое время не заходит на сайт, его пуш-токен (идентификатор) устаревает. Web push не будет доставляться такому клиенту, пока он снова не зайдёт на сайт.
  6. Возможная блокировка. В последних версиях Chrome и Firefox добавлена блокировка всплывающих окон пуш-подписки.

Ограничения

Мобайл-пуши
— Не все телефоны поддерживают пуш-уведомления. Правда, ограничения эти очень условные — большинство пользователей уже сейчас могут получить мобильный пуш. По данным Apple мобильные пуши для iOS поддерживаются 94% устройств. Для Android — 99,4%. Пуши с рич-контентом поддерживает чуть меньше устройств.
— Небольшой объём. Заголовок от 25 до 50 символов и текст до 150. Но нужно не забывать выносить оффер в первые строчки пуша, иначе он просто скроется. Кнопки показываются только при разворачивании пуша в центре уведомлений.

Веб-пуши
— Ограничения по дизайну. Пуши могут быть ограничены по количеству символов в заголовках, по контенту и по другим характеристикам.
— Различия по браузерам. При подготовке пуша нужно знать, какой браузер и что не отобразит.

Метрики и бенчмарки

— Повышают вовлечённость пользователей. Как показывают исследования, увеличить показатель возможно до 88%.

— Возвращают пользователей. Поднять Retention rates в 3–10 раз с пуш-уведомлениями реально. Исследования показывают, что бренды, которые начнут рассылку пушей, могут за 90 дней повысить показатель Retention на 190%.

— Увеличивают открываемость уведомлений. Пуш-сообщения открывают чаще, чем письма email-рассылки: Opening rate пушей выше на 50%, а Click rate в 7 раз.

— «Ловят» клиентов по геолокациям. 53% пользователей готовы поделиться своей текущей локацией. Бизнес может отслеживать их устройства и автоматически присылать информацию об актуальных предложениях рядом.

— Продвигают пользователя по воронке продаж. Согласно исследованиям, 48% клиентов покупают после того, как получили пуш-уведомление.

Инструменты и возможности персонализации

Механики и примеры

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

Получение дополнительных контактов клиента

Часто клиенты устанавливают приложение, но не оставляют свои контакты. С помощью Mindbox выделяем таких клиентов в сегмент и отправляем пуш. Цель пуша — мотивировать клиента зарегистрироваться и оставить email или телефон.

Брошенная корзина с автоподстановкой товара

Триггерный пуш для клиентов, которые добавили товар в корзину, но не оформили заказ, — напоминание о товаре и предложение завершить покупку.

Что такое сервис push‑уведомлений?

Сервис push-уведомлений – это технология, которую приложение использует для отправки сообщений пользователям. Вы, вероятно, видели всплывающие уведомления приложений или оповещения на вашем мобильном устройстве. Это коммуникационные сигналы, поступающие с сервера приложений. Сервер, а не пользователь инициирует обмен push-уведомлениями. Приложения используют push-уведомления, чтобы информировать пользователей о новых предложениях, событиях приложений или другой потенциально интересной информации. Хотя мобильные push-уведомления являются наиболее распространенным типом, существуют также push-уведомления в браузере, портативных устройствах, а также голосовые push-уведомления.

В чем преимущества использования сервиса push-уведомлений?

За последние несколько лет сервисы push-уведомлений стали неотъемлемой частью мобильных приложений. В 2009 году компания Apple выпустила первую версию сервиса уведомлений Apple Push Notification (APNs) для iOS, который давал издателям приложений возможность отправлять сообщения пользователям, не требуя от них открытия приложения. Google запустила сервис push-уведомлений для Android в 2012 году. Ваши пользователи могут рассчитывать на push-уведомления как на функцию, которая может помочь и вам, и вашим пользователям.

Ниже описаны несколько преимуществ использования сервиса push-уведомлений.

Усиление взаимодействия

Push-уведомления – эффективный способ привлечь пользователей. Вы можете использовать push-уведомления, чтобы отправлять пользователям актуальную информацию, напоминать им об использовании вашего приложения и предлагать воспользоваться функциями и рекламными акциями. Многочисленные исследования показывают, что push-уведомления открываются чаще, чем электронные письма, SMS-сообщения и приложения чата.

Повышение уровня удержания пользователей

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

Улучшение контроля для пользователей

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

Как можно использовать сервис push-уведомлений?

Вот несколько наиболее распространенных способов использования push-уведомлений в организациях.

Маркетинговые кампании

Push-уведомления часто используются для маркетинговых кампаний. Сведения об акциях, скидках, выпуске новых продуктов и других важных обновлениях отправляются непосредственно на устройства ваших пользователей.

Push-уведомления – это эффективный способ продвигать кампании и побуждать пользователей к действиям. Например, вы можете предложить им загрузить новое приложение, подписаться на сервис или приобрести понравившиеся продукты.

Успешные кампании push-уведомлений также помогают вернуть прежних клиентов.

Уведомления о транзакциях

Push-уведомления могут предупреждать пользователей о таких транзакциях, как финансовая активность на их счетах. Например, банки используют push-уведомления для оповещения клиентов о депозитах, снятии средств, обновлениях баланса счетов и других изменениях на счетах.

Push-уведомления помогают клиентам следить за своими финансами и быть в курсе любых подозрительных действий. Вы также можете использовать push-уведомления для отправки клиентам напоминаний об оплате и других уведомлений о предстоящих транзакциях.

Одноразовые пароли

Push-уведомления могут содержать одноразовые пароли (OTP), позволяющие проверять аккаунты пользователей. Например, когда пользователь пытается войти в систему или совершить покупку, вы можете отправить одноразовый пароль на мобильное устройство пользователя. Затем клиент введет одноразовый пароль, чтобы выполнить действие. Так вы сможете подтвердить личность пользователя, не сохраняя конфиденциальную информацию. В более общем плане OTP – это один из аспектов многофакторной аутентификации (MFA).

Экстренные оповещения

Государственные организации могут использовать push-уведомления для оповещения общественности о чрезвычайных ситуациях. Это могут быть оповещения о стихийных бедствиях, а также о других чрезвычайных ситуациях, таких как предупреждения о похищении детей (AMBER Alert), террористические угрозы и предупреждения об экстремальных погодных условиях.

Медицинские сервисы

Push-уведомления могут отправлять пользователям медицинскую информацию, такую как новости о назначении врача, напоминания о приеме лекарств и результаты анализов. Кроме того, push-уведомления могут напоминать пациентам о необходимости принимать лекарства или записываться на повторные визиты.

Обновления по доставке

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

Отзывы клиентов

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

Социальные сети

Если вы запустите приложение для социальных сетей, то можете отправлять своим пользователям push-уведомления об обновлениях, таких как новые публикации и комментарии. Когда вы отправляете пользователям уведомления о появлении нового контента, они могут быстро получить доступ к последним новостям и ознакомиться с ними, не проверяя обновления вручную.

Какие существуют типы push-уведомлений?

Существует два основных типа push-уведомлений: «от приложения пользователю» (A2P) и индивидуальные сообщения (P2P).

A2P

Push-уведомления A2P отправляются из приложения или сервиса отдельному пользователю. В качестве примеров можно привести новости и оповещения, рекламные сообщения и сообщения о транзакциях.

P2P

P2P-уведомления отправляются напрямую от одного пользователя другому, обычно для уведомления получателя о событии или действии. Сюда входят сообщения в чате, запросы на добавление в друзья, напоминания и обновления местоположения.

Как работают push-уведомления?

Чтобы push-уведомление появилось, издатель должен его отправить, пользователь – получить, а сервис – соединить обе стороны. Отношения между этими тремя сторонами выглядят следующим образом:

  • Издатель использует сервер приложений для отправки уведомлений своим пользователям.
  • Пользователь соглашается получать уведомления, подписавшись на них со своего устройства.
  • Сервис push-уведомлений для конкретной платформы связывает издателя с его пользователями.

Если вы разрабатываете мобильное приложение, обратите внимание на основные действия, которые необходимо предпринять, если вы хотите начать отправлять push-уведомления.

Зарегистрируйте приложение с помощью сервиса push-уведомлений

Вам следует подключиться к сервису push-уведомлений отдельных платформ, на которые вы хотите настроить нацеливание. Например, вам следует спроектировать приложение так, чтобы оно подключалось к сервису Apple Push Notification (APNs) для пользователей iOS и Firebase Cloud Messaging (FCM) для пользователей Android. Вы можете зарегистрировать свое приложение в сервису push-уведомлений, чтобы получить доступ к API сервиса.

Обработайте сервисные токены

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

Начните отправлять уведомления

Сервер приложений отправляет содержимое уведомления и токены устройства в API сервиса push-уведомлений. Как только сервер отправит запрос в сервис push-уведомлений, сервис отправляет уведомление на устройства ваших пользователей.

Уведомление отображается на экранах блокировки устройств, в центрах уведомлений или значках приложений в зависимости от настроек пользователей. Затем пользователи могут нажать на уведомление, чтобы перейти в ваше приложение или на веб-сайт.

Как AWS может удовлетворить ваши требования к push-уведомлениям?

В Amazon Web Services (AWS) мы предлагаем Простой сервис уведомлений Amazon (Amazon SNS) для удовлетворения ваших требований к push-уведомлениям.

Amazon SNS – это полностью управляемый сервис отправки сообщений по модели «издатель – подписчик» (pub/sub) для обмена сообщениями между приложениями (A2A), а также между приложениями и пользователями (A2P). Он выступает в роли посредника между вашим приложением и различными сервисами push-уведомлений на мобильных платформах, что позволяет быстрее масштабироваться.

Для обмена сообщениями A2A Amazon SNS обеспечивает обмен push-уведомлениями между распределенными системами, микросервисами и бессерверными приложениями на основе событий по модели «многие-ко-многим». Для обмена сообщениями A2P Amazon SNS дает возможность общаться с клиентами с помощью SMS-сообщений, push-уведомлений и электронных писем.

Ниже перечислены другие преимущества использования Amazon SNS.

  • Интеграция приложений с передачей сообщений по принципу «первым получено – первым отправлено»
  • Безопасное шифрование оповещений при доставке
  • Сбор и рассылка данных о событиях для более 60 сервисов AWS
  • Отправка push-уведомлений и SMS-сообщений клиентам по всему миру

Начните работу с push-уведомлениями на AWS, создав бесплатный аккаунт AWS уже сегодня.

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

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