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 komplikuje się, gdy używasz 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.

Konsolidacja trwałych powiadomień

Komponenty

Menedżer usługi na pierwszym planie zapewnia otokę na pierwszym planie Androida klasa usługi i klasa stałego powiadomienia. 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 korzystasz z jednej z wywołania inicjujące (initForegroundServiceManagerMessageAndIntent() lub initForegroundServiceManagerProvider()), musisz otoczyć za pomocą bloku try-catch na wypadek ponownego wprowadzenia tej ścieżki. 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. Intencja resumeIntent jest wywoływana, gdy powiadomienie użytkownik klika link. Jeśli resumeIntent ma wartość null, klika powiadomienie. 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óre powinny być używane w przypadku powiadomienia. Jeśli jest to wartość null, dowolna wartość jest . 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 udostępnia 3 proste metody. Pierwsze dwa są przeznaczone 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. Finał updateNotification() wskazuje menedżera, że powiadomienie została zmieniona i należy ją 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. Jedna z głównych klasy bazowej jest to, że umożliwia wywołanie funkcji updateNotification() bez muszą uzyskać dostęp do: 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żytkowania

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 aktywny. Gdy system nie działa, ciąg został przekazany do funkcji initForegroundServiceManagerMessageAndIntent() zamiast domyślnego ciągu tekstowego pakietu Navigation SDK, który zawiera wzmiankę „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ść

  • Zadzwoń pod numer initForegroundServiceManagerMessageAndIntent() lub initForegroundServiceManagerProvider() wcześniej, jest dobrze zdefiniowany. Musisz wywołać tę metodę przed utworzeniem nowego Nawigatora.
  • 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.