A partire dal livello API Android 26, sono necessarie notifiche persistenti per e i servizi in primo piano. Questo requisito ha lo scopo di impedirti di nascondere che potrebbero richiedere eccessive richieste di risorse di sistema, tra cui batteria. Questo requisito crea un potenziale problema: con più servizi in primo piano non gestisce con attenzione la notifica, condivisa tra tutti i servizi, allora possono esserci non ignorabili, che portano a disordine indesiderato nell'elenco attivo di notifiche.
Questo problema diventa più difficile quando utilizzi SDK come Navigatore
che eseguono servizi in primo piano indipendenti dall'app con un proprio
di notifiche permanenti indipendenti, il che le rende difficili da consolidare.
Per risolvere questi problemi, la versione 1.11 dell'SDK di navigazione ha introdotto un'API semplice per
consentono di gestire le notifiche persistenti nell'app, incluso all'interno dell'SDK.
Componenti
Il gestore del servizio in primo piano fornisce un wrapper per il primo piano di Android e la classe di notifica permanente. L'elemento principale di questo wrapper funzione è quella di imporre il riutilizzo dell'ID notifica in modo che condivisi tra tutti i servizi in primo piano tramite il gestore.
L'SDK di navigazione contiene metodi statici per inizializzare e ottenere il
ForegroundServiceManager
singleton. Questo singleton può essere inizializzato
una sola volta nella vita dell'SDK di navigazione. Di conseguenza, se utilizzi uno dei
di inizializzazione (initForegroundServiceManagerMessageAndIntent()
o
initForegroundServiceManagerProvider()
), devi circondare
con un blocco di prova nel caso in cui il percorso venga reinserito. SDK di navigazione
genera un'eccezione di runtime se chiami uno dei due metodi più di una volta, a meno che
cancella innanzitutto tutti i riferimenti a ForegroundServiceManager
e richiama
clearForegroundServiceManager()
prima di ogni chiamata successiva.
I quattro parametri di initForegroundServiceManagerMessageAndIntent()
sono
application
, notificationId
, defaultMessage
e resumeIntent
. Se
gli ultimi tre parametri sono nulli, la notifica è il valore
Notifica SDK di navigazione. È comunque possibile nascondere altri elementi in primo piano
nell'app associata a questa notifica. Il parametro notificationId
specifica l'ID notifica da utilizzare per la notifica. Se è
null, viene utilizzato un valore arbitrario. Puoi impostarlo in modo da aggirare
sono in conflitto con altre notifiche, come quelle di un altro SDK. La
defaultMessage
è una stringa che viene visualizzata quando il sistema non
durante la navigazione. resumeIntent
è un intent che viene attivato quando la notifica
su cui viene fatto clic. Se il valore resumeIntent
è nullo, la notifica fa clic sulla notifica
vengono ignorati.
I tre parametri di initForegroundServiceManagerProvider()
sono
application
, notificationId
e notificationProvider
. Se l'ultimo
due parametri sono nulli, la notifica è l'SDK di navigazione standard
notifica. Il parametro notificationId
specifica l'ID notifica che
da utilizzare per la notifica. Se è null, viene restituito un valore arbitrario.
in uso. Puoi impostarlo in modo da aggirare i conflitti con altri
come quelle di un altro SDK. Se notificationProvider
è
impostato, il provider è sempre responsabile
generando la notifica da visualizzare.
Il metodo getForegroundServiceManager()
SDK di navigazione restituisce il valore
il singleton del gestore del servizio in primo piano. Se non ne hai ancora generata una,
equivale a chiamare initForegroundServiceManagerMessageAndIntent()
con parametri null per notificationId
, defaultMessage
e
resumeIntent
.
ForegroundServiceManager
prevede tre semplici metodi. I primi due sono per
di un servizio dentro e fuori il primo piano. I dati vengono generalmente chiamati
all'interno del servizio che è stato creato. L'uso di questi metodi garantisce che
sono associati alla notifica persistente condivisa. Il finale
updateNotification()
, segnala al gestore che la notifica ha
modificato e deve essere sottoposto di nuovo a rendering.
Per avere il controllo completo della notifica persistente condivisa,
l'API fornisce un'interfaccia NotificationContentProvider
per definire una
fornitore di servizi di notifica, che contiene un unico metodo per ricevere una notifica
con i contenuti attuali. Fornisce inoltre una classe base, che puoi
facoltativamente per la definizione del provider. Una delle metriche principali della classe base
è che offre un modo per chiamare updateNotification()
senza il
devono accedere al ForegroundServiceManager
. Se utilizzi un'istanza
fornitore di servizi di notifica per ricevere nuovi messaggi di notifica, chiama
per eseguire il rendering del messaggio nella notifica.
Scenari di utilizzo
Questa sezione descrive in dettaglio gli scenari di utilizzo per l'utilizzo di elementi permanenti condivisi notifiche.
- Nascondi le notifiche persistenti di altri servizi in primo piano delle app
- Lo scenario più semplice è preservare il comportamento attuale e utilizzare solo
notifica persistente per il rendering delle informazioni dell'SDK di navigazione. Altri servizi
può nascondersi dietro questa notifica usando il gestore del servizio in primo piano
startForeground()
estopForeground()
metodi. - Nascondi le notifiche persistenti di altri servizi in primo piano dell'app, ma imposta testo predefinito visualizzato quando non si naviga
- Il secondo scenario più semplice è preservare il comportamento attuale e utilizzare solo
la notifica persistente per il rendering delle informazioni dell'SDK di navigazione, ad eccezione di
quando il sistema non sta navigando. Quando il sistema non effettua la navigazione,
stringa fornita a
initForegroundServiceManagerMessageAndIntent()
anziché la stringa predefinita dell'SDK di navigazione che menziona "Google Maps". Puoi usare questa chiamata anche per impostare l'intent di ripristino si attiva quando l'utente fa clic sulla notifica. - Assumi il controllo completo del rendering della notifica persistente
- Lo scenario finale richiede la definizione e la creazione di un fornitore di notifiche
e passarla a
ForegroundServiceManager
utilizzandoinitForegroundServiceManagerProvider()
. Questa opzione ti offre di ciò che viene visualizzato nella notifica, ma anche disconnette le informazioni di notifica dell'SDK di navigazione dal Notifica, rimuovendo così gli utili prompt passo-passo mostrati nella notifica. Google non fornisce un metodo semplice per recuperare questo informazioni e inserendole nella notifica.
Fornitore di notifiche di esempio
L'esempio di codice seguente mostra come creare e restituire notifiche usando un semplice fornitore di contenuti di notifica.
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 "";
}
}
}
Dopo aver creato NotificationContentProviderImpl
, connetti
utilizzando il seguente codice per aprire l'SDK di navigazione:
ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);
Avvertenze e piani per il futuro
- Assicurati di chiamare
initForegroundServiceManagerMessageAndIntent()
oinitForegroundServiceManagerProvider()
in anticipo in modo da lo scenario di utilizzo previsto è ben definito. Devi chiamare questo metodo prima di creare un nuovo Navigatore. - Assicurati di rilevare eccezioni dalle chiamate a
initForegroundServiceManagerMessageAndIntent()
oinitForegroundServiceManagerProvider()
se il percorso del codice è inseriti più di una volta. In Navigation SDK v2.0, la chiamata di questo metodo genera più volte un'eccezione selezionata anziché un'eccezione di runtime. - Google potrebbe dover ancora lavorare per ottenere stili coerenti rispetto per tutta la durata della notifica che corrisponde allo stile dell'intestazione.
- Quando definisci un fornitore di notifiche, puoi controllare il comportamento degli avvisi con la priorità.
- Google non fornisce un mezzo semplice per recuperare le indicazioni passo passo le informazioni che un fornitore di notifiche potrebbe inserire nella notifica.