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