Le SDK Navigation n'est actuellement disponible que pour certains clients. Contactez le service commercial pour en savoir plus.

Regrouper les notifications sur mobile

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

À partir du niveau d'API 26 d'Android, les notifications persistantes sont requises pour les services de premier plan. Cette exigence vous évite de dissimuler des services susceptibles d'imposer des demandes excessives aux ressources système, y compris à la batterie. Cette exigence pose un problème potentiel: si une application comportant plusieurs services de premier plan ne gère pas soigneusement la notification afin qu'elle soit partagée entre tous les services, plusieurs notifications permanentes impossibles à ignorer entraînent un encombrement indésirable dans la liste active des notifications.

Ce problème devient plus difficile lorsque vous utilisez des SDK tels que le SDK Navigation, qui exécutent des services de premier plan indépendants de l'application, qui peuvent avoir leurs propres notifications persistantes indépendantes, ce qui les rend difficiles à regrouper. Pour résoudre ces problèmes, la version 1.11 du SDK Navigation a introduit une API simple qui facilite la gestion des notifications persistantes dans l'application, y compris dans le SDK.

Regrouper les notifications persistantes

Composants

Le gestionnaire de services de premier plan fournit un wrapper autour de la classe de service de premier plan Android et de la classe de notification persistante. La fonction principale de ce wrapper est d'imposer la réutilisation de l'ID de notification afin que la notification soit partagée entre tous les services de premier plan à l'aide du gestionnaire.


NavigationAPI contient des méthodes statiques d'initialisation et d'obtention du singleton ForegroundServiceManager. Ce singleton ne peut être initialisé qu'une seule fois pendant la durée de vie du SDK Navigation. Par conséquent, si vous utilisez l'un des appels d'initialisation (initForegroundServiceManagerMessageAndIntent() ou initForegroundServiceManagerProvider()), vous devez l'entourer d'un bloc try/catch au cas où le chemin serait à nouveau saisi. Pour éviter les problèmes d'incompatibilité, le SDK de navigation génère une exception d'exécution si vous appelez l'une ou l'autre des méthodes, sauf si vous effacez d'abord toutes les références à ForegroundServiceManager et appelez clearForegroundServiceManager() avant chaque appel suivant. Dans la version 2.0 du SDK Navigation, une exception vérifiée est ajoutée à l'API à cette fin.

Les quatre paramètres de initForegroundServiceManagerMessageAndIntent() sont application, notificationId, defaultMessage et resumeIntent. Si les trois derniers paramètres sont vides, la notification du SDK Navigation est standard. Il est toujours possible de masquer d'autres services de premier plan dans l'application derrière cette notification. Le paramètre notificationId spécifie l'ID de notification à utiliser pour la notification. S'il est nul, une valeur arbitraire est utilisée. Vous pouvez la définir explicitement pour contourner les conflits avec d'autres notifications, comme celles d'un autre SDK. defaultMessage est une chaîne qui s'affiche lorsque le système n'effectue pas la navigation. resumeIntent est un intent qui est déclenché lorsque l'utilisateur clique sur la notification. Si resumeIntent est nul, les clics sur la notification sont ignorés.

Les trois paramètres de initForegroundServiceManagerProvider() sont application, notificationId et notificationProvider. Si les deux derniers paramètres sont nuls, la notification correspond à la notification standard du SDK Navigation. Le paramètre notificationId spécifie l'ID de notification à utiliser pour la notification. S'il est nul, une valeur arbitraire est utilisée. Vous pouvez la définir explicitement pour contourner les conflits avec d'autres notifications, comme celles d'un autre SDK. Si notificationProvider est défini, le fournisseur est toujours responsable de la génération de la notification à afficher.

La méthode getForegroundServiceManager() du SDK Navigation renvoie le singleton du gestionnaire de services de premier plan. Si vous n'en avez pas encore généré, cela équivaut à appeler initForegroundServiceManagerMessageAndIntent() avec des paramètres NULL pour notificationId, defaultMessage et resumeIntent.

Le ForegroundServiceManager offre trois méthodes simples. Les deux premiers sont destinés à déplacer un service vers et depuis le premier plan, et sont généralement appelés à partir du service qui a été créé. Ces méthodes garantissent que les services sont associés à la notification persistante partagée. La méthode finale, updateNotification(), indique au gestionnaire que la notification a été modifiée et doit être à nouveau affichée.

Si vous souhaitez contrôler entièrement le contenu de la notification persistante partagée, la nouvelle API fournit une interface NotificationContentProvider permettant de définir un fournisseur de notifications, qui contient une seule méthode pour recevoir une notification avec le contenu actuel. Il fournit également une classe de base, que vous pouvez éventuellement utiliser pour définir le fournisseur. L'un des objectifs principaux de la classe de base est de permettre d'appeler facilement updateNotification() sans avoir besoin d'accéder à ForegroundServiceManager. Cette méthode d'assistance peut être pratique si vous utilisez une instance du fournisseur de notifications pour recevoir de nouveaux messages de notification. Dans ce cas, vous pouvez appeler cette méthode interne directement pour afficher le message dans la notification.

