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.
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()
istopForeground()
. - 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()
lubinitForegroundServiceManagerProvider()
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()
lubinitForegroundServiceManagerProvider()
, 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.