Firebase-Benachrichtigungen verhalten sich je nach dem Status „Im Vordergrund“ oder „Im Hintergrund“ der empfangenden App unterschiedlich. Wenn Sie möchten, dass Apps im Vordergrund Benachrichtigungs- oder Datennachrichten erhalten, müssen Sie Code schreiben, um den onMessageReceived
-Callback zu verarbeiten.
Eine Erklärung zum Unterschied zwischen Benachrichtigungs- und Datennachrichten finden Sie unter Nachrichtentypen.
Nachrichten verarbeiten
Verwenden Sie zum Empfangen von Nachrichten einen Dienst, der
FirebaseMessagingService
erweitert.
Dein Dienst sollte die onMessageReceived
- und onDeletedMessages
-Callbacks überschreiben.
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 Verzögerungen des Betriebssystems, 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 gesendet 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 Datennutzlast, die im Hintergrund empfangen werden In diesem Fall wird die Benachrichtigung an das Info-Symbol des Geräts gesendet und die Datennutzlast wird in den Extras der Intent-Aktivität Ihrer Launcher-Aktivität gesendet.
Zusammenfassung:
App-Status | Benachrichtigung | Daten | Beides |
---|---|---|---|
Vordergrund | onMessageReceived |
onMessageReceived |
onMessageReceived |
Hintergrund | Infobereich | onMessageReceived |
Benachrichtigung: Infobereich Daten: in den Extras der Intent. |
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 keine äquivalenten Werte in der Benachrichtigungsnutzlast 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
- Alle Benachrichtigungsnachrichten, die über den Benachrichtigungs-Editor gesendet wurden.
- Alle Benachrichtigungsnachrichten, in denen das Symbol nicht explizit in der Benachrichtigungsnutzlast festgelegt ist.
Unter Android wird die benutzerdefinierte Standardfarbe für Folgendes verwendet:
- Alle Benachrichtigungsnachrichten, die über den Benachrichtigungs-Editor gesendet wurden.
- Jede Benachrichtigungsnachricht, die die Farbe in der Benachrichtigungsnutzlast nicht explizit festlegt.
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 du die Methode FirebaseMessagingService.onMessageReceived
überschreibst, kannst du Aktionen basierend auf dem empfangenen RemoteMessage-Objekt ausführen und die Nachrichtendaten abrufen:
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 Fällen wird eine Nachricht von FCM möglicherweise nicht zugestellt. Das passiert, wenn zum Zeitpunkt der Verbindung zu viele Nachrichten (mehr als 100) für Ihre App auf einem bestimmten Gerät ausstehen oder wenn sich das Gerät seit mehr als einem Monat nicht mit FCM verbunden hat. In diesen Fällen erhalten Sie möglicherweise einen Callback an FirebaseMessagingService.onDeletedMessages()
. Wenn die App-Instanz diesen Callback erhält, sollte eine vollständige Synchronisierung mit Ihrem App-Server erfolgen. Wenn Sie in den letzten vier Wochen keine Nachricht an die App auf diesem Gerät gesendet haben, ruft FCM onDeletedMessages()
nicht an.
Benachrichtigungsnachrichten in einer App im Hintergrund verarbeiten
Wenn sich Ihre App im Hintergrund befindet, leitet Android Benachrichtigungsnachrichten 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 Benachrichtigungs- als auch Datennutzlast enthalten, sowie alle Nachrichten, die über die Benachrichtigungskonsole gesendet wurden. In diesen Fällen wird die Benachrichtigung an das Info-Center des Geräts gesendet und die Datennutzlast wird in den Extras der Intent-Aktivität Ihres Launchers gesendet.
Informationen zur Zustellung von Nachrichten an Ihre App finden Sie im FCMBerichtsdashboard. 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 vielleicht, dass Nutzer Ihrer App auch auf gesperrten Geräten Alarmbenachrichtigungen erhalten.
Beachten Sie beim Erstellen dieses Anwendungsfalls die allgemeinen Best Practices und Einschränkungen für den direkten Bootmodus. Achten Sie besonders auf die Sichtbarkeit von Nachrichten, die für den direkten Start aktiviert sind. Jeder Nutzer mit Zugriff auf das Gerät kann diese Nachrichten aufrufen, ohne Anmeldedaten eingeben zu müssen.
Vorbereitung
- Das Gerät muss für den direkten Bootmodus 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 direkten Bootmodus in Ihrer App aktivieren
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'
Machen Sie die App für den direkten Start über
FirebaseMessagingService
bereit, indem Sie das Attributandroid:directBootAware="true"
in das App-Manifest einfü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 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 sollte nicht versuchen, Komponenten wie
Activities
,BroadcastReceivers
oder andereServices
zu verwenden, die nicht als Direct Boot-Aware gekennzeichnet sind, wenn der Dienst im direkten Bootmodus 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 funktionieren beispielsweise mit Direct Boot (sie können in einer App enthalten sein, ohne dass sie im Direct Boot-Modus abstürzt). Viele Firebase APIs werden jedoch nicht unterstützt, wenn sie im Direct Boot-Modus aufgerufen werden.
- Wenn die Anwendung ein benutzerdefiniertes
Application
verwendet, mussApplication
auch direkt bootfähig sein (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.