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

В 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 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 =
        context.getSystemService(NotificationManager::class.java)
    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, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

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

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

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

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

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

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

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

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

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

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

    • Рекомендации записей

  • Корпоративный аккаунт с двумя каналами:

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

    • Рекомендации записей

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

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

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
}

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

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