Начиная с Android 8.0 (уровень API 26), все уведомления должны быть назначены каналу. Для каждого канала можно задать визуальные и звуковые настройки, которые будут применяться ко всем уведомлениям в этом канале. Пользователи могут менять эти настройки и решать, какие каналы уведомлений из вашего приложения могут быть навязчивыми или видимыми.
Посмотрите видео ниже, чтобы узнать больше о каналах и других функциях уведомлений в Android 8.0.
Пользовательские настройки каналов уведомлений доступны для каждого приложения в системных настройках, как показано на рисунке 1.
После создания канала уведомлений вы не сможете изменить поведение уведомлений. В этот момент пользователь полностью контролирует ситуацию. Однако вы по-прежнему можете изменить название и описание канала.
Создайте канал для каждого типа уведомлений, которые вы хотите отправлять. Вы также можете создать каналы уведомлений, чтобы отразить выбор пользователей. Например, можно настроить отдельные каналы уведомлений для каждой группы чатов, созданной пользователем в мессенджере.
Если вы настраиваете таргетинг на Android 8.0 (уровень API 26) или более поздней версии, необходимо реализовать один или несколько каналов уведомлений. Если для параметра targetSdkVersion задано значение 25 или ниже, то на устройствах с Android 8.0 (уровень API 26) или более поздней версии приложение будет работать так же, как на устройствах с Android 7.1 (уровень API 25) или более ранней версии.
Как создать канал уведомлений
Чтобы создать канал уведомлений, выполните следующие действия:
Создайте объект
NotificationChannelс уникальным идентификатором канала, видимым пользователю названием и уровнем важности.При необходимости укажите описание, которое пользователь увидит в системных настройках, с помощью
setDescription().Зарегистрируйте канал уведомлений, передав его в
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 изменить уровень важности нельзя. Однако пользователь может в любое время изменить настройки каналов вашего приложения.
Подробную информацию о выборе подходящего уровня приоритета можно найти в разделе "Уровни приоритета" руководства по дизайну уведомлений.
Чтение настроек канала уведомлений
Пользователи могут изменять настройки каналов уведомлений, в том числе вибрацию и звук оповещения. Чтобы узнать, какие настройки пользователь применяет к вашим каналам уведомлений, выполните следующие действия:
Получите объект
NotificationChannel, вызвавgetNotificationChannel()илиgetNotificationChannels().Запросите настройки конкретного канала, например
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)
Как создать группу каналов уведомлений
Если вы хотите упорядочить каналы в настройках, создайте группы каналов. Это удобно, если ваше приложение поддерживает несколько аккаунтов пользователей, поскольку позволяет создать группу каналов уведомлений для каждого аккаунта. Группы каналов помогают пользователям различать и контролировать несколько каналов уведомлений с одинаковыми названиями.
Например, в приложении социальной сети может быть поддержка личных и рабочих аккаунтов. В этом сценарии для каждого аккаунта может потребоваться несколько каналов уведомлений с одинаковыми функциями и названиями, например:
Личный аккаунт с двумя каналами:
Новые комментарии
Рекомендации по публикациям
Аккаунт компании с двумя каналами:
Новые комментарии
Рекомендации по публикациям
Объединение каналов уведомлений в группы для каждого аккаунта позволяет пользователям различать их.
Каждой группе каналов уведомлений требуется идентификатор, который должен быть уникальным в пределах пакета, а также название, видимое пользователю. В следующем фрагменте кода показано, как создать группу каналов уведомлений.
fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) { val notificationManager = ContextCompat.getSystemService(context, NotificationManager::class.java) notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName)) }
После создания группы вы можете вызвать метод setGroup(), чтобы связать с ней новый объект NotificationChannel.
После отправки канала в менеджер уведомлений вы не сможете изменить связь между каналом уведомлений и группой.