Nachrichten in Android-Apps empfangen

Plattform auswählen : iOS+ Android Web Flutter Unity C++


Wenn Sie Nachrichten empfangen möchten, können Sie einen Dienst verwenden, der FirebaseMessagingService erweitert. Ihr Dienst sollte die Callbacks onMessageReceived und onDeletedMessages überschreiben. Ein vollständiges Beispiel finden Sie im Firebase Cloud Messaging-Schnellstart beispiel.

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

  • Benachrichtigungen, die zugestellt werden, wenn sich Ihre App im Hintergrund befindet. In diesem Fall wird die Benachrichtigung an die Taskleiste des Geräts gesendet. Wenn ein Nutzer auf eine Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.

  • Nachrichten mit Benachrichtigungs- und Daten-Payload, die im Hintergrund empfangen werden. In diesem Fall wird die Benachrichtigung an die Taskleiste des Geräts gesendet und die Daten-Payload wird in den Extras der Intent-Aktivität Ihres Launchers bereitgestellt.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund onMessageReceived onMessageReceived onMessageReceived
Hintergrund Taskleiste onMessageReceived Benachrichtigung: Taskleiste Daten: in den Extras der Intent-Aktivität

Weitere Informationen zu Nachrichtentypen finden Sie unter Benachrichtigungen und Daten nachrichten.

Der onMessageReceived-Callback hat ein kurzes Ausführungsfenster. Viele Faktoren können sich auf die Länge dieses Fensters auswirken, z. B. Verzögerungen des Betriebssystems, die Startzeit der App, die Blockierung des Hauptthreads durch andere Vorgänge oder zu lange onMessageReceived-Aufrufe.

Aus diesem Grund sollten Sie in onMessageReceived keine zeitaufwendigen Aufgaben ausführen (z. B. das Abrufen von Bildern von einem Server, um sie in einer Benachrichtigung anzuzeigen), sondern stattdessen mit WorkManager eine Aufgabe planen, um alle Aufgaben zu verarbeiten, deren Ausführung länger als ein paar Sekunden dauern könnte. Weitere Informationen zur Nachrichtenpriorität und deren Auswirkungen auf die Verarbeitung finden Sie unter Nachrichtenverarbeitung für Nachrichten mit hoher und normaler Priorität Nachrichten.

App-Manifest bearbeiten

Wenn Sie FirebaseMessagingService verwenden möchten, müssen Sie Ihrem App-Manifest Folgendes hinzufügen:

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

Es wird empfohlen, Standardwerte festzulegen, um das Erscheinungsbild von Benachrichtigungen anzupassen. Sie können ein benutzerdefiniertes Standardsymbol und eine benutzerdefinierte Standardfarbe angeben, die angewendet werden, wenn in der Benachrichtigungs-Nutzlast keine entsprechenden Werte festgelegt sind.

Fügen Sie diese Zeilen in das application-Tag ein, 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 Folgendes an und verwendet es:

  • Alle Benachrichtigungen, die über den Benachrichtigungs Composer gesendet werden.
  • Alle Benachrichtigungen, bei denen das Symbol nicht explizit in der Benachrichtigungs-Payload festgelegt ist.

Wenn kein benutzerdefiniertes Standardsymbol festgelegt ist und in der Benachrichtigungs-Payload kein Symbol festgelegt ist, zeigt Android das in Weiß gerenderte App-Symbol an.

onMessageReceived überschreiben

Durch Überschreiben der Methode FirebaseMessagingService.onMessageReceived können Sie Aktionen basierend auf dem empfangenen RemoteMessage Objekt ausführen und die Nachrichtendaten abrufen:

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

onDeletedMessages überschreiben

In einigen Fällen kann FCM eine Nachricht nicht zustellen. Das passiert, wenn zum Zeitpunkt der Verbindung zu viele Nachrichten (> 100) für Ihre App auf einem bestimmten Gerät ausstehen oder wenn das Gerät seit mehr als einem Monat keine Verbindung zu FCM hergestellt hat. In diesen Fällen erhalten Sie möglicherweise einen Callback zu FirebaseMessagingService.onDeletedMessages(). Wenn die App-Instanz diesen Callback erhält, sollte sie eine vollständige Synchronisierung mit Ihrem App-Server durchführen. Wenn Sie in den letzten vier Wochen keine Nachricht an die App auf diesem Gerät gesendet haben, FCM ruft onDeletedMessages() nicht auf.

Benachrichtigungen in einer im Hintergrund ausgeführten App verarbeiten

Wenn sich Ihre App im Hintergrund befindet, leitet Android Benachrichtigungen an die Taskleiste weiter. Wenn ein Nutzer auf die Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.

Dazu gehören Nachrichten, die sowohl eine Benachrichtigungs- als auch eine Daten-Nutzlast enthalten, sowie alle Nachrichten, die über die Notifications-Konsole gesendet werden. In diesen Fällen wird die Benachrichtigung an die Taskleiste des Geräts gesendet und die Daten-Nutzlast wird in den Extras der Intent-Aktivität Ihres Launchers bereitgestellt.

Weitere Informationen zur Zustellung von Nachrichten an Ihre App finden Sie unter FCM Berichts-Dashboard. Dort wird die Anzahl der Nachrichten erfasst, die auf Apple- und Android-Geräten gesendet und geöffnet wurden, sowie Daten zu "Impressionen" (Benachrichtigungen, die von Nutzern gesehen wurden) für Android-Apps.