Benachrichtigungen auf Mobilgeräten zusammenfassen

Ab Android API-Level 26 sind dauerhafte Benachrichtigungen für Dienste im Vordergrund. 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ßbar, was zu unerwünschten Unordnungen in der aktiven Liste Benachrichtigungen.

Dieses Problem wird schwieriger, wenn Sie SDKs wie die Navigationssteuerung verwenden. SDK, die Dienste im Vordergrund unabhängig von der App ausführen, unabhängige dauerhafte Benachrichtigungen haben, was die Konsolidierung erschwert. Um diese Probleme zu beheben, wurde mit Version 1.11 des Navigation SDK eine einfache API eingeführt, helfen dabei, dauerhafte Benachrichtigungen in der App und im SDK zu verwalten.

Dauerhafte Benachrichtigungen konsolidieren

Komponenten

Der Dienstmanager im Vordergrund stellt einen Wrapper um den Android-Vordergrund bereit Dienstklasse und die persistente Benachrichtigungsklasse. 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 daher eine der Initialisierungsaufrufe (initForegroundServiceManagerMessageAndIntent() oder initForegroundServiceManagerProvider()) auswählen, sollten Sie für den Fall, dass dieser Pfad erneut 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 die sind die letzten drei Parameter null, ist die Benachrichtigung die standardmäßige Navigation SDK-Benachrichtigung. Es ist weiterhin möglich, andere Vordergrundfunktionen Dienste in der App, für die diese Benachrichtigung angezeigt wird. Der notificationId-Parameter gibt die Benachrichtigungs-ID an, die für die Benachrichtigung verwendet werden soll. Falls ja null ist, wird ein beliebiger Wert verwendet. Sie können ihn explizit so einrichten, mit anderen Benachrichtigungen, z. B. 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 die Benachrichtigung angeklickt wird. Wenn resumeIntent null ist, wird auf die Benachrichtigung geklickt werden ignoriert.

Die drei Parameter von initForegroundServiceManagerProvider() sind application, notificationId und notificationProvider. Wenn der letzte zwei Parameter null sind, wird die Benachrichtigung vom standardmäßigen Navigation SDK Benachrichtigung. Der Parameter notificationId gibt die Benachrichtigungs-ID an, die die für die Benachrichtigung verwendet werden soll. Ist der Wert null, ist ein beliebiger Wert verwendet. Sie können ihn explizit festlegen, um Konflikte mit anderen z. B. von einem anderen SDK. Wenn notificationProvider gleich ist der Anbieter immer dafür verantwortlich, zum Generieren der Benachrichtigung, die gerendert werden soll.

Die Methode getForegroundServiceManager() des Navigation SDK gibt das Ereignis Service Manager im Vordergrund, Singleton. Wenn Sie noch keines erstellt haben, entspricht dies dem Aufrufen von initForegroundServiceManagerMessageAndIntent() mit Null-Parametern für notificationId, defaultMessage und resumeIntent.

Für ForegroundServiceManager gibt es 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 gibt 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 Nutzungsszenarien für die Verwendung von freigegebenen nichtflüchtigen Speichern beschrieben. Benachrichtigungen.

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 Weitere Dienste kann sich mit dem Dienstmanager im Vordergrund hinter dieser Benachrichtigung verbergen startForeground()- und stopForeground()-Methoden.
Dauerhafte Benachrichtigungen anderer App-Dienste im Vordergrund ausblenden, aber festgelegt Standardtext wird angezeigt, wenn nicht navigiert wird
Das zweiteinfachste Szenario besteht darin, das aktuelle Verhalten beizubehalten die dauerhafte Benachrichtigung zum Rendern von Navigation SDK-Informationen, mit Ausnahme von wenn das System nicht navigiert. Wenn keine Navigation läuft, wird das Symbol String für initForegroundServiceManagerMessageAndIntent() angegeben statt des Standard-Strings des Navigation SDK angezeigt, in dem „Google Maps“. 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 Möglichkeit zum Abrufen dieser Daten. und fügen sie in die Benachrichtigung ein.

Beispiel für Benachrichtigungsanbieter

Im folgenden Codebeispiel wird veranschaulicht, wie Benachrichtigungen erstellt und zurückgegeben werden. mit einem einfachen Anbieter von Benachrichtigungsinhalten.

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 die 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 der detaillierten Routenführung. Informationen, die ein Benachrichtigungsanbieter in die Benachrichtigung einfügen könnte