Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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, aby aplikacje działające na pierwszym planie otrzymywały powiadomienia lub wiadomości dotyczące danych, musisz napisać kod do obsługi wywołania zwrotnego onMessageReceived . Aby uzyskać wyjaśnienie różnicy między powiadomieniami a wiadomościami dotyczącymi danych, zobacz Typy wiadomości .

Obsługa wiadomości

Aby odbierać wiadomości, użyj usługi rozszerzającej 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ą zakłócać Twoją zdolność do ukończenia pracy. Aby uzyskać więcej informacji, zobacz nasz przegląd 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 aplikację.

  • Wiadomości z powiadomieniami i danymi, gdy są odbierane 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 Powiadomienie Dane Obie
Pierwszoplanowy onMessageReceived onMessageReceived onMessageReceived
tło Taca systemowa onMessageReceived Powiadomienie: taca systemowa
Dane: w dodatkach intencji.
Aby uzyskać więcej informacji o typach wiadomości, zobacz Powiadomienia i wiadomości dotyczące danych .

Edytuj manifest aplikacji

Aby korzystać z usługi FirebaseMessagingService , musisz dodać następujące elementy w manifeście aplikacji:

<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 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 przez kompozytora 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 wysłane przez kompozytora 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 renderowaną na biało.

Zastąp przy onMessageReceived

Zastępując metodę FirebaseMessagingService.onMessageReceived , możesz wykonać akcje na podstawie otrzymanego obiektu RemoteMessage i uzyskać dane wiadomości:

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

045983730

Zastąp 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żesz otrzymać wywołanie zwrotne do FirebaseMessagingService.onDeletedMessages() Gdy wystąpienie aplikacji odbierze to wywołanie zwrotne, powinno wykonać 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 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ą Aktywności programu uruchamiającego.

Aby uzyskać wgląd w dostarczanie wiadomości do Twojej aplikacji, zapoznaj się z panelem raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach z systemem iOS i Android wraz z danymi dotyczącymi „wyświetleń” (powiadomień widzianych przez użytkowników) w przypadku aplikacji na Androida.

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

FCM może nie dostarczać wiadomości do aplikacji, które zostały ustawione w tle przez użytkownika (na przykład przez: Ustawienia -> Aplikacje i powiadomienia -> [nazwa aplikacji] -> Bateria). Gdy aplikacja zostanie usunięta z ograniczenia w tle, nowe wiadomości do aplikacji będą dostarczane tak jak poprzednio. Aby zapobiec utracie wiadomości i innym wpływom ograniczeń w tle, unikaj złych zachowań wymienionych w wysiłkach Android Vitals . Takie zachowania mogą spowodować, że urządzenie z Androidem zaleci użytkownikowi ograniczenie aplikacji w tle. Twoja aplikacja może sprawdzić, czy jest ograniczona w tle, używając: 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.

Podczas tworzenia tego przypadku użycia należy przestrzegać ogólnych sprawdzonych metod i ograniczeń dotyczących trybu rozruchu bezpośredniego . Szczególnie ważne jest, aby wziąć pod uwagę widoczność komunikatów związanych z bezpośrednim rozruchem; 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 korzystać z pakietu SDK FCM ( com.google.firebase:firebase-messaging ), aby otrzymywać 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 ta FirebaseMessagingService mogła działać w trybie rozruchu 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ć używać składników, takich jak Activities , BroadcastReceivers lub inne Services , które nie są oznaczone jako rozpoznające rozruch bezpośredni podczas działania w trybie rozruchu bezpośredniego.
  • Wszelkie biblioteki używane przez usługę nie mogą również uzyskiwać dostępu do magazynu chronionego danymi uwierzytelniającymi 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 korzysta z Application niestandardowej , Application będzie również musiała obsługiwać funkcję bezpośredniego rozruchu (brak dostępu do magazynu chronionego danymi uwierzytelniającymi w trybie rozruchu bezpośredniego).

Aby uzyskać wskazówki dotyczące wysyłania wiadomości do urządzeń w trybie rozruchu bezpośredniego, zobacz Wysyłanie wiadomości z włączonym rozruchem bezpośrednim .