Skonsoliduj powiadomienia na urządzeniach mobilnych

Począwszy od poziomu interfejsu API Androida na poziomie 26, trwałe powiadomienia są wymagane przez usług działających na pierwszym planie. Ten wymóg ma zapobiec ukryciu usług, które mogą zwiększać obciążenie zasobów systemowych, w tym a konkretnie na baterii. To wymaganie stwarza potencjalny problem. Jeśli aplikacja z wieloma usługami na pierwszym planie nie przejmuje się starannością, że jest on współużytkowany przez wszystkie usługi, może być wiele trwałych powiadomień, których nie można zamknąć, co prowadzi do powstania niepożądanego bałaganu na liście aktywnych powiadomienia.

Problem ten staje się trudniejszy, gdy korzystasz z pakietów SDK takich jak np. SDK, które uruchamiają usługi działające na pierwszym planie niezależnie od aplikacji, która ma swoje stałe powiadomienia, co utrudnia ich konsolidację. Aby rozwiązać te problemy, w pakiecie SDK Navigation SDK w wersji 1.11 wprowadziliśmy prosty interfejs API, ułatwiają zarządzanie trwałymi powiadomieniami w całej aplikacji, w tym w pakiecie SDK.

konsolidowanie trwałych powiadomień.

Komponenty

Menedżer usługi na pierwszym planie udostępnia element opakowujący dla klasy usługi na pierwszym planie Androida i klasy powiadomienia trwałego. Główny kod tego kodu jest wymuszanie ponownego użycia identyfikatora powiadomienia, tak aby powiadomienie udostępniane we wszystkich usługach na pierwszym planie przy użyciu menedżera.


Pakiet Navigation SDK zawiera statyczne metody inicjowania i pobierania ForegroundServiceManager singleton. Ten singleton może być tylko zainicjowany tylko raz w trakcie użytkowania pakietu Navigation SDK. Dlatego jeśli używasz jednego z wywołań inicjalizujących (initForegroundServiceManagerMessageAndIntent() lub initForegroundServiceManagerProvider()), musisz je otoczyć blokiem try-catch na wypadek, gdyby ta ścieżka została ponownie wprowadzona. Pakiet SDK do nawigacji zgłasza wyjątek środowiska wykonawczego, jeśli wywołasz jedną z metod więcej niż raz, chyba że najpierw usuń wszystkie odwołania do ForegroundServiceManager i wywołaj clearForegroundServiceManager() przed każdym kolejnym połączeniem.

Cztery parametry parametru initForegroundServiceManagerMessageAndIntent() to application, notificationId, defaultMessage i resumeIntent. Jeśli ostatnie 3 parametry mają wartość null, powiadomienie jest standardowe Powiadomienie pakietu SDK nawigacji. Nadal możesz ukryć inny pierwszy plan usług w aplikacji, której dotyczy powiadomienie. Parametr notificationId określa identyfikator powiadomienia, który powinien zostać użyty w przypadku tego powiadomienia. Jeśli tak null, używana jest wartość arbitralna. Możesz skonfigurować ją w taki sposób, aby działała koliduje z innymi powiadomieniami, np. z innego pakietu SDK. defaultMessage to ciąg znaków, który jest wyświetlany, gdy system nie nawigacji. resumeIntent to intencja, która jest wywoływana po kliknięciu powiadomienia. Jeśli wartość resumeIntent jest pusta, kliknięcia powiadomienia są ignorowane.

initForegroundServiceManagerProvider() to 3 parametry: application, notificationId i notificationProvider. Jeśli wynik końcowy dwa parametry mają wartość null, powiadomienie to standardowy pakiet SDK nawigacji powiadomienia. Parametr notificationId określa identyfikator powiadomienia, którego należy użyć do powiadomienia. Jeśli ma wartość null, używana jest dowolna wartość. Możesz skonfigurować ją w taki sposób, aby obchodziła konflikty z innymi , np. powiadomień z innego pakietu SDK. Jeśli notificationProvider to to usługodawca jest zawsze odpowiedzialny za które ma generować powiadomienia, które mają być renderowane.

Metoda getForegroundServiceManager() pakietu Navigation SDK zwraca parametr menedżer usługi na pierwszym planie singleton. Jeśli nie został on jeszcze wygenerowany, to odpowiednik wywołania initForegroundServiceManagerMessageAndIntent() z parametrami null dla parametrów notificationId, defaultMessage i resumeIntent

