Notification Channel (canale di notifica) è un meccanismo di Android, introdotto nella versione 8.0 (API 26), che raggruppa le notifiche per categoria e dà all’utente il controllo sul loro comportamento. Ogni canale definisce il livello di importanza, il suono, la vibrazione e l’aspetto visivo per tutte le notifiche inviate tramite esso. Secondo Android Developers, NotificationChannel è obbligatorio per tutte le notifiche su Android 8+ — senza di esso, le notifiche non vengono visualizzate.
Punti chiave
Notification Channel è un contenitore logico per notifiche dello stesso tipo in Android 8+ (Oreo). Lo sviluppatore crea un canale con un ID univoco, imposta i suoi parametri e poi invia ogni notifica specificando questo canale. Tutte le notifiche in un canale ereditano le sue impostazioni.
Prima di Android 8, la gestione delle notifiche era binaria: tutto o niente. L’utente poteva solo disattivare completamente tutte le notifiche dell’app. I canali hanno risolto questo problema: ora puoi disattivare le notifiche “pubblicitarie” ma mantenere i “messaggi dagli amici.”
Dopo aver creato un canale, la sua importanza può essere modificata dall’utente in qualsiasi momento tramite Impostazioni → App → Notifiche. Lo sviluppatore non può modificare l’importanza a livello di programmazione dopo la creazione del canale — questa è una restrizione di sicurezza di Android.
Su Android 8+, ogni notifica deve essere inviata tramite un NotificationChannel. Se un’app tenta di mostrare una notifica senza canale, il sistema la ignora silenziosamente. L’eccezione sono le notifiche tramite NotificationCompat con un canale predefinito, creato automaticamente dalla libreria.
Un canale di notifica è definito da un insieme di parametri impostati quando viene creato tramite la classe NotificationChannel. Il parametro principale è il livello di importanza, che determina come la notifica interagisce con l’utente.
Dopo la creazione, il canale appare nelle impostazioni di notifica del sistema. L’utente può modificare l’importanza, disattivare il suono, la vibrazione o bloccare completamente il canale. Tutte le modifiche hanno effetto immediato per tutte le notifiche successive.
Quando si crea un NotificationChannel, è possibile configurare: suono (personalizzato o di sistema), vibrazione (pattern e durata), indicatore luminoso (colore LED), icona badge (setShowBadge), schermata di blocco (setLockscreenVisibility) e modalità non disturbare (setBypassDnd). Questi parametri vengono fissati al momento della creazione del canale e possono essere modificati solo dall’utente in seguito.
Il livello di importanza è il parametro principale di un canale. Determina se la notifica riprodurrà un suono, apparirà sullo schermo o verrà semplicemente posizionata nell’ombra. L’importanza non deve essere confusa con la priorità — l’importanza è impostata dal canale, e la priorità (setPriority) viene ignorata su Android 8+.
| Livello | Costante | Comportamento | Suono |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Mostra banner heads-up, appare nell’ombra | Sì |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Appare nell’ombra, senza heads-up | Sì |
| LOW | IMPORTANCE_LOW (2) | Appare nell’ombra senza suono | No |
| MIN | IMPORTANCE_MIN (1) | Solo nell’ombra, senza suono o vibrazione | No |
| NONE | IMPORTANCE_NONE (0) | Non viene visualizzato affatto | No |
Per la maggior parte degli scenari utente, utilizza IMPORTANCE_DEFAULT (3) — la notifica apparirà nell’ombra con suono ma senza banner pop-up. Utilizza IMPORTANCE_HIGH solo per eventi critici: chiamata in arrivo, messaggio da un contatto, promemoria timer.
Il canale viene creato una volta all’avvio dell’app o al primo utilizzo. La pratica migliore è creare tutti i canali all’avvio dell’app, nel metodo Application.onCreate. Ricreare un canale esistente è sicuro — Android ignora la chiamata se il canale esiste già.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Messaggi",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Notifiche di nuovi messaggi"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Promozioni e novità",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Notifiche di marketing e offerte speciali"
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"
}
}
Quando invii una notifica, specifica l’ID del canale tramite setChannelId (per NotificationCompat) o nel costruttore Notification.Builder. Se il canale con l’ID specificato non esiste, la notifica non verrà mostrata, ma non si verificherà alcun errore.
Android fornisce diverse API per la gestione programmatica dei canali: ottenere l’elenco, eliminare e verificare le impostazioni correnti. L’eliminazione di un canale comporta la rimozione di tutte le sue notifiche dalla cronologia di sistema.
val manager =
getSystemService(NotificationManager::class.java)
// Ottenere elenco di tutti i canali
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Canali", "${channel.id}: ${channel.importance}")
}
// Conoscere l’importanza corrente (l’utente potrebbe averla modificata)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// L’utente ha disattivato il canale
suggestEnablingChannel()
}
// Elimina canale
manager.deleteNotificationChannel(CHANNEL_PROMO)
Dopo la creazione di un canale, lo sviluppatore non può modificarne l’importanza a livello di programmazione — questa è una restrizione di Android per proteggere l’utente da abusi. Se devi modificare l’importanza di un canale, crea un nuovo canale con un ID diverso e migra le notifiche.
Se devi modificare l’importanza di un canale esistente, crea un nuovo canale con un ID diverso (es. “messages_v2”) e inizia a inviare notifiche ad esso. Il vecchio canale può essere eliminato tramite deleteNotificationChannel — tutte le sue notifiche verranno rimosse dalla cronologia. Avvisa l’utente della migrazione tramite l’interfaccia dell’app in modo che non perda le sue impostazioni.
NotificationChannelGroup combina più canali in un gruppo visivo nell’interfaccia delle impostazioni di Android. I gruppi aiutano l’utente a navigare quando l’app utilizza 5+ canali: ad esempio, “Social,” “Sistema,” “Marketing.”
Un gruppo viene creato tramite createNotificationChannelGroup e passato al canale al momento della creazione tramite il metodo setGroup. L’eliminazione di un gruppo elimina anche tutti i suoi canali. Ogni canale può appartenere a un solo gruppo.
In pratica, i gruppi di canali sono raccomandati per le app con più di 3 canali. Semplificano la navigazione nelle impostazioni e riducono la probabilità che l’utente disattivi tutte le notifiche in una volta senza comprendere l’elenco dei canali.
Un gruppo viene creato tramite createNotificationChannelGroup con un ID e un nome univoci. Quindi ogni canale viene assegnato al gruppo tramite il metodo setGroup. Nelle impostazioni di sistema, il gruppo appare come una sezione con un’intestazione, sotto la quale sono elencati tutti i canali di questo gruppo. Se un gruppo viene eliminato, tutti i suoi canali vengono automaticamente rimossi dal sistema senza possibilità di recupero.
Una corretta progettazione dei canali di notifica influisce direttamente sull’esperienza utente e sulla fidelizzazione. Il pattern principale è tre livelli di importanza: canale critico (IMPORTANCE_HIGH) per messaggi e chiamate, standard (IMPORTANCE_DEFAULT) per notifiche generali e silenzioso (IMPORTANCE_LOW) per marketing e notizie. Questa gradazione offre all’utente una scelta chiara senza sovraccarico.
Il secondo pattern è un canale per modulo funzionale. Ogni modulo principale dell’app (chat, ordini, feed, marketing) ha il proprio canale. Se ci sono più di 5 moduli, combinali in un NotificationChannelGroup. Nelle impostazioni di sistema, il gruppo appare come una sezione con elementi comprimibili — questo semplifica la navigazione.
Il terzo pattern è un canale per sviluppatori. Crea un canale separato con IMPORTANCE_MIN per notifiche di debug e servizio. Gli utenti non li vedranno nell’ombra, ma lo sviluppatore può analizzare i log tramite adb. In produzione, questo canale può essere eliminato o nascosto dall’interfaccia tramite Intent nelle impostazioni.
Il quarto pattern è il feedback del canale. Mostra all’utente nell’interfaccia quali canali sono attivi e qual è la loro importanza corrente. Su Android 8+, puoi ottenere lo stato del canale tramite getNotificationChannel e offrire all’utente di modificare le impostazioni se il canale è disattivato. Questo è particolarmente importante per le funzioni critiche dell’app.
Domande frequenti
La notifica non verrà visualizzata né nell’ombra né nel vassoio. Il sistema ignora silenziosamente la chiamata notify(). Eccezioni: quando si utilizza NotificationCompat, la libreria crea un canale predefinito, ma la sua importanza è sempre DEFAULT. Si consiglia di creare sempre i propri canali.
Puoi modificare il nome, la descrizione e il suono di un canale. Non puoi modificare l’importanza — questa decisione è protetta dal sistema contro lo sviluppatore. Se devi aumentare l’importanza, crea un nuovo canale con un ID diverso e usalo per le nuove notifiche. L’utente può modificare l’importanza in qualsiasi momento.
Usa getNotificationChannel e controlla l’importanza: se il valore è IMPORTANCE_NONE, il canale è disattivato. Puoi anche aprire le impostazioni di sistema del canale tramite Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS con i parametri app_package e channel_id.
Non ci sono limiti — Android non imposta un limite al numero di canali. Tuttavia, si raccomanda di non creare più di 5–10 canali per non sovraccaricare l’utente di scelte. Il minimo ottimale è di 2–3 canali: notifiche critiche, regolari e di marketing.
Su Android 7.1 (API 25) e versioni precedenti, i canali non sono supportati. La classe NotificationChannel è disponibile solo dall’API 26. Per la compatibilità all’indietro, usa NotificationCompat e racchiudi la creazione del canale in una condizione: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche