Начиная с 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) или ниже.
Создать канал уведомлений
Чтобы создать канал уведомлений, выполните следующие действия:
Создайте объект
NotificationChannel
с уникальным идентификатором канала, видимым пользователем именем и уровнем важности.При желании укажите описание, которое пользователь увидит в настройках системы с помощью
setDescription()
.Зарегистрируйте канал уведомлений, передав его в
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
изменить уровень важности невозможно. Однако пользователь может в любое время изменить свои настройки каналов вашего приложения.
Информацию о выборе подходящего уровня приоритета см. в разделе «Уровни приоритета» в руководстве по разработке уведомлений .
Прочитать настройки канала уведомлений
Пользователи могут изменять настройки каналов уведомлений, включая такие параметры, как вибрация и звуковые оповещения. Чтобы узнать, какие настройки пользователь применяет к вашим каналам уведомлений, выполните следующие действия:
Получите объект
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, 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
с группой.
После отправки канала в менеджер уведомлений вы не сможете изменить связь между каналом уведомлений и группой.