Raggruppa notifiche mobile

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: se un'app con più servizi in primo piano non gestisce attentamente la notifica in modo che sia condivisa tra tutti i servizi, possono esserci più notifiche persistenti che non possono essere chiuse, causando un ingombro indesiderato nell'elenco attivo delle 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.

Consolida le notifiche permanenti

Componenti

Il gestore del servizio in primo piano fornisce un wrapper per il primo piano di Android e la classe di notifica permanente. La funzione principale di questo wrapper è applicare il riutilizzo dell'ID notifica in modo che la notifica venga condivisa tra tutti i servizi in primo piano che utilizzano il gestore.


L'SDK di navigazione contiene metodi statici per inizializzare e ottenere il ForegroundServiceManager singleton. Questo singleton può essere inizializzato solo una volta nel ciclo di vita dell'SDK Navigation. 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 i tre parametri finali sono null, la notifica è la notifica SDK Navigation standard. È 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. defaultMessage è una stringa visualizzata quando il sistema non è in navigazione. resumeIntent è un intent che viene attivato quando la notifica su cui viene fatto clic. Se resumeIntent è nullo, i 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 esplicitamente per aggirare i conflitti con altre notifiche, ad esempio 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 ha tre semplici metodi. I primi due sono per spostare un servizio in primo piano e viceversa e vengono in genere chiamati dall'interno del servizio creato. L'uso di questi metodi garantisce che sono associati alla notifica persistente condivisa. Il metodo finale, updateNotification(), segnala all'amministratore che la notifica è cambiata e deve essere visualizzata di nuovo.

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 nel dettaglio gli scenari di utilizzo delle notifiche permanenti condivise.

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() e stopForeground() 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 è mantenere il comportamento attuale e utilizzare solo la notifica persistente per il rendering delle informazioni dell'SDK di navigazione, tranne quando il sistema non è in navigazione. Quando il sistema non è in fase di 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 provider di notifiche e il suo passaggio a ForegroundServiceManager utilizzando initForegroundServiceManagerProvider(). Questa opzione ti offre il pieno controllo di ciò che viene visualizzato nella notifica, ma scollega anche le informazioni sulla notifica dell'SDK di navigazione dalla notifica, rimuovendo così i prompt passo passo utili mostrati nella notifica. Google non fornisce un metodo semplice per recuperare questo informazioni e inserendole nella notifica.

Esempio di fornitore di notifiche

Il seguente esempio di codice mostra come creare e restituire notifiche utilizzando un semplice provider 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() o initForegroundServiceManagerProvider() in anticipo in modo da lo scenario di utilizzo previsto è ben definito. Devi chiamare questo metodo prima di creare un nuovo Navigatore.
  • Assicurati di intercettare le eccezioni dalle chiamate a initForegroundServiceManagerMessageAndIntent() o initForegroundServiceManagerProvider() nel caso in cui il percorso del codice sia inserito più volte. In Navigation SDK v2.0, la chiamata di questo metodo genera più volte un'eccezione selezionata anziché un'eccezione di runtime.
  • Google potrebbe dover fare ancora del lavoro per ottenere uno stile coerente per tutta la durata della notifica che corrisponda allo stile dell'intestazione.
  • Quando definisci un provider di notifiche, puoi controllare il comportamento della notificaล่วง 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.