Créer et gérer des canaux de notification

Sous Android 8.0 (niveau d'API 26) et versions ultérieures, toutes les notifications doivent être attribuées à un canal. Pour chaque canal, vous pouvez définir le comportement visuel et sonore qui s'applique à toutes les notifications de ce canal. Les utilisateurs peuvent modifier ces paramètres et décider quels canaux de notification de votre application peuvent être intrusifs ou visibles.

Regardez la vidéo suivante pour obtenir une présentation des canaux et d'autres fonctionnalités de notification dans Android 8.0.

Les paramètres utilisateur des canaux de notification sont disponibles pour chaque application dans les paramètres système, comme illustré dans la figure 1.

Figure 1. Paramètres de notification pour l'application Clock (Horloge) et l'un de ses canaux.

Une fois que vous avez créé un canal de notification, vous ne pouvez plus modifier les comportements de notification. L'utilisateur a alors le contrôle total. Toutefois, vous pouvez toujours modifier le nom et la description d'un canal.

Créez un canal pour chaque type de notification que vous devez envoyer. Vous pouvez également créer des canaux de notification pour refléter les choix des utilisateurs. Par exemple, vous pouvez configurer des canaux de notification distincts pour chaque groupe de conversation créé par un utilisateur dans une application de chat.

Lorsque vous ciblez Android 8.0 (niveau d'API 26) ou une version ultérieure, vous devez implémenter un ou plusieurs canaux de notification. Si votre targetSdkVersion est défini sur 25 ou une valeur inférieure, lorsque votre application s'exécute sur Android 8.0 (niveau d'API 26) ou une version ultérieure, elle se comporte de la même manière que sur les appareils exécutant Android 7.1 (niveau d'API 25) ou une version antérieure.

Créer un canal de notification

Pour créer un canal de notification, procédez comme suit :

  1. Créez un objet NotificationChannel avec un ID de canal unique, nom visible par l'utilisateur et niveau d'importance.

  2. Vous pouvez également spécifier la description que l'utilisateur voit dans les paramètres système avec setDescription().

  3. Enregistrez le canal de notification en le transmettant à createNotificationChannel().

L'exemple suivant montre comment créer et enregistrer un canal de notification :

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

La recréation d'un canal de notification existant avec ses valeurs d'origine n'effectue aucune opération. Il est donc sûr d'appeler ce code au démarrage d'une application.

Par défaut, toutes les notifications publiées sur un canal donné utilisent les comportements visuels et sonores définis par le niveau d'importance de la NotificationManagerCompat classe, tels que IMPORTANCE_DEFAULT ou IMPORTANCE_HIGH. Pour en savoir plus sur les niveaux d'importance, consultez la section suivante.

Si vous souhaitez personnaliser davantage les comportements de notification par défaut de votre canal, vous pouvez appeler des méthodes telles que enableLights(), setLightColor(), et setVibrationPattern() sur le NotificationChannel. N'oubliez pas qu'une fois le canal créé, vous ne pouvez plus modifier ces paramètres et que l'utilisateur a le contrôle final sur l'activation de ces comportements.

Vous pouvez également créer plusieurs canaux de notification en une seule opération en appelant createNotificationChannels().

Définir le niveau d'importance

L'importance du canal affecte le niveau d'interruption de toutes les notifications publiées dans le canal. Spécifiez-la dans le NotificationChannel constructeur, à l'aide de l'un des cinq niveaux d'importance, allant de IMPORTANCE_NONE(0) à IMPORTANCE_HIGH(4).

Pour prendre en charge les appareils exécutant Android 7.1 (niveau d'API 25) ou une version antérieure, vous devez également appeler setPriority() pour chaque notification, à l'aide d'une constante de priorité de la classe NotificationCompat.

Les constantes d'importance (NotificationManager.IMPORTANCE_*) et de priorité (NotificationCompat.PRIORITY_*) correspondent aux options d'importance visibles par l'utilisateur, comme indiqué dans le tableau suivant.

Niveau d'importance visible par l'utilisateur Importance (Android 8.0 et versions ultérieures) Priorité (Android 7.1 et versions antérieures)
Urgence
Émet un signal sonore et s'affiche sous la forme d'une notification prioritaire
IMPORTANCE_HIGH PRIORITY_HIGH ou PRIORITY_MAX
Élevée
Émet un signal sonore
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Moyenne
N'émet aucun signal sonore
IMPORTANCE_LOW PRIORITY_LOW
Faible
N'émet aucun signal sonore et ne s'affiche pas dans la barre d'état
IMPORTANCE_MIN PRIORITY_MIN
Aucune
N'émet aucun signal sonore et ne s'affiche pas dans la barre d'état ni dans le volet
IMPORTANCE_NONE N/A

Toutes les notifications, quelle que soit leur importance, s'affichent aux emplacements de l'UI du système qui n'impliquent pas d'interruption : panneau des notifications, badge sur l'icône dans le lanceur d'applications (vous pouvez toutefois modifier l'apparence du badge de notification).

Une fois que vous avez envoyé le canal au NotificationManager, vous ne pouvez plus modifier le niveau d'importance. Toutefois, l'utilisateur peut modifier ses préférences pour les canaux de votre application à tout moment.

Pour savoir comment choisir un niveau de priorité approprié, consultez la section "Niveaux de priorité" du guide de conception des notifications.

Lire les paramètres du canal de notification

Les utilisateurs peuvent modifier les paramètres des canaux de notification, y compris les comportements tels que les vibrations et le son d'alerte. Si vous souhaitez connaître les paramètres qu'un utilisateur applique à vos canaux de notification, procédez comme suit :

  1. Obtenez l'objet NotificationChannel en appelant getNotificationChannel() ou getNotificationChannels().

  2. Interrogez des paramètres de canal spécifiques tels que getVibrationPattern(), getSound() et getImportance().

Si vous détectez un paramètre de canal qui, selon vous, empêche le comportement prévu pour votre application, vous pouvez suggérer à l'utilisateur de le modifier et fournir une action pour ouvrir les paramètres du canal, comme indiqué dans la section suivante.

Ouvrir les paramètres du canal de notification

Une fois que vous avez créé un canal de notification, vous ne pouvez plus modifier les comportements visuels et sonores du canal de notification par programmation. Seul l'utilisateur peut modifier les comportements du canal à partir des paramètres système. Pour permettre à vos utilisateurs d'accéder rapidement à ces paramètres de notification, ajoutez un élément dans l'UI des paramètres de votre application qui ouvre ces paramètres système.

Vous pouvez ouvrir les paramètres système des canaux de notification avec un Intent qui utilise l'ACTION_CHANNEL_NOTIFICATION_SETTINGS action.

Par exemple, l'exemple de code suivant montre comment rediriger un utilisateur vers les paramètres d'un canal de notification :

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

Notez que l'intent nécessite deux extras qui spécifient le nom de package de votre application (également appelé ID d'application) et le canal à modifier.

Supprimer un canal de notification

Vous pouvez supprimer des canaux de notification en appelant deleteNotificationChannel(). L'exemple de code suivant montre comment effectuer ce processus :

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

Créer un groupe de canaux de notification

Si vous souhaitez organiser davantage l'apparence de vos canaux dans l'UI des paramètres, vous pouvez créer des groupes de canaux. C'est une bonne idée lorsque votre application est compatible avec plusieurs comptes utilisateur, car elle vous permet de créer un groupe de canaux de notification pour chaque compte. Les groupes de canaux aident les utilisateurs à différencier et à contrôler plusieurs canaux de notification portant des noms identiques.

Figure 2. Paramètres du canal de notification avec des groupes pour les comptes personnels et professionnels.

Par exemple, une application de réseau social peut inclure la prise en charge des comptes personnels et professionnels. Dans ce cas, chaque compte peut nécessiter plusieurs canaux de notification avec des fonctions et des noms identiques, tels que les suivants :

  • Un compte personnel avec deux canaux :

    • Nouveaux commentaires

    • Recommandations de posts

  • Un compte professionnel avec deux canaux :

    • Nouveaux commentaires

    • Recommandations de posts

L'organisation des canaux de notification en groupes pour chaque compte permet aux utilisateurs de les distinguer.

Chaque groupe de canaux de notification nécessite un ID, qui doit être unique dans votre package, ainsi qu'un nom visible par l'utilisateur. L'extrait de code suivant montre comment créer un groupe de canaux de notification.

  // 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
  <b>notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))</b>

Une fois que vous avez créé un groupe, vous pouvez appeler setGroup() pour associer un nouvel objet NotificationChannel au groupe.

Une fois que vous avez envoyé le canal au gestionnaire de notifications, vous ne pouvez plus modifier l'association entre le canal de notification et le groupe.