Creare e gestire canali di notifica

A partire da Android 8.0 (livello API 26), tutte le notifiche devono essere assegnate a un canale. Per ogni canale, puoi impostare il comportamento visivo e sonoro da applicare a tutte le notifiche in quel canale. Gli utenti possono modificare queste impostazioni e decidere quali canali di notifica della tua app possono essere invasivi o visibili.

Guarda il video che segue per avere una panoramica dei canali e di altre funzionalità di notifica in Android 8.0.

Le impostazioni utente per i canali di notifica sono disponibili per ciascuna app nelle impostazioni di sistema, come mostrato nella figura 1.

Figura 1. Impostazioni di notifica per l'app Orologio e uno dei suoi canali.

Dopo aver creato un canale di notifica, non puoi modificare i comportamenti delle notifiche. A quel punto, l'utente ha il controllo completo. Tuttavia, puoi ancora modificare il nome e la descrizione di un canale.

Crea un canale per ogni tipo di notifica che devi inviare. Puoi anche creare canali di notifica per riflettere le scelte effettuate dagli utenti. Ad esempio, puoi configurare canali di notifica separati per ogni gruppo di conversazione creato da un utente in un'app di messaggistica.

Se scegli come target Android 8.0 (livello API 26) o versioni successive, devi implementare uno o più canali di notifica. Se il criterio targetSdkVersion è impostato su 25 o su un valore precedente, quando la tua app è installata su Android 8.0 (livello API 26) o versioni successive, si comporta come sui dispositivi con Android 7.1 (livello API 25) o versioni precedenti.

Crea un canale di notifica

Per creare un canale di notifica:

  1. Crea un oggetto NotificationChannel con un ID canale univoco, un nome visibile agli utenti e un livello di importanza.

  2. Se vuoi, specifica la descrizione che l'utente vede nelle impostazioni di sistema con setDescription().

  3. Registra il canale di notifica passandolo a createNotificationChannel().

L'esempio seguente mostra come creare e registrare un canale di notifica:

Kotlin

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)
}

Java

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);
    }
}

La ricreazione di un canale di notifica esistente con i valori originali non esegue alcuna operazione, quindi è consigliabile chiamare questo codice all'avvio di un'app.

Per impostazione predefinita, tutte le notifiche pubblicate su un determinato canale utilizzano i comportamenti visivi e uditivi definiti dal livello di importanza della classe NotificationManagerCompat, ad esempio IMPORTANCE_DEFAULT o IMPORTANCE_HIGH. Consulta la sezione successiva per ulteriori informazioni sui livelli di importanza.

Se vuoi personalizzare ulteriormente i comportamenti predefiniti delle notifiche del tuo canale, puoi chiamare metodi come enableLights(), setLightColor() e setVibrationPattern() su NotificationChannel. Ricorda che una volta creato il canale, non puoi più modificare queste impostazioni e l'utente ha il controllo finale sull'attivazione o meno di questi comportamenti.

Puoi anche creare più canali di notifica in una singola operazione chiamando createNotificationChannels().

Impostare il livello di importanza

L'importanza del canale incide sul livello di interruzione di tutte le notifiche pubblicate sul canale. Specificalo nel costruttore NotificationChannel, utilizzando uno dei cinque livelli di importanza, da IMPORTANCE_NONE(0) a IMPORTANCE_HIGH(4).

Per supportare i dispositivi con Android 7.1 (livello API 25) o versioni precedenti, devi anche chiamare setPriority() per ogni notifica, utilizzando una costante di priorità della classe NotificationCompat.

Le costanti di importanza (NotificationManager.IMPORTANCE_*) e priorità (NotificationCompat.PRIORITY_*) vengono mappate alle opzioni di importanza visibile agli utenti, come mostrato nella tabella seguente.

Livello di importanza visibile all'utente Importanza (Android 8.0 e versioni successive) Priorità (Android 7.1 e versioni precedenti)
Urgente
Emette un suono e viene visualizzato come notifica di avviso.
IMPORTANCE_HIGH PRIORITY_HIGH oppure PRIORITY_MAX
Alta
emette un suono.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Media
Non emette alcun suono.
IMPORTANCE_LOW PRIORITY_LOW
Bassa
Non emette alcun suono e non viene visualizzato nella barra di stato.
IMPORTANCE_MIN PRIORITY_MIN
Nessuno
Non emette alcun suono e non viene visualizzato nella barra di stato o nell'area.
IMPORTANCE_NONE N/A

