Il y a 6 ans -
Temps de lecture 8 minutes
Android O : Notification Channels
Google a récemment sorti en developer preview la future version d’Android : Android O.
Cette version introduit différents changements aussi bien pour les développeurs que pour les utilisateurs.
Cet article s’intéresse à une des nouveautés concernant les notifications : l’arrivée des Notification Channels.
Un notification channel est une catégorie où sont regroupées des notifications de même nature. Pour une application de médias, il pourrait y avoir une catégorie pour les articles, et une autre pour les vidéos.
Ce regroupement en catégories permet à l’utilisateur d’appliquer des préférences différentes pour chaque channel. Par exemple, l’utilisateur peut n’être intéressé que par les articles et désactiver complètement le channel des vidéos. Il a également la possibilité de choisir l’importance de chaque catégorie pour décider comment être notifié (pop-up, vibration, sonnerie, etc.).
Dans cet article, nous aborderons les différentes étapes d’utilisation d’un Notification Channel :
- création d’un nouveau channel,
- envoi d’une notification sur un channel spécifique,
- lecture et accès à la configuration des channels,>
- suppression d’un channel,
- association d’un channel à un groupe.>
Pré-requis
Pour pouvoir utilise
- avoir installé Android Studio 2.4 Canary,
- récupérer le SDK d’Android O<.
Ajouter un channel
Création
Un notification channel est représenté par la classe NotificationChannel.
Chaque NotificationChannel possède un identifiant, un nom et une importance :
- l’identifiant doit être unique pour le package de l’application,
- le nom sera celui affiché à l’utilisateur dans les paramètres du channel,
- l’importance établit comment l’utilisateur va être notifié.
On le crée comme suit :
[java]NotificationChannel articleChannel = new NotificationChannel("article_channel",
"Article channel",
NotificationManager.IMPORTANCE_DEFAULT);[/java]
Ce channel possède l’identifiant article_channel
, apparaîtra à l’utilisateur comme « Article channel » et possède une importance par défaut.
Configuration
Une fois le channel créé, il est possible de le configurer :
[java]articleChannel.enableLights(true);
articleChannel.setLightColor(Color.BLUE);
articleChannel.enableVibration(true);
articleChannel.setVibrationPattern(new long[]{100, 100});[/java]
Ici, le channel est configuré pour que toute notification postée sur celui-ci provoque l’allumage de la LED de l’appareil ainsi que sa vibration.
Enregistrement
La dernière étape pour ajouter un channel est de l’enregistrer à l’aide du NotificationManager :
[java]NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(articleChannel);[/java]
Le channel est maintenant enregistré dans l’application et pourra être utilisé pour poster des notifications.
Si on ouvre les paramètres des notifications pour cette application, on pourra observer le channel créé :
En pratique
- Lorsque vous ajoutez des notification channels, il n’est pas nécessaire de vérifier s’ils existent déjà. Si vous créez un channel avec un identifiant déjà utilisé, seul le nom du channel sera mis à jour, mais pas son importance.
- Une fois un channel enregistré, seul l’utilisateur peut modifier ses caractéristiques dans les paramètres.
- Il est possible d’enregistrer plusieurs channels à la fois en utilisant la méthode createNotificationChannels.
Envoyer une notification sur un channel
Créer une notification
Sur Android O, la création d’une Notification requiert de l’attribuer à un channel via la méthode setChannel du NotificationCompat.Builder :
[java]Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("New article")
.setContentText("There is a new article")
.setChannel("article_channel")
.build();[/java]
On indique quel channel utiliser en passant l’identifiant du channel lors de la création de la notification. Ici, on utilise l’identifiant article_channel
, correspondant au channel précédemment créé.
Poster une notification
Il n’y a ici pas de différence avec les précédentes versions d’Android :
[java]NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, notification);[/java]
Rendu utilisateur
L’utilisateur va recevoir la notification comme sur les autres versions d’Android :
S’il appuie longuement sur la notification, il pourra voir quel est le channel associé :
D’ici, il pourra choisir de désactiver complètement le channel ou bien accéder aux paramètres des channels de l’application :
En pratique
- Poster une notification sur un channel inexistant ou ne pas lui attribuer de channel aura pour effet de la poster sur le channel par défaut « Miscellaneous ».
Lire la configuration d’un channel
L’utilisateur peut modifier la configuration d’un channel à tout moment depuis l’écran des paramètres de ce channel. Cette configuration n’est donc pas figée et il peut être intéressant d’y avoir accès en lecture.
Récupération du channel
Pour accéder à la configuration d’un channel, il faut tout d’abord récupérer ce channel avec le NotificationManager :
[java]NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = notificationManager.getNotificationChannel("article_channel");[/java]
Il est ensuite possible d’accéder à sa configuration :
[java]if (channel != null) {
CharSequence name = channel.getName();
int importance = channel.getImportance();
int lightColor = channel.getLightColor();
long[] vibrationPattern = channel.getVibrationPattern();
}[/java]
En pratique
- Si l’identifiant utilisé ne correspond à aucun channel, le NotificationChannel retourné sera
null
. - Il est possible de récupérer tous les channels de l’application en utilisant la méthode getNotificationChannels.
Accéder aux paramètres d’un channel
Il peut être pratique pour l’utilisateur de pouvoir accéder aux paramètres d’un channel depuis l’application.
Redirection vers les paramètres
Pour rediriger l’utilisateur vers l’écran des paramètres d’un channel, il faut utiliser un Intent contenant l’identifiant du channel à configurer :
[java]Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_CHANNEL_ID, "article_channel");
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
startActivity(intent);[/java]
En pratique
- La configuration choisie par l’utilisateur ne peut pas être modifiée par le code, même si le channel est recréé avec le même identifiant.
Supprimer un channel
Si un channel n’est plus utilisé par l’application, il est possible de le supprimer :
[java]NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.deleteNotificationChannel("article_channel");[/java]
En pratique
- Un channel supprimé reste visible dans les paramètres des notifications. Cela permet d’éviter les spams.
Groupes de channels
Il est possible de créer des groupes de channels pour une application. Il permettent notamment de gérer plusieurs channels possédant le même nom dans une même application.
Cette situation peut arriver dans le cas d’une application gérant plusieurs types de comptes. On peut imaginer par exemple une application avec un compte personnel et un compte professionnel. Les types de notifications reçues sont les mêmes pour les 2 comptes, mais l’utilisateur peut vouloir appliquer différentes configurations pour chaque compte.
Ajout des groupes
Un groupe de channels est représenté par la classe NotificationChannelGroup.
Chaque NotificationChannelGroup possède un identifiant et un nom :
- l’identifiant doit être unique pour le package de l’application,
- le nom sera celui affiché à l’utilisateur dans les paramètres des channels.
On les crée et on les enregistre comme suit :
[java]NotificationChannelGroup personalGroup = new NotificationChannelGroup("personal_group", "Personal group");
NotificationChannelGroup businessGroup = new NotificationChannelGroup("business_group", "Business group");
List<NotificationChannelGroup> groups = Arrays.asList(personalGroup, businessGroup);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroups(groups);[/java]
L’application comporte maintenant 2 groupes : un pour le compte personnel et un autre pour le compte professionnel.
Associer un channel à un groupe
>Il est possible d’associer chaque channel à un groupe, via la méthode setGroup :
[java]NotificationChannel personalArticleChannel = new NotificationChannel("personal_article_channel",
"Article channel",
NotificationManager.IMPORTANCE_DEFAULT);
personalArticleChannel.setGroup("personal_group");
NotificationChannel businessArticleChannel = new NotificationChannel("business_article_channel",
"Article channel",
NotificationManager.IMPORTANCE_DEFAULT);
businessArticleChannel.setGroup("business_group");
List<NotificationChannel> channels = Arrays.asList(personalArticleChannel, businessArticleChannel);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannels(channels);[/java]
Ici, on a créé 2 channels avec le nom « Article channel » et on a associé chacun d’entre eux à un groupe différent.
Rendu utilisateur
Lorsque l’utilisateur appuie longuement sur une notification, il voit maintenant apparaître le nom du groupe associé à la notification :
S’il consulte l’écran des paramètres de notifications, il peut maintenant voir les différents groupes ainsi que les channels y appartenant :
Pour aller plus loin
Sources
Les sources des exemples sont disponibles sur ce dépôt GitHub.
Liens utiles
Conclusion
Les notification channels apportent à l’utilisateur une granularité supplémentaire dans la gestion des notifications en leur offrant la possibilité de configurer les notifications non plus seulement par application mais également par catégorie.
Pour le développeur, la mise à jour du code pour les intégrer est relativement simple car l’impact sur le code est minime et localisé.
Commentaire