ForegroundServiceManager ma 3 proste metody. Pierwsze 2 z nich dotyczą przenoszenia usługi na pierwszy plan i z niego. Są zwykle wywoływane z metody w utworzonej usłudze. Użycie tych metod zapewnia, że usługi są powiązane ze współdzielonym trwałym powiadomieniem. Ostatnia metoda, updateNotification(), sygnalizuje menedżerowi, że powiadomienie zostało zmienione i należy je ponownie wyrenderować.

Jeśli potrzebujesz pełnej kontroli nad udostępnianym trwałym powiadomieniem, interfejs API udostępnia interfejs NotificationContentProvider do definiowania dostawcy powiadomień, który umożliwia otrzymywanie powiadomień z bieżącą treścią. Zapewnia też klasę bazową, którą można mogą być opcjonalnie używane do zdefiniowania dostawcy. Jednym z głównych celów klasy bazowej jest to, że umożliwia ona wywołanie funkcji updateNotification() bez konieczności uzyskiwania dostępu do funkcji ForegroundServiceManager. Jeśli używasz instancji dostawcy powiadomień, aby otrzymywać nowe powiadomienia, możesz zadzwonić pod ten numer bezpośrednio do renderowania wiadomości w powiadomieniu.

Scenariusze użycia

Ta sekcja zawiera szczegółowe informacje o scenariuszach użytkowania udostępnianych stałych zasobów powiadomienia.

Ukryj trwałe powiadomienia innych usług działających na pierwszym planie aplikacji
Najłatwiej zachować bieżące zachowanie i korzystać tylko z tagu trwałe powiadomienie o renderowaniu informacji z pakietu Navigation SDK. Inne usługi może ukryć się za tym powiadomieniem przy użyciu menedżera usługi na pierwszym planie Metody startForeground() i stopForeground().
Ukryj trwałe powiadomienia innych usług działających na pierwszym planie, ale ustaw tekst domyślny wyświetlany, gdy nie jest włączona nawigacja
Drugi najprostszy scenariusz to zachowanie bieżących informacji i używanie wyłącznie trwałe powiadomienie o renderowaniu informacji z pakietu Navigation SDK, z wyjątkiem gdy system nie jest włączony. Gdy system nie prowadzi nawigacji, wyświetla się ciąg znaków podany w parametrze initForegroundServiceManagerMessageAndIntent(), a nie domyślny ciąg znaków w Navigation SDK, który zawiera „Mapy Google”. Możesz też użyć tego wywołania, aby ustawić intencję wznawiania, która uruchamia się po kliknięciu powiadomienia.
Przejmij pełną kontrolę nad renderowaniem trwałego powiadomienia
Ostatni scenariusz wymaga zdefiniowania i utworzenia dostawcy powiadomień i przekazywanie jej do funkcji ForegroundServiceManager za pomocą initForegroundServiceManagerProvider() Ta opcja umożliwia pełną kontrolę nad tym, co jest renderowane w powiadomieniu, ale ma też odłącza informacje o powiadomieniu z pakietu Navigation SDK od i usuwa przydatne wskazówki zakręt po zakręcie powiadomienia. Google nie udostępnia prostego sposobu na jej pobranie i umieszczając je w powiadomieniu.

Przykładowy dostawca powiadomień

Poniższy przykładowy kod pokazuje, jak tworzyć i zwracać powiadomienia za pomocą prostego dostawcy treści powiadomień.

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 "";
   }
 }
}

Po utworzeniu klastra NotificationContentProviderImpl połącz pakietu SDK nawigacji za pomocą tego kodu:

ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);

Zastrzeżenia i plany na przyszłość

  • Pamiętaj, aby wcześniej wywołać funkcję initForegroundServiceManagerMessageAndIntent() lub initForegroundServiceManagerProvider(), aby dobrze zdefiniować oczekiwany scenariusz użycia. Tę metodę musisz wywołać przed utworzeniem nowego obiektu Navigator.
  • Pamiętaj, aby wykrywać wyjątki od wywołań funkcji initForegroundServiceManagerMessageAndIntent() lub initForegroundServiceManagerProvider(), jeśli ścieżka kodu to wprowadzono więcej niż raz. Wywołanie tej metody w pakiecie SDK Navigation w wersji 2.0 zgłasza sprawdzony wyjątek, a nie wyjątek środowiska wykonawczego.
  • Nadal możemy jednak pracować nad spójnością stylu czas trwania powiadomienia pasującego do stylu nagłówka.
  • Po zdefiniowaniu dostawcy powiadomień możesz kontrolować działanie powiadomień z priorytetem.
  • Google nie zapewnia prostego dostępu do szczegółowych informacji jakie dostawca powiadomień może wstawić do powiadomienia.