Notification Channel (kanál oznámení) — je mechanismus Androidu, zavedený ve verzi 8.0 (API 26), který seskupuje oznámení podle kategorií a dává uživateli kontrolu nad jejich chováním. Každý kanál definuje úroveň důležitosti, zvuk, vibraci a vizuální vzhled pro všechna oznámení odeslaná přes něj. Podle Android Developers je NotificationChannel povinný pro všechna oznámení na Android 8+ — bez něj se oznámení nezobrazují.
Hlavní body
Notification Channel — je logický kontejner pro oznámení stejného typu v Android 8+ (Oreo). Vývojář vytvoří kanál s jedinečným ID, nastaví jeho parametry a poté odesílá každé oznámení s uvedením tohoto kanálu. Všechna oznámení v jednom kanálu dědí jeho nastavení.
Před Androidem 8 bylo řízení oznámení binární: všechno nebo nic. Uživatel mohl pouze úplně vypnout oznámení aplikace. Kanály tento problém vyřešily: nyní lze vypnout reklamní oznámení, ale ponechat zprávy od přátel.
Po vytvoření kanálu může jeho důležitost (importance) uživatel kdykoli změnit přes Nastavení → Aplikace → Oznámení. Vývojář nemůže po vytvoření kanálu importance programově změnit — toto je bezpečnostní omezení Androidu.
Na Android 8+ musí být každé oznámení odesláno přes NotificationChannel. Pokud se aplikace pokusí zobrazit oznámení bez kanálu — systém ho tiše ignoruje. Výjimka — oznámení přes NotificationCompat s výchozím kanálem, který je automaticky vytvořen knihovnou.
Kanál oznámení je definován sadou parametrů, které se nastavují při jeho vytvoření pomocí třídy NotificationChannel. Hlavní parametr — úroveň důležitosti (importance level), který určuje, jak oznámení interaguje s uživatelem.
Po vytvoření se kanál objeví v systémovém nastavení oznámení. Uživatel může změnit importance, vypnout zvuk, vibraci nebo kanál zcela zablokovat. Všechny změny nabývají účinnosti okamžitě pro všechna následující oznámení.
Při vytváření NotificationChannel lze nakonfigurovat: zvuk (vlastní nebo systémový), vibraci (vzor a trvání), světelný indikátor (barva LED), odznak (setShowBadge), viditelnost na uzamčené obrazovce (setLockscreenVisibility) a režim Nerušit (setBypassDnd). Tyto parametry jsou při vytvoření kanálu fixovány a později je může změnit pouze uživatel.
Úroveň důležitosti (importance) — hlavní parametr kanálu. Určuje, zda oznámení přehraje zvuk, objeví se na obrazovce nebo bude pouze umístěno do stínu. Důležitost nelze zaměňovat s prioritou — importance nastavuje kanál, zatímco priorita (setPriority) je na Android 8+ ignorována.
| Úroveň | Konstanta | Chování | Zvuk |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Zobrazí heads-up banner, objeví se v panelu | Ano |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Objeví se v panelu, bez heads-up | Ano |
| LOW | IMPORTANCE_LOW (2) | Objeví se v panelu bez zvuku | Ne |
| MIN | IMPORTANCE_MIN (1) | Pouze ve stínu, bez zvuku a vibrace | Ne |
| NONE | IMPORTANCE_NONE (0) | Vůbec se nezobrazí | Ne |
Pro většinu uživatelských scénářů použijte IMPORTANCE_DEFAULT (3) — oznámení se objeví v panelu se zvukem, ale bez vyskakovacího banneru. IMPORTANCE_HIGH použijte pouze pro kritické události: příchozí hovor, zpráva od partnera, připomínka s časovačem.
Kanál se vytváří jednou — při spuštění aplikace nebo při prvním použití. Nejlepší praxí je vytvořit všechny kanály při spuštění aplikace, v metodě Application.onCreate. Opětovné vytvoření existujícího kanálu je bezpečné — Android ignoruje volání, pokud kanál již existuje.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Zprávy",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Oznámení o nových zprávách"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Akce a novinky",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Marketingová oznámení a speciální nabídky"
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"
}
}
Při odesílání oznámení uveďte ID kanálu pomocí setChannelId (pro NotificationCompat) nebo v konstruktoru Notification.Builder. Pokud kanál s uvedeným ID neexistuje — oznámení se nezobrazí, ale nevznikne žádná chyba.
Android poskytuje několik API pro programovou správu kanálů: získání seznamu, odstranění a kontrola aktuálního nastavení. Odstranění kanálu způsobí, že systém odstraní všechna jeho oznámení z historie.
val manager =
getSystemService(NotificationManager::class.java)
// Získat seznam všech kanálů
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Kanály", "${channel.id}: ${channel.importance}")
}
// Zjistit aktuální importance (uživatel ho mohl změnit)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// Uživatel vypnul kanál
suggestEnablingChannel()
}
// Odstranit kanál
manager.deleteNotificationChannel(CHANNEL_PROMO)
Po vytvoření kanálu vývojář nemůže programově změnit jeho importance — toto je omezení Androidu na ochranu uživatele před zneužitím. Pokud je třeba změnit důležitost kanálu, vytvořte nový kanál s jiným ID a migrujte oznámení.
Pokud je třeba změnit důležitost existujícího kanálu, vytvořte nový kanál s jiným ID (např. „messages_v2“) a začněte na něj odesílat oznámení. Starý kanál lze odstranit pomocí deleteNotificationChannel — všechna jeho oznámení budou odstraněna z historie. Informujte uživatele o migraci prostřednictvím rozhraní aplikace, aby neztratil nastavení.
NotificationChannelGroup spojuje několik kanálů do jedné vizuální skupiny v rozhraní nastavení Androidu. Skupiny pomáhají uživateli orientovat se, když aplikace používá 5+ kanálů: například „Sociální“, „Systémové“, „Marketing“.
Skupina se vytváří pomocí createNotificationChannelGroup a předává se kanálu při jeho vytvoření metodou setGroup. Odstranění skupiny odstraní také všechny její kanály. Každý kanál může patřit pouze do jedné skupiny.
V praxi jsou skupiny kanálů doporučeny pro aplikace s více než 3 kanály. Zjednodušují navigaci v nastavení a snižují pravděpodobnost, že uživatel vypne všechna oznámení najednou, aniž by rozuměl seznamu kanálů.
Skupina se vytváří pomocí createNotificationChannelGroup s jedinečným ID a názvem. Poté je každý kanál připojen ke skupině metodou setGroup. V systémovém nastavení se skupina zobrazuje jako sekce s nadpisem, pod kterým jsou všechny kanály této skupiny. Pokud je skupina odstraněna, všechny její kanály jsou také automaticky odstraněny systémem bez možnosti obnovení.
Správný návrh kanálů oznámení přímo ovlivňuje uživatelský zážitek a retenci. Základní vzor — tři úrovně důležitosti: kritický kanál (IMPORTANCE_HIGH) pro zprávy a hovory, standardní (IMPORTANCE_DEFAULT) pro obecná oznámení a tichý (IMPORTANCE_LOW) pro marketing a novinky. Taková gradace dává uživateli srozumitelnou volbu bez přetížení.
Druhý vzor — kanál podle funkčního modulu. Každý velký modul aplikace (chat, objednávky, kanál, marketing) dostává svůj kanál. Pokud je modulů více než 5, spojte je do NotificationChannelGroup. V systémovém nastavení se skupina zobrazuje jako sekce se skrytelnými prvky — to zjednodušuje navigaci.
Třetí vzor — kanál pro vývojáře. Vytvořte samostatný kanál s IMPORTANCE_MIN pro ladicí a servisní oznámení. Uživatelé je neuvidí v panelu, ale vývojář může analyzovat protokoly přes adb. V produkci lze tento kanál odstranit nebo skrýt z rozhraní pomocí Intent v nastavení.
Čtvrtý vzor — zpětná vazba o kanálech. Ukažte uživateli v rozhraní, které kanály jsou aktivní a jaká je jejich aktuální importance. Na Android 8+ lze získat stav kanálu pomocí getNotificationChannel a nabídnout uživateli změnu nastavení, pokud je kanál vypnutý. To je obzvláště důležité pro kritické funkce aplikace.
Často kladené otázky
Oznámení se nezobrazí ani v panelu, ani ve stínu. Systém tiše ignoruje volání notify(). Výjimky: při použití NotificationCompat knihovna vytvoří výchozí kanál, ale jeho importance je vždy DEFAULT. Doporučuje se vždy vytvářet vlastní kanály.
Lze změnit název, popis a zvuk kanálu. Nelze změnit importance — toto rozhodnutí je systémem chráněno před vývojářem. Pokud je třeba zvýšit důležitost — vytvořte nový kanál s jiným ID a používejte jej pro nová oznámení. Uživatel může importance změnit kdykoli.
Použijte getNotificationChannel a zkontrolujte importance: pokud je hodnota IMPORTANCE_NONE, kanál je vypnutý. Můžete také otevřít systémová nastavení kanálu pomocí Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS s parametry app_package a channel_id.
Neexistují žádná omezení — Android nestanovuje limit na počet kanálů. Doporučuje se však nevytvářet více než 5–10 kanálů, aby nedošlo k přetížení uživatele výběrem. Optimální minimum jsou 2–3 kanály: kritická oznámení, běžná a marketingová.
Na Android 7.1 (API 25) a starších verzích kanály nejsou podporovány. Třída NotificationChannel je dostupná až od API 26. Pro zpětnou kompatibilitu použijte NotificationCompat a obalte vytvoření kanálu podmínkou if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také