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

Начиная с 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)
}

Ява

private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is not in the Support Library.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system. You can't change the importance
        // or other notification behaviors after this.
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

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

По умолчанию все уведомления, отправляемые в определенный канал, используют визуальное и звуковое поведение, определяемое уровнем важности из класса 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)

Ява

Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
intent.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)

Ява

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

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

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

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

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

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

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

    • Публикуйте рекомендации

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

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

    • Публикуйте рекомендации

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

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

Котлин

// 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
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))

Ява

// The id of the group.
String groupId = "my_group_01";
// The user-visible name of the group.
CharSequence groupName = getString(R.string.group_name);
NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

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

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