Firebase-Benachrichtigungen verhalten sich je nach Vordergrund-/Hintergrundstatus der empfangenden App unterschiedlich. Wenn Sie möchten, dass Apps im Vordergrund Benachrichtigungs- oder Datennachrichten empfangen, müssen Sie Code schreiben, um den onMessageReceived
-Callback zu verarbeiten.
Eine Erklärung des Unterschieds zwischen Benachrichtigungs- und Datennachrichten finden Sie unter Nachrichtentypen.
Nachrichten verarbeiten
Verwenden Sie einen Dienst, der
FirebaseMessagingService
erweitert, um Nachrichten zu empfangen.
Ihr Dienst sollte die Callbacks onMessageReceived
und onDeletedMessages
überschreiben.
Das Zeitfenster für die Verarbeitung einer Nachricht kann kürzer als 20 Sekunden sein, je nachdem, welche Verzögerungen vor dem Aufrufen von onMessageReceived
auftreten, z. B. Verzögerungen des Betriebssystems, App-Startzeit, Blockierung des Hauptthreads durch andere Vorgänge oder vorherige onMessageReceived
-Aufrufe, die zu lange dauern. Danach können verschiedene Betriebssystemfunktionen wie das Beenden von Prozessen in Android oder die
Einschränkungen für die Ausführung im Hintergrund in Android O Ihre Arbeit beeinträchtigen.
onMessageReceived
ist für die meisten Nachrichtentypen verfügbar, mit den folgenden Ausnahmen:
-
Benachrichtigungen, die zugestellt werden, wenn Ihre App im Hintergrund ausgeführt wird: In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt. Wenn ein Nutzer auf eine Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.
-
Nachrichten mit Benachrichtigungs- und Daten-Payload, wenn sie im Hintergrund empfangen werden: In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt und die Daten-Payload wird in den Extras des Intents Ihrer Launcher-Aktivität bereitgestellt.
Zusammenfassung:
App-Status | Benachrichtigung | Daten | Beides |
---|---|---|---|
Vordergrund | onMessageReceived |
onMessageReceived |
onMessageReceived |
Hintergrund | Taskleiste | onMessageReceived |
Benachrichtigung: Taskleiste Daten: in den Extras des Intents. |
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 das Erscheinungsbild 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 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" />
Unter Android wird das benutzerdefinierte Standardsymbol für
- Alle Benachrichtigungen, die über den Notifications Composer gesendet werden.
- Alle Benachrichtigungen, bei denen das Symbol nicht explizit in der Benachrichtigungs-Payload festgelegt ist.
Unter Android wird die benutzerdefinierte Standardfarbe für Folgendes verwendet:
- Alle Benachrichtigungen, die über den Notifications Composer gesendet werden.
- Alle Benachrichtigungen, bei denen die Farbe nicht explizit in der Benachrichtigungsnutzlast festgelegt ist.
Wenn kein benutzerdefiniertes Standardsymbol festgelegt ist und kein Symbol in der Benachrichtigungs-Payload festgelegt ist, zeigt Android das in Weiß gerenderte Anwendungssymbol an.
Überschreiben onMessageReceived
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. }
Überschreiben onDeletedMessages
In einigen Situationen wird mit FCM keine Nachricht gesendet. Das passiert, wenn auf einem bestimmten Gerät zum Zeitpunkt der Verbindung zu viele Nachrichten (> 100) für Ihre App ausstehen oder wenn das Gerät seit mehr als einem Monat nicht mit FCM verbunden war. In diesen Fällen erhalten Sie möglicherweise einen Callback an FirebaseMessagingService.onDeletedMessages()
. Wenn die App-Instanz diesen Callback empfängt, 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, ruft FCM onDeletedMessages()
nicht an.
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-Payload enthalten, sowie alle Nachrichten, die über die Notifications Console gesendet werden. In diesen Fällen wird die Benachrichtigung in der Taskleiste des Geräts angezeigt und die Daten-Payload wird in den Extras des Intents Ihrer Launcher-Aktivität bereitgestellt.
Informationen zur Zustellung von Nachrichten an Ihre App finden Sie im FCM-Berichts-Dashboard. Dort wird die Anzahl der auf Apple- und Android-Geräten gesendeten und geöffneten Nachrichten sowie die Anzahl der Impressionen (von Nutzern gesehene Benachrichtigungen) für Android-Apps erfasst.
FCM-Nachrichten im Direct Boot-Modus empfangen
Entwickler, die FCM-Nachrichten an Apps senden möchten, noch bevor das Gerät entsperrt wird, können eine Android-App so konfigurieren, dass sie Nachrichten empfängt, wenn sich das Gerät im Direct Boot-Modus befindet. Beispielsweise möchten Sie vielleicht, dass Nutzer Ihrer App auch auf einem gesperrten Gerät Benachrichtigungen für Alarme erhalten.
Beachten Sie beim Erstellen dieses Anwendungsfalls die allgemeinen Best Practices und Einschränkungen für den Direktbootmodus. Besonders wichtig ist die Sichtbarkeit von Nachrichten, die für den Direktstart aktiviert sind. Jeder Nutzer mit Zugriff auf das Gerät kann diese Nachrichten ansehen, ohne Anmeldedaten eingeben zu müssen.
Vorbereitung
- Das Gerät muss für den Direktboot-Modus eingerichtet sein.
- Auf dem Gerät muss eine aktuelle Version der Google Play-Dienste installiert sein (19.0.54 oder höher).
- Die App muss das FCM SDK (
com.google.firebase:firebase-messaging
) verwenden, um FCM-Nachrichten zu empfangen.
Nachrichtenverarbeitung im Direct Boot-Modus in Ihrer App aktivieren
Fügen Sie in der Gradle-Datei auf App-Ebene eine Abhängigkeit von der FCM-Bibliothek für den Direktboot-Support hinzu:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Machen Sie die
FirebaseMessagingService
-Komponente der App „Direct Boot“-fähig, indem Sie das Attributandroid:directBootAware="true"
im App-Manifest hinzufügen:<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 FirebaseMessagingService
im Direct-Boot-Modus ausgeführt werden kann. Prüfen Sie, ob die folgenden Anforderungen erfüllt sind:
- Der Dienst sollte während des direkten Bootvorgangs nicht auf durch Anmeldedaten geschützten Speicher zugreifen.
- Der Dienst darf nicht versuchen, Komponenten wie
Activities
,BroadcastReceivers
oder andereServices
zu verwenden, die nicht als „Direct Boot Aware“ gekennzeichnet sind, wenn er im Direct Boot-Modus ausgeführt wird. - Alle Bibliotheken, die der Dienst verwendet, dürfen auch nicht auf durch Anmeldedaten geschützten Speicher zugreifen oder nicht Direct Boot-kompatible Komponenten aufrufen, während sie im Direct Boot-Modus ausgeführt werden. Das bedeutet, dass alle Bibliotheken, die von der App verwendet und vom Dienst aufgerufen werden, entweder Direct Boot-kompatibel sein müssen oder die App prüfen muss, ob sie im Direct Boot-Modus ausgeführt wird, und sie in diesem Modus nicht aufrufen darf. Firebase SDKs funktionieren beispielsweise mit Direct Boot (sie können in eine App eingebunden werden, ohne dass diese im Direct Boot-Modus abstürzt), aber viele Firebase-APIs unterstützen keine Aufrufe im Direct Boot-Modus.
- Wenn die App ein benutzerdefiniertes
Application
verwendet, muss dieses auch Direct Boot-fähig sein (kein Zugriff auf durch Anmeldedaten geschützten Speicher im Direct Boot-Modus).Application
Weitere Informationen zum Senden von Nachrichten an Geräte im Direct Boot-Modus finden Sie unter Direct Boot-fähige Nachrichten senden.