Nachrichten in einer Android-App empfangen

Firebase-Benachrichtigungen verhalten sich je nach Vorder- und Hintergrund unterschiedlich. Status der empfangenden App. Wenn Sie möchten, dass Apps im Vordergrund oder Datenmeldungen erhalten möchten, müssen Sie Code schreiben, onMessageReceived-Callback Eine Erklärung des Unterschieds zwischen Benachrichtigungs- und Datennachrichten finden Sie unter Weitere Informationen

Umgang mit Nachrichten

Nutzen Sie zum Empfangen von Nachrichten einen Dienst, FirebaseMessagingService Ihr Dienst sollte onMessageReceived und onDeletedMessages überschreiben. Callbacks angegeben werden.

Das Zeitfenster für die Verarbeitung einer Nachricht kann kürzer als 20 Sekunden sein, je nach Verzögerungen vor dem Aufruf von onMessageReceived. Dazu gehören Betriebssystemverzögerungen, die App-Startzeit, das Blockieren des Hauptthreads durch andere Vorgänge oder zu lange vorherige onMessageReceived-Aufrufe. Danach können verschiedene Betriebssystemfunktionen wie das Beenden von Prozessen unter Android oder die Einschränkungen für die Hintergrundausführung unter Android O Ihre Arbeit beeinträchtigen.

onMessageReceived wird für die meisten Nachrichtentypen bereitgestellt, mit folgenden Ausnahmen:

  • Benachrichtigungen, die zugestellt werden, wenn die App im Hintergrund ausgeführt wird: In dieser wird die Benachrichtigung in der Taskleiste des Geräts abgelegt. Ein Nutzer tippt auf eine Benachrichtigung. öffnet den App Launcher standardmäßig.

  • Nachrichten mit Benachrichtigungs- und Datennutzlast, die im Hintergrund empfangen werden In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt, und die Datennutzlast wird in den Extras des der Launcher-Aktivität.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund onMessageReceived onMessageReceived onMessageReceived
Hintergrund Taskleiste onMessageReceived Benachrichtigung: Infobereich
Daten: in den Extras der Intent.
Weitere Informationen zu Nachrichtentypen finden Sie unter Benachrichtigungen und Datennachrichten.

App-Manifest bearbeiten

Wenn Sie FirebaseMessagingService verwenden möchten, müssen Sie Folgendes in Ihr App-Manifest einfügen:

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

Außerdem wird empfohlen, Standardwerte festzulegen, um die Darstellung von Benachrichtigungen anzupassen. Sie können ein benutzerdefiniertes Standardsymbol und eine benutzerdefinierte Standardfarbe angeben, die angewendet werden, wenn in der Benachrichtigungsnutzlast keine entsprechenden Werte festgelegt sind.

Fügen Sie diese Zeilen application-Tag, um das benutzerdefinierte Standardsymbol und die benutzerdefinierte Farbe festzulegen:

<!-- 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 zeigt das benutzerdefinierte Standardsymbol für

  • Alle Benachrichtigungsnachrichten, die über den Benachrichtigungs-Editor gesendet wurden.
  • Alle Benachrichtigungsnachrichten, in denen das Symbol nicht explizit in der Benachrichtigungsnutzlast festgelegt ist.

Android verwendet die benutzerdefinierte Standardfarbe für

  • Alle Benachrichtigungsnachrichten, die über den Benachrichtigungs-Editor gesendet wurden.
  • Alle Benachrichtigungsnachrichten, bei denen die Farbe der Benachrichtigung nicht explizit festgelegt wird Payload.

Wenn kein benutzerdefiniertes Standardsymbol festgelegt ist und auch in der Benachrichtigungsnutzlast kein Symbol festgelegt ist, wird auf Android-Geräten das App-Symbol in weiß angezeigt.

onMessageReceived überschreiben

Wenn Sie die Methode FirebaseMessagingService.onMessageReceived überschreiben, Aktionen basierend auf den empfangenen RemoteMessage und rufen Sie die Nachrichtendaten ab:

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

onDeletedMessages überschreiben

In einigen Situationen kann es vorkommen, dass FCM keine Nachricht sendet. Das passiert, wenn zu viele ausstehende Nachrichten (>100) für Ihre App auf einem bestimmten Gerät ausgeführt hat, als sie verbunden ist oder wenn das Gerät noch nicht mit FCM in mehr als einem Monat. In diesen Fällen erhältst du eventuell einen Rückruf an FirebaseMessagingService.onDeletedMessages() Wenn die App-Instanz diesen Callback empfängt, sollte eine vollständige Synchronisierung mit Ihrem Anwendungsserver durchgeführt werden. Wenn du auf diesem Gerät keine Nachricht an die App gesendet hast in den letzten 4 Wochen verwendet, ruft FCM onDeletedMessages() nicht an.

