了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Odbieraj wiadomości w aplikacji na Androida

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 . Powinien obsłużyć każdą wiadomość w ciągu 20 sekund od otrzymania (10 sekund na Androidzie Marshmallow). Okno czasowe może być krótsze w zależności od opóźnień systemu operacyjnego przed wywołaniem onMessageReceived . Po tym czasie różne zachowania systemu operacyjnego, takie jak limity wykonywania w tle Androida O, mogą przeszkadzać w ukończeniu pracy. Aby uzyskać więcej informacji, zapoznaj się z naszym przeglądem priorytetów wiadomości .

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.
Aby uzyskać więcej informacji o typach wiadomości, zobacz Powiadomienia i wiadomości z danymi .

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

  1. 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'
    
  2. Spraw, by FirebaseMessagingService była świadoma bezpośredniego rozruchu aplikacji, dodając atrybut android: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 innych Services , które nie są oznaczone jako świadome rozruchu bezpośredniego podczas uruchamiania 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 .