Tutte le notifiche, indipendentemente dall'importanza, vengono visualizzate in posizioni dell'interfaccia utente di sistema non invasivi, ad esempio nel riquadro a scomparsa delle notifiche e come badge sull'icona in Avvio applicazioni, anche se puoi modificare l'aspetto del badge di notifica.

Una volta inviato il canale al NotificationManager, non puoi più modificare il livello di importanza. Tuttavia, l'utente può modificare le preferenze per i canali dell'app in qualsiasi momento.

Per informazioni sulla scelta di un livello di priorità appropriato, consulta la sezione "Livelli di priorità" nella Guida alla progettazione delle notifiche.

Leggi le impostazioni del canale di notifica

Gli utenti possono modificare le impostazioni dei canali di notifica, inclusi comportamenti quali vibrazione e suoni di avviso. Se vuoi conoscere le impostazioni applicate da un utente ai tuoi canali di notifica, segui questi passaggi:

  1. Per ottenere l'oggetto NotificationChannel, chiama getNotificationChannel() o getNotificationChannels().

  2. Esegui query su impostazioni del canale specifiche, come getVibrationPattern(), getSound() e getImportance().

Se rilevi un'impostazione del canale che a tuo parere inibisce il comportamento previsto per la tua app, puoi suggerire all'utente di cambiarla e intraprendere un'azione per aprire le impostazioni del canale, come mostrato nella sezione successiva.

Apri le impostazioni del canale di notifica

Dopo aver creato un canale di notifica, non puoi modificare in modo programmatico i comportamenti visivi e uditivi del canale di notifica. Solo l'utente può modificare il comportamento del canale dalle impostazioni di sistema. Per consentire agli utenti di accedere facilmente a queste impostazioni di notifica, aggiungi un elemento nell'interfaccia utente delle impostazioni dell'app che apre le impostazioni di sistema.

Puoi aprire le impostazioni di sistema per i canali di notifica con un elemento Intent che utilizza l'azione ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Ad esempio, il seguente codice di esempio mostra come reindirizzare un utente alle impostazioni di un canale di notifica:

Kotlin

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
}
startActivity(intent)

Java

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);

Tieni presente che l'intent richiede due extra che specificano il nome del pacchetto dell'app (noto anche come ID applicazione) e il canale da modificare.

Eliminare un canale di notifica

Puoi eliminare i canali di notifica chiamando il numero deleteNotificationChannel(). Il seguente codice campione mostra come completare questa procedura:

Kotlin

// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager.deleteNotificationChannel(id)

Java

NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
notificationManager.deleteNotificationChannel(id);

Creare un gruppo di canali di notifica

Se vuoi organizzare ulteriormente l'aspetto dei tuoi canali nell'interfaccia utente delle impostazioni, puoi creare gruppi di canali. Si tratta di una buona idea se la tua app supporta più account utente, ad esempio per i profili di lavoro, perché ti consente di creare un gruppo di canali di notifica per ogni account. In questo modo gli utenti possono identificare e controllare facilmente più canali di notifica con nomi identici.

Figura 2. Impostazioni del canale di notifica con i gruppi di account personali e di lavoro.

Ad esempio, un'app di social network potrebbe includere il supporto per gli account personali e di lavoro. In questo scenario, ogni account potrebbe richiedere più canali di notifica con funzioni e nomi identici, ad esempio:

  • Un account personale con due canali:

    • Nuovi commenti

    • Pubblica consigli

  • Un account aziendale con due canali:

    • Nuovi commenti

    • Pubblica consigli

L'organizzazione dei canali di notifica in gruppi per ogni account consente agli utenti di distinguerli.

Ogni gruppo di canali di notifica richiede un ID, che deve essere univoco all'interno del pacchetto, e un nome visibile all'utente. Lo snippet seguente mostra come creare un gruppo di canali di notifica.

Kotlin

// 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))

Java

// 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));

Dopo aver creato un nuovo gruppo, puoi chiamare setGroup() per associare un nuovo oggetto NotificationChannel al gruppo.

Dopo aver inviato il canale al gestore delle notifiche, non puoi più modificare l'associazione tra canale di notifica e gruppo.