Odbieraj wiadomości w aplikacji na Androida

Powiadomienia Firebase działają różnie w zależności od stanu pierwszego planu/w tle aplikacji odbierającej. Jeśli chcesz pierwszy plan aplikacje do otrzymania powiadomienia lub wiadomości z danymi, trzeba napisać kod do obsługi onMessageReceived zwrotnego. O wyjaśnienie różnicy między powiadomień i danych, zobacz Typy wiadomości .

Obsługa wiadomości

Aby odbierać wiadomości, skorzystać z usługi, która rozciąga FirebaseMessagingService . Usługa powinna przesłonić onMessageReceived i onDeletedMessages zwrotnych. 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ótszy w zależności od systemu operacyjnego opóźnień naprzód nazywać onMessageReceived . Po tym czasie, różne zachowania, takie jak Android OS ö w granicach realizacji tło może zaburzać zdolność do zakończenia pracy. Aby uzyskać więcej informacji, zobacz nasz przegląd priorytetu wiadomości .

onMessageReceived jest dla większości typów komunikatów, z następującymi wyjątkami:

  • Powiadomienia dostarczone, gdy aplikacja znajduje się 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 aplikację.

  • Wiadomości z obu powiadomienia i ładowności danych, gdy otrzymał w tle. W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach zgodnie z intencją działania programu uruchamiającego.

W podsumowaniu:

Stan aplikacji Notyfikacja Dane Obie
Pierwszoplanowy onMessageReceived onMessageReceived onMessageReceived
Tło Taca systemowa onMessageReceived Powiadomienie: taca systemowa
Dane: w dodatkach intencji.
Aby uzyskać więcej informacji na temat typów wiadomości, patrz powiadomień i danych wiadomości .

Edytuj manifest aplikacji

Aby korzystać FirebaseMessagingService , należy dodać następujące w app manifeście:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Ponadto zaleca się ustawienie wartości domyślnych, aby dostosować wygląd powiadomień. Można 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 application tagu ustawić domyślną ikonę zwyczaj i kolor niestandardowy:

<!-- 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 wysyłane z kompozytorem powiadomień .
  • Każda wiadomość z powiadomieniem, która nie ustawia jawnie ikony w ładunku powiadomienia.

Android używa niestandardowego domyślnego koloru dla

  • Wszystkie powiadomienia wysyłane z kompozytorem powiadomień .
  • Dowolny komunikat z powiadomieniem, który nie określa jawnie koloru w ładunku powiadomienia.

Jeśli nie ustawiono niestandardowej ikony domyślnej i nie ustawiono żadnej ikony w ładunku powiadomienia, system Android wyświetla ikonę aplikacji w kolorze białym.

Przestawianie onMessageReceived

Nadrzędnymi metoda FirebaseMessagingService.onMessageReceived można wykonywać działania w oparciu o otrzymane RemoteMessage obiektu i uzyskać dane wiadomość:

Jawa

@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.
}

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

        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.
    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.
}

nadpisywania onDeletedMessages

W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy jest zbyt wiele wiadomości (>100) oczekujących na aplikację na określonym urządzeniu w momencie łączenia się lub jeśli urządzenie nie łączy się z FCM przez ponad miesiąc. W takich przypadkach może pojawić się oddzwanianie do FirebaseMessagingService.onDeletedMessages() Gdy instancja aplikacja odbiera ten zwrotnego, należy przeprowadzić pełną synchronizację z serwerem aplikacji. Jeśli nie wysłał wiadomość do aplikacji na tym urządzeniu w ciągu ostatnich 4 tygodni, FCM nie zadzwoni onDeletedMessages() .

Obsługa powiadomień 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 aplikację.

Obejmuje to wiadomości zawierające zarówno powiadomienia, jak i ładunek danych (oraz wszystkie wiadomości wysyłane z konsoli powiadomień). W takich przypadkach powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach zgodnie z intencją działania programu uruchamiającego.

Dla wgląd dostarczania wiadomości do swojej aplikacji, zobacz pulpit raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwarte na urządzeniach z systemem iOS i Android, wraz z danymi dla „wrażeń” (zgłoszenia widziane przez użytkowników) dla Android.

Aplikacje z ograniczonym dostępem w tle (Android P lub nowszy)

FCM nie może dostarczyć wiadomości do aplikacji, które zostały wprowadzone do ograniczenia tła przez użytkownika (na przykład poprzez: Ustawienia -> Aplikacje i Notification -> [appname] -> baterii). Gdy aplikacja zostanie usunięta z ograniczenia w tle, nowe wiadomości do aplikacji będą dostarczane tak jak poprzednio. W celu uniknięcia utraconych wiadomości i innych skutków restrykcyjnych tło, upewnij się, aby uniknąć złych zachowań wymienione przez Android Vitals wysiłku. Takie zachowania mogą spowodować, że urządzenie z Androidem zaleci użytkownikowi ograniczenie aplikacji w tle. Twoja aplikacja może sprawdzić, czy jest to tło ograniczony przy użyciu: isBackgroundRestricted () .

Odbieraj wiadomości FCM w trybie bezpośredniego rozruchu

Deweloperzy, którzy chcą wysyłać wiadomości FCM do aplikacji jeszcze przed odblokowaniem urządzenia, mogą umożliwić aplikacji na Androida otrzymywanie wiadomości, 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.

Kiedy budowa się takim przypadku należy przestrzegać ogólnych najlepszych praktyk i ograniczeń dla trybu rozruchowego bezpośredniego . Jest to szczególnie ważne, aby rozważyć widoczność bezpośrednich komunikatów startowych obsługą; każdy użytkownik mający dostęp do urządzenia może przeglądać te wiadomości bez wprowadzania danych uwierzytelniających użytkownika.

Warunki 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).
  • Aplikacja musi używać FCM SDK ( com.google.firebase:firebase-messaging ), aby odbierać wiadomości FCM.

Włącz obsługę komunikatów trybu bezpośredniego rozruchu w swojej aplikacji

  1. W pliku Gradle na poziomie aplikacji dodaj zależność od biblioteki obsługi rozruchu bezpośredniego FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Złóż aplikację za FirebaseMessagingService bezpośredniego rozruchu świadomy poprzez dodanie android:directBootAware="true" atrybutu w aplikacji manifeście:

    <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 ten FirebaseMessagingService może działać w trybie rozruchowym bezpośredniego. Sprawdź następujące wymagania:

  • Usługa nie powinna uzyskiwać dostępu do magazynu chronionego danymi uwierzytelniającymi podczas działania w trybie rozruchu bezpośredniego.
  • Usługa nie powinna próbować komponentów używania, takie jak Activities , BroadcastReceivers lub innych Services , które nie są oznaczone jako bezpośrednie starcie świadomy podczas pracy w trybie rozruchowym bezpośredniego.
  • Wszelkie 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ż bezpośrednie BootAware 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 bezpośredniego rozruchu i nie wywoływać ich w tym trybie. Na przykład pakiety SDK Firebase działają z rozruchem bezpośrednim (mogą być dołączone 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 używa niestandardowych Application The Application będzie musiała być świadoma rozruchu bezpośrednim (brak dostępu do magazynu danych logowania chronione w trybie rozruchowym bezpośredniego).

W celu uzyskania wskazówek na temat wysyłania wiadomości do urządzeń w trybie rozruchowym bezpośredniego, patrz Wyślij bezpośrednie komunikaty startowe włączony .