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

Начиная с Android 8.0 (уровень API 26), все уведомления должны быть привязаны к каналу. Для каждого канала можно настроить визуальное и звуковое поведение, применяемое ко всем уведомлениям в этом канале. Пользователи могут изменять эти настройки и решать, какие каналы уведомлений вашего приложения могут быть навязчивыми или видимыми.

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

Настройки каналов уведомлений для каждого приложения доступны в системных настройках, как показано на рисунке 1.

Рисунок 1. Настройки уведомлений для приложения «Часы» и одного из его каналов.

После создания канала уведомлений изменить его поведение уже нельзя. На этом этапе пользователь полностью контролирует процесс. Однако вы по-прежнему можете изменить название и описание канала.

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

При использовании Android 8.0 (уровень API 26) или выше необходимо реализовать один или несколько каналов уведомлений. Если значение targetSdkVersion установлено на 25 или ниже, то при работе приложения на Android 8.0 (уровень API 26) или выше оно будет вести себя так же, как и на устройствах под управлением Android 7.1 (уровень API 25) или ниже.

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

Для создания канала уведомлений выполните следующие действия:

  1. Создайте объект NotificationChannel с уникальным идентификатором канала, видимым для пользователя именем и уровнем важности.

  2. При желании, с помощью функции setDescription() можно указать описание, которое пользователь увидит в системных настройках.

  3. Зарегистрируйте канал уведомлений, передав его в функцию createNotificationChannel() .

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

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create the NotificationChannel.
      val name = getString(R.string.channel_name)
      val descriptionText = getString(R.string.channel_description)
      val importance = NotificationManager.IMPORTANCE_DEFAULT
      val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
      mChannel.description = descriptionText
      // Register the channel with the system. You can't change the importance
      // or other notification behaviors after this.
      val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
      notificationManager.createNotificationChannel(mChannel)
  }

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

По умолчанию все уведомления, отправляемые в заданный канал, используют визуальное и звуковое поведение, определяемое уровнем важности из класса NotificationManagerCompat , например, IMPORTANCE_DEFAULT или IMPORTANCE_HIGH . Дополнительную информацию об уровнях важности см. в следующем разделе.

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

Также можно создать несколько каналов уведомлений за одну операцию, вызвав метод createNotificationChannels() .

Установите уровень важности

Важность канала влияет на уровень прерывания всех уведомлений, отправляемых в канал. Укажите его в конструкторе NotificationChannel , используя один из пяти уровней важности, от IMPORTANCE_NONE(0) до IMPORTANCE_HIGH(4) .

Для поддержки устройств под управлением Android 7.1 (уровень API 25) или ниже необходимо также вызывать setPriority() для каждого уведомления, используя константу приоритета из класса NotificationCompat .

Константы важности ( NotificationManager.IMPORTANCE_* ) и приоритета ( NotificationCompat.PRIORITY_* ) соответствуют параметрам важности, отображаемым пользователю, как показано в следующей таблице.

Уровень важности, видимый пользователю Важность (Android 8.0 и выше) Приоритетный (Android 7.1 и ниже)
Срочный
Издает звук и отображается в виде всплывающего уведомления.
IMPORTANCE_HIGH PRIORITY_HIGH или PRIORITY_MAX
Высокий
Издает звук.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Середина
Не издает ни звука.
IMPORTANCE_LOW PRIORITY_LOW
Низкий
Не издает никаких звуков и не отображается в строке состояния.
IMPORTANCE_MIN PRIORITY_MIN
Никто
Не издает никаких звуков и не отображается в строке состояния или в подсветке экрана.
IMPORTANCE_NONE N/A

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

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

Информацию о выборе подходящего уровня приоритета см. в разделе «Уровни приоритета» в руководстве по проектированию уведомлений .

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

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

  1. Получите объект NotificationChannel , вызвав getNotificationChannel() или getNotificationChannels() .

  2. Запросите настройки конкретного канала, такие как getVibrationPattern() , getSound() и getImportance() .

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

Откройте настройки канала уведомлений.

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

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

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

  val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
      putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
      putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
  }
  startActivity(intent)

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

Удалить канал уведомлений

Удалить каналы уведомлений можно, вызвав deleteNotificationChannel() . Следующий пример кода демонстрирует, как это сделать:

  // The id of the channel.
  val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  val id: String = "my_channel_01"
  notificationManager.deleteNotificationChannel(id)

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

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

Рисунок 2. Настройки канала уведомлений с указанием групп для личных и рабочих учетных записей.

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

  • Личный аккаунт с двумя каналами:

    • Новые комментарии

    • Разместите рекомендации

  • Бизнес-аккаунт с двумя каналами:

    • Новые комментарии

    • Разместите рекомендации

Сгруппирование каналов уведомлений по категориям для каждой учетной записи позволяет пользователям различать их.

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

  // The id of the group.
  val groupId = "my_group_01"
  // The user-visible name of the group.
  val groupName = getString(R.string.group_name)
  val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  <b>notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))</b>

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

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