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.
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()
undstopForeground()
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()
oderinitForegroundServiceManagerProvider()
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()
oderinitForegroundServiceManagerProvider()
, 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.