Scénarios d'utilisation

Cette section détaille les scénarios d'utilisation des notifications persistantes partagées.

Masquer les notifications persistantes des autres services de premier plan d'applications
Le scénario le plus simple consiste à conserver le comportement actuel et à n'utiliser la notification persistante que pour afficher les informations du SDK Navigation. D'autres services peuvent masquer cette notification à l'aide des méthodes startForeground() et stopForeground() du gestionnaire de services au premier plan.
Masquer les notifications persistantes des autres services de premier plan d'application, mais définir le texte par défaut affiché lorsque la navigation n'est pas effectuée
Le deuxième scénario le plus simple consiste à conserver le comportement actuel et à n'utiliser la notification persistante que pour afficher les informations du SDK Navigation, sauf lorsque le système n'effectue pas la navigation. Lorsque le système n'effectue pas la navigation, la chaîne fournie à initForegroundServiceManagerMessageAndIntent() s'affiche à la place de la chaîne par défaut du SDK de navigation qui mentionne "Google Maps". Cet appel peut également être utilisé pour définir l'intent de reprise qui se déclenche lorsque l'utilisateur clique sur la notification.
Contrôlez entièrement l'affichage de la notification persistante
Le scénario final nécessite de définir et de créer un fournisseur de notifications, puis de le transmettre à ForegroundServiceManager via initForegroundServiceManagerProvider(). Cette option vous permet de contrôler entièrement le contenu de la notification, mais elle désactive également les informations de notification du SDK Navigation dans la notification. Les instructions de navigation détaillées affichées dans la notification sont ainsi supprimées. Google ne fournit pas encore de moyen simple de récupérer ces informations et de les insérer dans la notification.

Exemple de fournisseur de notifications

L'exemple de code suivant montre comment créer et renvoyer des notifications à l'aide d'un simple fournisseur de contenu de notification.

public class NotificationContentProviderImpl
   extends NotificationContentProviderBase
   implements NotificationContentProvider {
 private String channelId;
 private Context context;
 private String message;

 /** Constructor */
 public NotificationContentProviderImpl(Application application) {
   super(application);
   message = "-- uninitialized --";
   channelId = null;
   this.context = application;
 }

 /**
  * Sets message to display in the notification. Calls updateNotification
  * to display the message immediately.
  *
  * @param msg The message to display in the notification.
  */
 public void setMessage(String msg) {
   message = msg;
   updateNotification();
 }

 /**
  * Returns the notification as it should be rendered.
  */
 @Override
 public Notification getNotification() {
   Notification notification;

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     Spanned styledText = Html.fromHtml(message, FROM_HTML_MODE_LEGACY);
     String channelId = getChannelId(context);
     notification =
         new Notification.Builder(context, channelId)
             .setContentTitle("Notifications Demo")
             .setStyle(new Notification.BigTextStyle()
                 .bigText(styledText))
             .setSmallIcon(R.drawable.ic_navigation_white_24dp)
             .setTicker("ticker text")
             .build();
   } else {
     notification = new Notification.Builder(context)
         .setContentTitle("Notification Demo")
         .setContentText("testing non-O text")
         .build();
   }

   return notification;
 }

 // Helper to set up a channel ID.
 private String getChannelId(Context context) {
   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     if (channelId == null) {
       NotificationManager notificationManager =
           (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
       NotificationChannel channel = new NotificationChannel(
           "default", "navigation", NotificationManager.IMPORTANCE_DEFAULT);
       channel.setDescription("For navigation persistent notification.");
       notificationManager.createNotificationChannel(channel);
       channelId = channel.getId();
     }
     return channelId;
   } else {
     return "";
   }
 }
}

Mises en garde et projets futurs

  • Veillez à appeler initForegroundServiceManagerMessageAndIntent() ou initForegroundServiceManagerProvider() suffisamment tôt pour que le scénario d'utilisation attendu soit bien défini. Vous devez appeler cette méthode avant de créer un nouveau navigateur.
  • Veillez à détecter les exceptions aux appels à initForegroundServiceManagerMessageAndIntent() ou initForegroundServiceManagerProvider() au cas où le chemin de code serait saisi plusieurs fois. Dans le SDK Navigation v2.0, l'appel de cette méthode plusieurs fois génère une exception vérifiée plutôt qu'une exception d'exécution.
  • Google peut encore avoir besoin d'efforts pour obtenir un style cohérent sur la durée de vie de la notification correspondant au style de l'en-tête.
  • Lorsque vous définissez un fournisseur de notifications, vous pouvez contrôler le comportement d'avertissement avec la priorité.
  • Google ne fournit pas encore de moyen simple de récupérer des informations détaillées qu'un fournisseur de notifications peut insérer dans la notification.