Benachrichtigungen in einer App im Hintergrund verarbeiten

Wenn deine App im Hintergrund ausgeführt wird, leitet Android Benachrichtigungen an folgende Adresse weiter: in die Taskleiste. Durch Tippen auf die Benachrichtigung wird der App Launcher geöffnet, Standardeinstellung.

Dazu gehören Nachrichten, die sowohl Benachrichtigungs- als auch Datennutzlast enthalten, sowie alle Nachrichten, die über die Benachrichtigungskonsole gesendet wurden. In diesen Fällen wird die Benachrichtigung an den in der Taskleiste und die Datennutzlast wird in den Extras des Intents bereitgestellt. deiner Launcher-Aktivitäten.

Informationen zur Zustellung von Nachrichten an Ihre App finden Sie im FCM-Dashboard für Berichte. Dort werden die Anzahl der auf Apple- und Android-Geräten gesendeten und geöffneten Nachrichten sowie Daten zu „Impressionen“ (von Nutzern gesehene Benachrichtigungen) für Android-Apps erfasst.

FCM-Nachrichten im direkten Boot-Modus empfangen

Entwickler, die FCM-Nachrichten an Apps senden möchten, noch bevor das Gerät entsperrt wird, können einer Android-App erlauben, Nachrichten zu empfangen, wenn sich das Gerät im Direktstartmodus befindet. Beispielsweise möchten Sie, dass Nutzer Ihrer App auch auf einem gesperrten Gerät Weckerbenachrichtigungen erhalten.

Berücksichtigen Sie bei der Erstellung dieses Anwendungsfalls die allgemeinen Best Practices und Einschränkungen für den direkten Bootmodus Es ist besonders wichtig, um die Sichtbarkeit von direkt nach dem Start ermöglichten Nachrichten; kann jeder Nutzer mit Zugriff auf das Gerät diese Nachrichten ohne Nutzeranmeldedaten eingeben.

Vorbereitung

  • Das Gerät muss für den direkten Bootmodus eingerichtet sein.
  • Auf dem Gerät muss eine aktuelle Version der Google Play-Dienste (19.0.54 oder höher) installiert sein.
  • Die App muss das FCM SDK (com.google.firebase:firebase-messaging) verwenden, um FCM-Nachrichten zu empfangen.

Nachrichtenverarbeitung im direkten Bootmodus in Ihrer App aktivieren

  1. Fügen Sie in der Gradle-Datei auf App-Ebene eine Abhängigkeit von der FCM Direct Boot-Supportbibliothek hinzu:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Wenn du den direkten FirebaseMessagingService-Start der App aktivierst, füge das Attribut android:directBootAware="true" im App-Manifest hinzu:

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

Es ist wichtig, dass diese FirebaseMessagingService im Direktstartmodus ausgeführt werden kann. Prüfen Sie, ob die folgenden Anforderungen erfüllt sind:

  • Der Dienst sollte nicht auf mit Anmeldedaten geschützten Speicher zugreifen, während er im direkten Boot-Modus ausgeführt wird.
  • Der Dienst darf keine Komponenten wie Activities, BroadcastReceivers oder andere Services verwenden, die nicht als für den direkten Start geeignet gekennzeichnet sind, während er im Direktstartmodus ausgeführt wird.
  • Alle vom Dienst verwendeten Bibliotheken dürfen auch nicht auf mit Anmeldedaten geschützten Speicher zugreifen oder nicht direkt bootfähige Komponenten aufrufen, während sie im Direktstartmodus ausgeführt werden. Das bedeutet, dass alle von der App verwendeten Bibliotheken, die vom Dienst aufgerufen werden, entweder für den direkten Start geeignet sein müssen oder die App muss prüfen, ob sie im Direktstartmodus ausgeführt wird, und sie in diesem Modus nicht aufrufen. Firebase SDKs können beispielsweise direkt in eine App eingebunden werden, ohne im direkten Bootmodus zum Absturz bringen, aber viele Firebase APIs unterstützen den Aufruf im direkten Bootmodus nicht. Bootmodus starten können.
  • Wenn die App ein benutzerdefiniertes Application verwendet, muss Application auch direkt gestartet werden bewusst (kein Zugriff auf Anmeldedaten-geschützten Speicher im direkten Bootmodus).

Eine Anleitung zum Senden von Nachrichten an Geräte im Direktstartmodus finden Sie unter Nachrichten für den Direktstart senden.