Powiadomienia Firebase zachowują się różnie w zależności od stanu pierwszego planu/tła aplikacji odbierającej. Jeśli chcesz, aby aplikacje działające na pierwszym planie otrzymywały powiadomienia lub wiadomości z danymi, musisz napisać kod do obsługi wywołania onMessageReceived
. Aby uzyskać wyjaśnienie różnicy między powiadomieniami a komunikatami z danymi, zobacz Typy komunikatów .
Obsługa wiadomości
Aby odbierać wiadomości, użyj usługi, która rozszerza FirebaseMessagingService
. Twoja usługa powinna zastąpić wywołania zwrotne onMessageReceived
i onDeletedMessages
.
Okno czasowe obsługi komunikatu może być krótsze niż 20 sekund w zależności od opóźnień powstałych przed wywołaniem onMessageReceived
, w tym opóźnień systemu operacyjnego, czasu uruchamiania aplikacji, zablokowania głównego wątku przez inne operacje lub wcześniejszych wywołań onMessageReceived
trwających zbyt długo. Po tym czasie różne zachowania systemu operacyjnego, takie jak zabijanie procesów Androida lub limity wykonywania w tle Androida O, mogą przeszkadzać w ukończeniu pracy.
onMessageReceived
jest dostępny dla większości typów wiadomości, z następującymi wyjątkami:
Powiadomienia dostarczane, gdy aplikacja działa w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia. Dotknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikacje.
Wiadomości z powiadomieniem i ładunkiem danych, gdy są odbierane w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach intencji działania programu uruchamiającego.
W podsumowaniu:
Stan aplikacji | Powiadomienie | Dane | Obydwa |
---|---|---|---|
Pierwszoplanowy | onMessageReceived | onMessageReceived | onMessageReceived |
Tło | Taca systemowa | onMessageReceived | Powiadomienie: zasobnik systemowy Dane: w dodatkach intencji. |
Edytuj manifest aplikacji
Aby korzystać z FirebaseMessagingService
, w manifeście aplikacji musisz dodać:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Zaleca się również ustawienie wartości domyślnych w celu dostosowania wyglądu powiadomień. Możesz określić niestandardową domyślną ikonę i niestandardowy domyślny kolor, które są stosowane, gdy w ładunku powiadomienia nie są ustawione równoważne wartości.
Dodaj te linie wewnątrz tagu application
, aby ustawić niestandardową domyślną ikonę i niestandardowy kolor:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
Android wyświetla niestandardową domyślną ikonę dla
- Wszystkie powiadomienia wysłane z kompozytora powiadomień .
- Dowolny komunikat powiadomienia, który nie ustawia jawnie ikony w ładunku powiadomienia.
Android używa niestandardowego domyślnego koloru dla
- Wszystkie powiadomienia wysłane z kompozytora powiadomień .
- Dowolny komunikat powiadomienia, który nie ustawia jawnie koloru w ładunku powiadomienia.
Jeśli nie jest ustawiona niestandardowa ikona domyślna i żadna ikona nie jest ustawiona w ładunku powiadomienia, system Android wyświetla ikonę aplikacji w kolorze białym.
Zastąp onMessageReceived
Nadpisując metodę FirebaseMessagingService.onMessageReceived
możesz wykonać akcje na podstawie odebranego obiektu RemoteMessage i uzyskać dane komunikatu:
Kotlin+KTX
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Zastąp onDeletedMessages
W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy dla Twojej aplikacji jest zbyt wiele oczekujących wiadomości (>100) w momencie łączenia lub gdy urządzenie nie łączy się z FCM od ponad miesiąca. W takich przypadkach możesz otrzymać wywołanie zwrotne do FirebaseMessagingService.onDeletedMessages()
Gdy instancja aplikacji odbierze to wywołanie zwrotne, powinna przeprowadzić pełną synchronizację z serwerem aplikacji. Jeśli nie wysłałeś wiadomości do aplikacji na tym urządzeniu w ciągu ostatnich 4 tygodni, FCM nie wywoła onDeletedMessages()
.Obsługuj powiadomienia w aplikacji działającej w tle
Gdy Twoja aplikacja działa w tle, Android kieruje powiadomienia do zasobnika systemowego. Dotknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikacje.
Dotyczy to wiadomości, które zawierają zarówno powiadomienie, jak i ładunek danych (oraz wszystkie wiadomości wysłane z konsoli powiadomień). W takich przypadkach powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach związanych z intencją działania programu uruchamiającego.
Wgląd w dostarczanie wiadomości do Twojej aplikacji znajdziesz w panelu raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i Android, a także dane dotyczące „wyświetleń” (powiadomień widzianych przez użytkowników) dla aplikacji na Androida.
Odbieraj komunikaty FCM w trybie rozruchu bezpośredniego
Deweloperzy, którzy chcą wysyłać komunikaty FCM do aplikacji jeszcze przed odblokowaniem urządzenia, mogą włączyć odbieranie wiadomości przez aplikację na Androida, gdy urządzenie jest w trybie rozruchu bezpośredniego. Na przykład możesz chcieć, aby użytkownicy Twojej aplikacji otrzymywali powiadomienia o alarmach nawet na zablokowanym urządzeniu.
Tworząc ten przypadek użycia, przestrzegaj ogólnych najlepszych praktyk i ograniczeń dotyczących trybu rozruchu bezpośredniego . Szczególnie ważne jest rozważenie widoczności komunikatów umożliwiających rozruch bezpośredni; każdy użytkownik mający dostęp do urządzenia może przeglądać te wiadomości bez wprowadzania poświadczeń użytkownika.
Wymagania wstępne
- Urządzenie musi być skonfigurowane do trybu rozruchu bezpośredniego.
- Na urządzeniu musi być zainstalowana najnowsza wersja usług Google Play (19.0.54 lub nowsza).
- Aby odbierać wiadomości FCM, aplikacja musi używać pakietu FCM SDK (
com.google.firebase:firebase-messaging
).
Włącz obsługę komunikatów w trybie rozruchu bezpośredniego w swojej aplikacji
W pliku Gradle na poziomie aplikacji dodaj zależność od biblioteki obsługi bezpośredniego rozruchu FCM:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Spraw, by
FirebaseMessagingService
była świadoma bezpośredniego rozruchu aplikacji, dodając atrybutandroid:directBootAware="true"
w manifeście aplikacji:<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Ważne jest, aby upewnić się, że FirebaseMessagingService
może działać w trybie rozruchu bezpośredniego. Sprawdź następujące wymagania:
- Usługa nie powinna uzyskiwać dostępu do magazynu chronionego poświadczeniami, gdy działa w trybie rozruchu bezpośredniego.
- Usługa nie powinna próbować używać składników, takich jak
Activities
,BroadcastReceivers
ani innychServices
, które nie są oznaczone jako świadome rozruchu bezpośredniego podczas działania w trybie rozruchu bezpośredniego. - Żadne biblioteki używane przez usługę nie mogą również uzyskiwać dostępu do magazynu chronionego poświadczeniami ani wywoływać składników innych niż directBootAware podczas działania w trybie rozruchu bezpośredniego. Oznacza to, że wszystkie biblioteki używane przez aplikację, które są wywoływane z usługi, będą musiały być świadome bezpośredniego rozruchu lub aplikacja będzie musiała sprawdzić, czy działa w trybie rozruchu bezpośredniego, i nie wywoływać ich w tym trybie. Na przykład zestawy SDK Firebase działają z rozruchem bezpośrednim (można je dołączyć do aplikacji bez jej awarii w trybie rozruchu bezpośredniego), ale wiele interfejsów API Firebase nie obsługuje wywoływania w trybie rozruchu bezpośredniego.
- Jeśli aplikacja korzysta z niestandardowej
Application
,Application
będzie również musiała obsługiwać rozruch bezpośredni (brak dostępu do magazynu chronionego poświadczeniami w trybie rozruchu bezpośredniego).
Aby uzyskać wskazówki dotyczące wysyłania komunikatów do urządzeń w trybie rozruchu bezpośredniego, zobacz Wysyłanie komunikatów z włączoną funkcją rozruchu bezpośredniego .