Notification Channel (канал сповіщень) — це механізм Android, введений в версії 8.0 (API 26), який групує сповіщення за категоріями та дає користувачеві контроль над їхньою поведінкою. Кожен канал визначає рівень важливості, звук, вібрацію та візуальне оформлення для всіх сповіщень, надісланих через нього. Згідно з Android Developers, NotificationChannel є обов’язковим для всіх сповіщень на Android 8+ — без нього сповіщення не відображаються.
Головне
Notification Channel — це логічний контейнер для сповіщень одного типу в Android 8+ (Oreo). Розробник створює канал з унікальним ID, задає його параметри, а потім надсилає кожне сповіщення із зазначенням цього каналу. Всі сповіщення в одному каналі успадковують його налаштування.
До Android 8 керування сповіщеннями було бінарним: все або нічого. Користувач міг лише повністю вимкнути всі сповіщення додатка. Канали вирішили цю проблему: тепер можна вимкнути «рекламні» сповіщення, але залишити «повідомлення від друзів».
Після створення каналу його важливість може бути змінена користувачем в будь-який момент через Налаштування → Додатки → Сповіщення. Розробник не може програмно змінити важливість після створення каналу — це обмеження безпеки Android.
На Android 8+ кожне сповіщення повинно надсилатися через NotificationChannel. Якщо додаток спробує показати сповіщення без каналу, система мовчки його ігнорує. Виняток становлять сповіщення через NotificationCompat із типовим каналом, який створюється автоматично бібліотекою.
Канал сповіщень визначається набором параметрів, які задаються при його створенні через клас NotificationChannel. Головний параметр — рівень важливості, який визначає, як сповіщення взаємодіє з користувачем.
Після створення канал з’являється в системних налаштуваннях сповіщень. Користувач може змінити важливість, вимкнути звук, вібрацію або повністю блокувати канал. Всі зміни набувають чинності негайно для всіх наступних сповіщень.
При створенні NotificationChannel можна налаштувати: звук (кастомний або системний), вібрацію (патерн та тривалість), світловий індикатор (колір LED), значок-бедж (setShowBadge), екран блокування (setLockscreenVisibility) та режим не турбувати (setBypassDnd). Ці параметри фіксуються при створенні каналу і можуть бути змінені лише користувачем згодом.
Рівень важливості — головний параметр каналу. Він визначає, чи буде сповіщення відтворювати звук, чи з’явиться на екрані або просто поміститься в тінь. Важливість не можна плутати з пріоритетом — важливість встановлюється каналом, а пріоритет (setPriority) ігнорується на Android 8+.
| Рівень | Константа | Поведінка | Звук |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Показує heads-up банер, з’являється в тіні | Так |
| DEFAULT | IMPORTANCE_DEFAULT (3) | З’являється в тіні, без heads-up | Так |
| LOW | IMPORTANCE_LOW (2) | З’являється в тіні без звуку | Ні |
| MIN | IMPORTANCE_MIN (1) | Тільки в тіні, без звуку та вібрації | Ні |
| NONE | IMPORTANCE_NONE (0) | Не відображається взагалі | Ні |
Для більшості користувацьких сценаріїв використовуйте IMPORTANCE_DEFAULT (3) — сповіщення з’явиться в тіні зі звуком, але без вспливного банера. Використовуйте IMPORTANCE_HIGH тільки для критичних подій: вхідний дзвінок, повідомлення від контакту, нагадування таймера.
Канал створюється одноразово при запуску додатка або при першому використанні. Найкраща практика — створювати всі канали при запуску додатка, в методі Application.onCreate. Повторне створення існуючого каналу безпечне — Android ігнорує виклик, якщо канал вже існує.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Повідомлення",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Сповіщення про нові повідомлення"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Акції та новини",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Маркетингові сповіщення та спеціальні пропозиції"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
При надсиланні сповіщення вкажіть ID каналу через setChannelId (для NotificationCompat) або в конструкторі Notification.Builder. Якщо канал із зазначеним ID не існує, сповіщення не буде показано, але помилка не виникне.
Android надає кілька API для програмного управління каналами: отримання списку, видалення та перевірка поточних налаштувань. Видалення каналу призводить до того, що всі його сповіщення видаляються з історії системи.
val manager =
getSystemService(NotificationManager::class.java)
// Отримати список усіх каналів
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Канали", "${channel.id}: ${channel.importance}")
}
// Дізнатися поточну важливість (користувач міг змінити)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// Користувач вимкнув канал
suggestEnablingChannel()
}
// Видалити канал
manager.deleteNotificationChannel(CHANNEL_PROMO)
Після створення каналу розробник не може змінити його важливість програмно — це обмеження Android для захисту користувача від зловживань. Якщо потрібно змінити важливість каналу, створіть новий канал з іншим ID та мігруйте сповіщення.
Якщо потрібно змінити важливість існуючого каналу, створіть новий канал з іншим ID (наприклад, «messages_v2») та почніть надсилати сповіщення до нього. Старий канал можна видалити через deleteNotificationChannel — всі його сповіщення будуть видалені з історії. Попередьте користувача про міграцію через інтерфейс додатка, щоб він не втратив свої налаштування.
NotificationChannelGroup об’єднує кілька каналів в одну візуальну групу в інтерфейсі налаштувань Android. Групи допомагають користувачеві орієнтуватися, коли додаток використовує 5+ каналів: наприклад, «Соціальні», «Системні», «Маркетинг».
Група створюється через createNotificationChannelGroup та передається каналу при його створенні через метод setGroup. Видалення групи також видаляє всі її канали. Кожен канал може належати лише до однієї групи.
На практиці групи каналів рекомендовані для додатків з більше ніж 3 каналами. Вони спрощують навігацію в налаштуваннях та зменшують ймовірність того, що користувач вимкне всі сповіщення одразу, не розібравшись у списку каналів.
Група створюється через createNotificationChannelGroup з унікальним ID та назвою. Потім кожен канал прив’язується до групи через метод setGroup. В системних налаштуваннях група відображається як розділ з заголовком, під яким подані всі канали цієї групи. Якщо групу видалено, всі її канали також автоматично видаляються системою без можливості відновлення.
Правильне проектування каналів сповіщень безпосередньо впливає на користувацький досвід та утримання. Основний патерн — три рівні важливості: критичний канал (IMPORTANCE_HIGH) для повідомлень та дзвінків, стандартний (IMPORTANCE_DEFAULT) для загальних сповіщень та тихий (IMPORTANCE_LOW) для маркетингу та новин. Така градація дає користувачеві чіткий вибір без перевантаження.
Другий патерн — один канал на функціональний модуль. Кожен основний модуль додатка (чат, замовлення, стрічка, маркетинг) отримує свій канал. Якщо модулів більше ніж 5, об’єднайте їх в NotificationChannelGroup. В системних налаштуваннях група відображається як розділ із згортуваними елементами — це спрощує навігацію.
Третій патерн — це канал для розробника. Створіть окремий канал з IMPORTANCE_MIN для налагоджувальних та сервісних сповіщень. Користувачі не побачать їх в тіні, але розробник може аналізувати логи через adb. На Production цей канал можна видалити або сховати з інтерфейсу через Intent в налаштуваннях.
Четвертий патерн — зворотний зв’язок про канали. Покажіть користувачеві в інтерфейсі, які канали активні та яка їх поточна важливість. На Android 8+ можна отримати статус каналу через getNotificationChannel та запропонувати користувачеві змінити налаштування, якщо канал вимкнено. Це особливо важливо для критичних функцій додатка.
Часті запитання
Сповіщення не відобразиться ні в тіні, ні в панелі. Система мовчки проігнорує виклик notify(). Винятки: при використанні NotificationCompat бібліотека створює типовий канал, але його важливість завжди DEFAULT. Рекомендується завжди створювати власні канали.
Можна змінити назву, опис та звук каналу. Неможливо змінити важливість — це рішення захищене системою від розробника. Якщо потрібно підвищити важливість — створіть новий канал з іншим ID та використовуйте його для нових сповіщень. Користувач може змінювати важливість в будь-який момент.
Використовуйте getNotificationChannel та перевірте важливість: якщо значення IMPORTANCE_NONE, канал вимкнено. Також можна відкрити системні налаштування каналу через Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS з параметрами app_package та channel_id.
Обмежень немає — Android не встановлює ліміту на кількість каналів. Однак рекомендується не створювати більше 5–10 каналів, щоб не перевантажувати користувача вибором. Оптимальний мінімум — 2–3 канали: критичні сповіщення, звичайні та маркетингові.
На Android 7.1 (API 25) та нижче канали не підтримуються. Клас NotificationChannel доступний лише з API 26. Для зворотної сумісності використовуйте NotificationCompat та обгортайте створення каналу в умову: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також