Notification Channel (kanał powiadomień) — to mechanizm Android, wprowadzony w wersji 8.0 (API 26), który grupuje powiadomienia według kategorii i daje użytkownikowi kontrolę nad ich zachowaniem. Każdy kanał określa poziom ważności, dźwięk, wibrację i wygląd wizualny dla wszystkich powiadomień wysłanych przez niego. Według Android Developers, NotificationChannel jest obowiązkowy dla wszystkich powiadomień na Android 8+ — bez niego powiadomienia nie są wyświetlane.
Najważniejsze
Notification Channel — to logiczny kontener dla powiadomień jednego typu w Android 8+ (Oreo). Deweloper tworzy kanał z unikalnym ID, ustawia jego parametry, a następnie wysyła każde powiadomienie z określeniem tego kanału. Wszystkie powiadomienia w jednym kanale dziedziczą jego ustawienia.
Przed Android 8 zarządzanie powiadomieniami było binarne: wszystko albo nic. Użytkownik mógł tylko całkowicie wyłączyć powiadomienia aplikacji. Kanały rozwiązały ten problem: teraz można wyłączyć powiadomienia reklamowe, ale pozostawić wiadomości od znajomych.
Po utworzeniu kanału jego ważność (importance) może być zmieniona przez użytkownika w dowolnym momencie poprzez Ustawienia → Aplikacje → Powiadomienia. Deweloper nie może programowo zmienić importance po utworzeniu kanału — to ograniczenie bezpieczeństwa Android.
Na Android 8+ każde powiadomienie musi być wysłane przez NotificationChannel. Jeśli aplikacja spróbuje pokazać powiadomienie bez kanału — system po cichu je zignoruje. Wyjątek — powiadomienia przez NotificationCompat z domyślnym kanałem, który jest tworzony automatycznie przez bibliotekę.
Kanał powiadomień jest określany przez zestaw parametrów, które są ustawiane podczas jego tworzenia za pomocą klasy NotificationChannel. Głównym parametrem jest poziom ważności (importance level), który określa, jak powiadomienie oddziałuje z użytkownikiem.
Po utworzeniu kanał pojawia się w systemowych ustawieniach powiadomień. Użytkownik może zmienić importance, wyłączyć dźwięk, wibrację lub całkowicie zablokować kanał. Wszystkie zmiany wchodzą w życie natychmiastowo dla wszystkich kolejnych powiadomień.
Podczas tworzenia NotificationChannel można skonfigurować: dźwięk (niestandardowy lub systemowy), wibrację (wzór i czas trwania), wskaźnik świetlny (kolor LED), odznakę (setShowBadge), widoczność na ekranie blokady (setLockscreenVisibility) oraz tryb Nie przeszkadzać (setBypassDnd). Te parametry są ustalane podczas tworzenia kanału i mogą być później zmienione tylko przez użytkownika.
Poziom ważności (importance) — główny parametr kanału. Określa, czy powiadomienie będzie odtwarzać dźwięk, pojawiać się na ekranie, czy po prostu trafić do cienia. Ważności nie należy mylić z priorytetem — importance jest ustawiane przez kanał, a priorytet (setPriority) jest ignorowany na Android 8+.
| Poziom | Stała | Zachowanie | Dźwięk |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Pokazuje baner heads-up, pojawia się na pasku powiadomień | Tak |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Pojawia się na pasku powiadomień, bez heads-up | Tak |
| LOW | IMPORTANCE_LOW (2) | Pojawia się na pasku powiadomień bez dźwięku | Nie |
| MIN | IMPORTANCE_MIN (1) | Tylko w cieniu, bez dźwięku i wibracji | Nie |
| NONE | IMPORTANCE_NONE (0) | Nie wyświetla się w ogóle | Nie |
Dla większości scenariuszy użytkownika używaj IMPORTANCE_DEFAULT (3) — powiadomienie pojawi się na pasku z dźwiękiem, ale bez wyskakującego banera. IMPORTANCE_HIGH używaj tylko do krytycznych zdarzeń: połączenie przychodzące, wiadomość od rozmówcy, przypomnienie z timerem.
Kanał tworzy się jednorazowo podczas uruchamiania aplikacji lub przy pierwszym użyciu. Najlepszą praktyką jest tworzenie wszystkich kanałów podczas uruchamiania aplikacji, w metodzie Application.onCreate. Ponowne utworzenie istniejącego kanału jest bezpieczne — Android ignoruje wywołanie, jeśli kanał już istnieje.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Wiadomości",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Powiadomienia o nowych wiadomościach"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Promocje i aktualności",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Powiadomienia marketingowe i specjalne oferty"
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"
}
}
Podczas wysyłania powiadomienia wskaż ID kanału przez setChannelId (dla NotificationCompat) lub w konstruktorze Notification.Builder. Jeśli kanał o podanym ID nie istnieje — powiadomienie nie zostanie pokazane, ale błąd nie wystąpi.
Android udostępnia kilka API do programowego zarządzania kanałami: pobieranie listy, usuwanie i sprawdzanie bieżących ustawień. Usunięcie kanału powoduje, że wszystkie jego powiadomienia zostają usunięte z historii przez system.
val manager =
getSystemService(NotificationManager::class.java)
// Pobierz listę wszystkich kanałów
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Kanały", "${channel.id}: ${channel.importance}")
}
// Sprawdź bieżący importance (użytkownik mógł zmienić)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// Użytkownik wyłączył kanał
suggestEnablingChannel()
}
// Usuń kanał
manager.deleteNotificationChannel(CHANNEL_PROMO)
Po utworzeniu kanału deweloper nie może zmienić jego importance programowo — to ograniczenie Android ma na celu ochronę użytkownika przed nadużyciami. Jeśli trzeba zmienić ważność kanału, utwórz nowy kanał z innym ID i migruj powiadomienia.
Jeśli wymagana jest zmiana ważności istniejącego kanału, utwórz nowy kanał z innym ID (np. “messages_v2”) i zacznij wysyłać do niego powiadomienia. Stary kanał można usunąć przez deleteNotificationChannel — wszystkie jego powiadomienia zostaną usunięte z historii. Poinformuj użytkownika o migracji przez interfejs aplikacji, aby nie stracił ustawień.
NotificationChannelGroup łączy kilka kanałów w jedną wizualną grupę w interfejsie ustawień Android. Grupy pomagają użytkownikowi orientować się, gdy aplikacja używa 5+ kanałów: na przykład „Społecznościowe”, „Systemowe”, „Marketing”.
Grupa jest tworzona przez createNotificationChannelGroup i przekazywana kanałowi podczas jego tworzenia za pomocą metody setGroup. Usunięcie grupy usuwa również wszystkie jej kanały. Każdy kanał może należeć tylko do jednej grupy.
W praktyce grupy kanałów są zalecane dla aplikacji z więcej niż 3 kanałami. Upraszczają nawigację w ustawieniach i zmniejszają prawdopodobieństwo, że użytkownik wyłączy wszystkie powiadomienia naraz, nie rozumiejąc listy kanałów.
Grupa jest tworzona przez createNotificationChannelGroup z unikalnym ID i nazwą. Następnie każdy kanał jest przypisywany do grupy za pomocą metody setGroup. W ustawieniach systemowych grupa jest wyświetlana jako sekcja z nagłówkiem, pod którym znajdują się wszystkie kanały tej grupy. Jeśli grupa zostanie usunięta, wszystkie jej kanały są również automatycznie usuwane przez system bez możliwości przywrócenia.
Prawidłowe projektowanie kanałów powiadomień bezpośrednio wpływa na doświadczenie użytkownika i retencję. Podstawowy wzorzec — trzy poziomy ważności: kanał krytyczny (IMPORTANCE_HIGH) dla wiadomości i połączeń, standardowy (IMPORTANCE_DEFAULT) dla ogólnych powiadomień oraz cichy (IMPORTANCE_LOW) dla marketingu i aktualności. Taka gradacja daje użytkownikowi zrozumiały wybór bez przeciążania.
Drugi wzorzec — kanał według modułu funkcjonalnego. Każdy duży moduł aplikacji (czat, zamówienia, kanał, marketing) otrzymuje swój kanał. Jeśli modułów jest więcej niż 5, łącz je w NotificationChannelGroup. W ustawieniach systemowych grupa jest wyświetlana jako sekcja z ukrywanymi elementami — upraszcza to nawigację.
Trzeci wzorzec — kanał dla dewelopera. Utwórz osobny kanał z IMPORTANCE_MIN dla powiadomień debugowych i serwisowych. Użytkownicy nie zobaczą ich na pasku, ale deweloper może analizować logi przez adb. Na produkcji ten kanał można usunąć lub ukryć z interfejsu przez Intent w ustawieniach.
Czwarty wzorzec — informacja zwrotna o kanałach. Pokazuj użytkownikowi w interfejsie, które kanały są aktywne i jaki mają bieżący importance. Na Android 8+ można uzyskać status kanału przez getNotificationChannel i zaproponować użytkownikowi zmianę ustawień, jeśli kanał jest wyłączony. Jest to szczególnie ważne dla krytycznych funkcji aplikacji.
Często zadawane pytania
Powiadomienie nie zostanie wyświetlone ani na pasku, ani w cieniu. System po cichu zignoruje wywołanie notify(). Wyjątki: przy użyciu NotificationCompat biblioteka tworzy domyślny kanał, ale jego importance zawsze wynosi DEFAULT. Zaleca się zawsze tworzyć własne kanały.
Można zmienić nazwę, opis i dźwięk kanału. Nie można zmienić importance — ta decyzja jest chroniona przez system przed deweloperem. Jeśli trzeba zwiększyć ważność — utwórz nowy kanał z innym ID i używaj go do nowych powiadomień. Użytkownik może zmieniać importance w dowolnym momencie.
Użyj getNotificationChannel i sprawdź importance: jeśli wartość wynosi IMPORTANCE_NONE, kanał jest wyłączony. Można także otworzyć systemowe ustawienia kanału przez Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS z parametrami app_package i channel_id.
Ograniczeń nie ma — Android nie ustanawia limitu liczby kanałów. Jednak zaleca się tworzyć nie więcej niż 5–10 kanałów, aby nie przeciążać użytkownika wyborem. Optymalne minimum to 2–3 kanały: krytyczne powiadomienia, zwykłe i marketingowe.
Na Android 7.1 (API 25) i starszych kanały nie są obsługiwane. Klasa NotificationChannel jest dostępna dopiero od API 26. Dla zgodności wstecznej używaj NotificationCompat i owijaj tworzenie kanału w warunek if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również