Odbieranie wiadomości w aplikacjach na Androida

Wybierz platformę: iOS+ Android Web Flutter Unity C++


Aby otrzymywać wiadomości, możesz użyć usługi, która rozszerza FirebaseMessagingService. Usługa powinna zastępować wywołania zwrotne onMessageReceived i onDeletedMessages. Pełny przykład znajdziesz w przewodniku Szybki start Komunikacji w chmurze Firebase.

Wywołanie zwrotne onMessageReceived jest dostępne w przypadku większości typów wiadomości, z wyjątkiem tych:

  • Powiadomienia dostarczane, gdy aplikacja działa w tle. W takim przypadku powiadomienie jest dostarczane do obszaru powiadomień urządzenia. Domyślnie kliknięcie powiadomienia przez użytkownika powoduje otwarcie menu z aplikacjami.

  • Wiadomości z powiadomieniem i ładunkiem danych, które zostały odebrane w tle. W takim przypadku powiadomienie jest dostarczane do obszaru powiadomień urządzenia, a dane ładunku są dostarczane w dodatkach do intencji aktywności uruchamiającej.

W skrócie:

Stan aplikacji Powiadomienie Dane Oba rodzaje
Pierwszy plan onMessageReceived onMessageReceived onMessageReceived
Tło Obszar powiadomień onMessageReceived Powiadomienie: obszar powiadomień Dane: w dodatkach do intencji.

Więcej informacji o typach wiadomości znajdziesz w artykule Powiadomienia i wiadomości z danymi.

Wywołanie zwrotne onMessageReceived ma krótki czas wykonania. Na długość tego czasu może wpływać wiele czynników, m.in. opóźnienia systemu operacyjnego, czas uruchamiania aplikacji, blokowanie wątku głównego przez inne operacje lub zbyt długie wykonywanie poprzednich wywołań onMessageReceived.

Z tego powodu w przypadku wywołania zwrotnego onMessageReceived należy unikać długotrwałych zadań (takich jak pobieranie obrazów z serwera w celu wyświetlenia ich w powiadomieniu) i zamiast tego zaplanować zadanie za pomocą WorkManager, aby obsługiwać wszystkie zadania, których wykonanie może potrwać dłużej niż kilka sekund. Więcej informacji o priorytecie wiadomości i jego wpływie na przetwarzanie znajdziesz w artykule Przetwarzanie wiadomości o wysokim i normalnym priorytecie wiadomości.

Edytowanie pliku manifestu aplikacji

Aby korzystać z FirebaseMessagingService, musisz dodać w pliku manifestu aplikacji te elementy:

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

Zalecamy ustawienie wartości domyślnych, aby dostosować wygląd powiadomień. Możesz określić niestandardową ikonę domyślną i niestandardowy kolor domyślny, które będą stosowane, gdy w danych powiadomienia nie będą ustawione równoważne wartości.

Aby ustawić niestandardową ikonę domyślną i niestandardowy kolor, dodaj te wiersze w tagu application:

<!-- 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 i używa niestandardowej ikony domyślnej w przypadku:

  • wszystkich powiadomień wysyłanych z kompozytora powiadomień w Firebase konsoli;

  • każdego powiadomienia, w którego danych nie jest wyraźnie ustawiona ikona.

Jeśli nie ustawisz niestandardowej ikony domyślnej, a w danych powiadomienia nie będzie ustawiona ikona, Android wyświetli ikonę aplikacji w kolorze białym.

Zastępowanie wywołania zwrotnego onMessageReceived

Zastępując metodę FirebaseMessagingService.onMessageReceived, możesz wykonywać działania na podstawie otrzymanego RemoteMessage obiektu i pobierać dane wiadomości:

Kotlin

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ępowanie wywołania zwrotnego onDeletedMessages

W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy w momencie połączenia na danym urządzeniu oczekuje na aplikację zbyt wiele wiadomości (>100) lub gdy urządzenie nie połączyło się z FCM od ponad miesiąca. W takich przypadkach możesz otrzymać wywołanie zwrotne do FirebaseMessagingService.onDeletedMessages(). Gdy instancja aplikacji otrzyma to wywołanie zwrotne, powinna przeprowadzić pełną synchronizację z serwerem aplikacji. Jeśli w ciągu ostatnich 4 tygodni nie wysłano wiadomości do aplikacji na tym urządzeniu, FCM nie wywoła onDeletedMessages().

Obsługa powiadomień w aplikacji działającej w tle

Gdy aplikacja działa w tle, Android kieruje powiadomienia do obszaru powiadomień. Domyślnie kliknięcie powiadomienia przez użytkownika powoduje otwarcie menu z aplikacjami.

Dotyczy to wiadomości, które zawierają zarówno powiadomienie, jak i ładunek danych (oraz wszystkich wiadomości wysyłanych z Edytora powiadomień w konsoli Firebase). W takich przypadkach powiadomienie jest dostarczane do obszaru powiadomień urządzenia, a ładunek danych jest dostarczany w dodatkach do intencji aktywności uruchamiającej.

Aby uzyskać informacje o dostarczaniu wiadomości do aplikacji, otwórz w konsoli Firebase panel DevOps i zaangażowanie > Wiadomości > Raporty. Ten panel rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i Android oraz dane o „wyświetleniach” (powiadomieniach widzianych przez użytkowników) w przypadku aplikacji na Androida.