Benachrichtigungen auf Mobilgeräten zusammenfassen

Ab Android API-Ebene 26 sind persistente Benachrichtigungen für Dienste im Vordergrund erforderlich. Diese Anforderung soll verhindern, Dienste, die Systemressourcen übermäßig beanspruchen, einschließlich insbesondere im Hinblick auf den Akku. Diese Anforderung stellt ein potenzielles Problem dar: mit mehreren Diensten im Vordergrund die Benachrichtigung für alle Dienste freigegeben ist, können mehrere persistente nicht schließbare Benachrichtigungen, was zu unerwünschten Unordnungen in der Benachrichtigungen.

Dieses Problem wird noch schwieriger, wenn Sie SDKs wie das Navigations-SDK verwenden, mit dem Dienste im Vordergrund unabhängig von der App ausgeführt werden, die eigene unabhängige persistente Benachrichtigungen haben, was eine Zusammenführung erschwert. Um diese Probleme zu beheben, wurde im Navigation SDK v1.11 eine einfache API eingeführt, mit der sich persistente Benachrichtigungen in der gesamten App verwalten lassen, auch im SDK.

Dauerhafte Benachrichtigungen konsolidieren

Komponenten

Der Dienstmanager im Vordergrund stellt einen Wrapper für die Android-Klasse für Dienste im Vordergrund und die Klasse für persistente Benachrichtigungen bereit. Der Haupt-Wrapper dieses Wrappers die Wiederverwendung der Benachrichtigungs-ID zu erzwingen, damit die Benachrichtigung wird über den Manager für alle Dienste im Vordergrund freigegeben.


Das Navigation SDK enthält statische Methoden zum Initialisieren und Abrufen der Singleton von ForegroundServiceManager. Dieser Singleton kann nur initialisiert werden einmal im Laufe der Lebensdauer des Navigation SDK. Wenn Sie also einen der Initialisierungsaufrufe (initForegroundServiceManagerMessageAndIntent() oder initForegroundServiceManagerProvider()) verwenden, sollten Sie ihn in einen Try-Catch-Block einschließen, für den Fall, dass dieser Pfad noch einmal eingegeben wird. Das Navigation SDK löst eine Laufzeitausnahme aus, wenn Sie eine der Methoden mehrmals aufrufen, es sei denn, Sie Löschen Sie zunächst alle Verweise auf die ForegroundServiceManager und rufen Sie clearForegroundServiceManager() vor jedem nachfolgenden Aufruf.

Die vier Parameter von initForegroundServiceManagerMessageAndIntent() sind application, notificationId, defaultMessage und resumeIntent. Wenn der Parameter sind die letzten drei Parameter null, ist die Benachrichtigung die standardmäßige Navigation SDK-Benachrichtigung. Es ist weiterhin möglich, andere Dienste im Vordergrund in der App hinter dieser Benachrichtigung auszublenden. Mit dem Parameter notificationId wird die Benachrichtigungs-ID angegeben, die für die Benachrichtigung verwendet werden soll. Falls ja null ist, wird ein beliebiger Wert verwendet. Sie können sie explizit festlegen, um Konflikte mit anderen Benachrichtigungen zu vermeiden, z. B. solche von einem anderen SDK. Die defaultMessage ist ein String, der angezeigt wird, wenn das System nicht beim Navigieren. resumeIntent ist ein Intent, der ausgelöst wird, wenn auf die Benachrichtigung geklickt wird. Wenn resumeIntent null ist, werden Klicks auf die Benachrichtigung ignoriert.

Die drei Parameter von initForegroundServiceManagerProvider() sind application, notificationId und notificationProvider. Wenn die letzten beiden Parameter null sind, handelt es sich bei der Benachrichtigung um die Standardbenachrichtigung des Navigation SDK. Der Parameter notificationId gibt die Benachrichtigungs-ID an, die die für die Benachrichtigung verwendet werden soll. Wenn er null ist, wird ein beliebiger Wert verwendet. Sie können ihn explizit festlegen, um Konflikte mit anderen z. B. von einem anderen SDK. Wenn die notificationProvider festgelegt ist, ist der Anbieter immer für die Generierung der zu rendernden Benachrichtigung verantwortlich.

Die Methode getForegroundServiceManager() des Navigation SDK gibt das Ereignis Service Manager im Vordergrund, Singleton. Wenn Sie noch keinen generiert haben, entspricht das dem Aufruf von initForegroundServiceManagerMessageAndIntent() mit Nullparametern für notificationId, defaultMessage und resumeIntent.

Die ForegroundServiceManager hat drei einfache Methoden. Die ersten beiden sind für das Verschieben eines Dienstes in den Vordergrund und aus dem Vordergrund. Die Aufrufe werden in der Regel innerhalb des erstellten Dienstes. Mit diesen Methoden wird sichergestellt, -Dienste sind mit der gemeinsamen dauerhaften Benachrichtigung verknüpft. Die letzte updateNotification(), wird dem Manager mitgeteilt, dass die Benachrichtigung geändert und sollten erneut gerendert werden.

Wenn Sie die vollständige Kontrolle über die gemeinsame dauerhafte Benachrichtigung benötigen, Die API bietet eine NotificationContentProvider-Schnittstelle zum Definieren eines Benachrichtigungsanbieter, der eine einzige Methode zum Erhalt von Benachrichtigungen enthält mit dem aktuellen Inhalt. Außerdem bietet es eine Basisklasse, optional verwenden, um den Anbieter zu definieren. Eine der Hauptklassen der Basisklasse da sie eine Möglichkeit bietet, updateNotification() ohne das Ereignis auf ForegroundServiceManager zugreifen müssen. Wenn Sie eine Instanz des Benachrichtigungsanbieter neue Benachrichtigungen empfangen, können Sie diese Option interne Methode, um die Nachricht in der Benachrichtigung direkt zu rendern.

Nutzungsszenarien

In diesem Abschnitt werden die Anwendungsfälle für freigegebene persistente Benachrichtigungen beschrieben.

Dauerhafte Benachrichtigungen anderer App-Dienste im Vordergrund ausblenden
Am einfachsten ist es, das aktuelle Verhalten beizubehalten und nur die Funktion dauerhafte Benachrichtigung für das Rendern der Navigation SDK-Informationen Andere Dienste können sich hinter dieser Benachrichtigung verstecken, indem sie den Dienstmanager für Dienste im Vordergrund und die Methoden startForeground() und stopForeground() verwenden.
Dauerhafte Benachrichtigungen anderer App-Dienste im Vordergrund ausblenden, aber Standardtext festlegen, der angezeigt wird, wenn nicht navigiert wird
Das zweiteinfachste Szenario besteht darin, das aktuelle Verhalten beizubehalten und die dauerhafte Benachrichtigung nur zum Rendern von Navigation SDK-Informationen zu verwenden, es sei denn, das System führt keine Navigation durch. Wenn das System nicht navigiert, wird der für initForegroundServiceManagerMessageAndIntent() angegebene String angezeigt, nicht der Standardstring des Navigation SDK, der „Google Maps“ enthält. Sie können mit diesem Aufruf auch den Resume-Intent festlegen, der wird ausgelöst, wenn auf die Benachrichtigung geklickt wird.
Volle Kontrolle über das Rendern der dauerhaften Benachrichtigung
Im letzten Szenario muss ein Benachrichtigungsanbieter definiert und erstellt werden und übergeben sie mithilfe des ForegroundServiceManager initForegroundServiceManagerProvider() Diese Option bietet Ihnen was in der Benachrichtigung gerendert wird, wird die Navigation SDK-Benachrichtigungsdaten vom und die hilfreiche detaillierte Routenführung in der Benachrichtigung. Google bietet keine einfache Methode zum Abrufen dieser Daten. und fügen sie in die Benachrichtigung ein.

Beispiel für Benachrichtigungsanbieter

Das folgende Codebeispiel zeigt, wie Benachrichtigungen mit einem einfachen Benachrichtigungsinhaltsanbieter erstellt und zurückgegeben werden.

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

Nachdem Sie NotificationContentProviderImpl erstellt haben, verbinden Sie die Navigation SDK mithilfe des folgenden Codes hinzu:

ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);

Einschränkungen und Zukunftspläne

  • Rufen Sie initForegroundServiceManagerMessageAndIntent() oder initForegroundServiceManagerProvider() frühzeitig an, damit das erwartete Nutzungsszenario klar definiert ist. Sie müssen diese Methode aufrufen, bevor Sie einen neuen Navigator erstellen.
  • Achten Sie darauf, Ausnahmen bei Anrufen an initForegroundServiceManagerMessageAndIntent() oder initForegroundServiceManagerProvider(), falls der Codepfad gleich mehr als einmal eingegeben haben. In Navigation SDK Version 2.0 wird diese Methode durch Aufrufen dieser Methode löst mehrfach eine geprüfte Ausnahme statt einer Laufzeitausnahme aus.
  • Google arbeitet möglicherweise noch daran, eine einheitliche Gestaltung Lebensdauer der Benachrichtigung, die dem Stil der Kopfzeile entspricht.
  • Wenn du einen Benachrichtigungsanbieter festlegst, kannst du das Verhalten bei Vorwarnungen steuern mit der Priorität.
  • Google bietet keine einfache Möglichkeit zum Abrufen von detaillierten Wegbeschreibungen, die ein Benachrichtigungsanbieter in die Benachrichtigung einfügen könnte.