Erweitertes Android in Kotlin 0.2: Android Firebase Cloud Messaging

Dieses Codelab ist Teil des Kurses „Advanced Android in Kotlin“. Sie profitieren von diesem Kurs, wenn Sie die Codelabs nacheinander durcharbeiten. Das ist aber nicht zwingend erforderlich. Alle Kurs-Codelabs finden Sie auf der Landingpage für Codelabs auf Android-Geräten für Fortgeschrittene.

Einführung

Im vorherigen Codelab hast du deinem Ei-Timer eine Benachrichtigung hinzugefügt, die in deiner App erstellt und ausgelöst wird. Ein weiterer wichtiger Anwendungsfall besteht darin, Push-Benachrichtigungen per Remotezugriff zu senden, die auch dann empfangen werden können, wenn deine App gerade nicht ausgeführt wird.

Was ist eine Push-Benachrichtigung?

Push-Benachrichtigungen sind Benachrichtigungen, die der Server an Mobilgeräte sendet. Sie können an ein Gerät gesendet werden, unabhängig davon, ob Ihre App ausgeführt wird oder nicht.

Push-Benachrichtigungen sind eine hervorragende Möglichkeit, Nutzer über ein Update zu informieren oder sie an eine Aufgabe oder Funktion zu erinnern. Stellen Sie sich vor, dass ein Produkt noch einmal auf Lager ist. Mit einer Push-Benachrichtigung können Sie eine Shopping-App über Neuigkeiten zu Aktienkursen informieren, anstatt den Status der Aktien täglich überprüfen zu müssen.

Push-Benachrichtigungen nutzen das publish/subscribe-Muster, mit dem Back-End-Apps relevante Inhalte an interessierte Clients senden können. Ohne ein Veröffentlichungs-/Abomodell müssten Ihre Nutzer regelmäßig in Ihrer App nach Updates suchen. Das wäre für Nutzer mühsam und zuverlässig. Wenn die Anzahl der Clients zunimmt, bedeutet dies, dass diese regelmäßigen Prüfungen eine zu starke Belastung der Netzwerk- und Verarbeitungsressourcen verursachen, sowohl für den Server Ihrer App als auch für das Gerät eines Nutzers.

Du solltest deine Nutzer genau wie alle anderen Benachrichtigungen mit Push-Benachrichtigungen respektieren. Wenn der Benachrichtigungsinhalt für den Nutzer nicht interessant oder zeitnah ist, kann er die Benachrichtigungen in Ihrer App ganz einfach deaktivieren.

Was ist Firebase Cloud Messaging?

Firebase Cloud Messaging ist Teil der Firebase-Plattform für die Entwicklung von mobilen Apps. Normalerweise müssen Sie einen komplett neuen Server einrichten, der mit Mobilgeräten kommunizieren kann, um Benachrichtigungen auszulösen. Mit Firebase Cloud Messaging können Sie Benachrichtigungen an alle Ihre installierten Apps-Nutzer oder an eine bestimmte Gruppe von Nutzern senden, ohne einen Server einzurichten. Sie können beispielsweise Nutzer an Erinnerungen erinnern oder ihnen ein besonderes Angebot wie ein Geschenk schenken.Sie können eine Benachrichtigung per Remotezugriff an ein einzelnes Gerät oder an mehrere Geräte senden.

Außerdem können Sie mit Firebase Cloud Messages Daten aus Ihrer Back-End-App oder aus einem Firebase-Projekt an Ihre Nutzer übertragen.

In diesem Codelab erfahren Sie, wie Sie mit Firebase Cloud Messaging Push-Benachrichtigungen für Ihre Android-App und Daten senden.

Sollten während des Codelabs Probleme wie Codefehler, Grammatikfehler oder unklare Formulierungen auftreten, melden Sie es bitte über den Link Fehler melden links unten im Codelab.

Was Sie bereits wissen sollten

Sie sollten mit Folgendem vertraut sein:

  • Android-Apps in Kotlin erstellen Das ist insbesondere mit dem Android SDK möglich.
  • Entwerfen Sie Ihre Anwendung mit Architekturkomponenten und Datenbindung.
  • Grundlegendes Verständnis von Rundfunkempfängern
  • Grundlegendes Verständnis von AlarmManager
  • Benachrichtigungen mit dem Benachrichtigungsmanager erstellen und senden

Lerninhalte

  • Nachrichten per Firebase Cloud Messaging an den Nutzer senden
  • So senden Sie Daten aus einem Back-End mithilfe von Datennachrichten, die Teil von Firebase Cloud Messaging sind, an Ihre App.

Aufgaben

  • Push-Benachrichtigungen in der Starter-App hinzufügen.
  • Verarbeitung von Firebase Cloud Messaging während der Ausführung Ihrer App
  • Daten mit Firebase Cloud Messaging übertragen.

In diesem Codelab arbeiten Sie am Code der vorherigen Verwendung von Benachrichtigungen in Android-Apps-Codelab. Im vorherigen Codelab haben Sie eine Ei-Timer-App entwickelt, die Benachrichtigungen sendet, wenn der Koch-Timer abgelaufen ist. In diesem Codelab werden Sie Firebase Cloud Messaging hinzufügen, um Push-Benachrichtigungen an App-Nutzer zu senden, die sie daran erinnern, Eier zu essen.

Sie haben folgende Möglichkeiten, die Beispiel-App abzurufen:

Klonen Sie das Repository aus GitHub und wechseln Sie zum Zweig starter:

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications-fcm


Alternativ können Sie das Repository als ZIP-Datei herunterladen, entpacken und in Android Studio öffnen.

Zip herunterladen

Schritt 1: Firebase-Projekt erstellen

Bevor Sie Firebase zu Ihrer Android-App hinzufügen können, müssen Sie ein Firebase-Projekt erstellen, das mit Ihrer Android-App verbunden wird.

  1. Melden Sie sich in der Firebase Console an.
  2. Klicken Sie auf Projekt hinzufügen und wählen Sie einen Projektnamen aus oder geben Sie einen ein. Nennen Sie das Projekt fcm-codelab.
  3. Klicken Sie auf Weiter.
  4. Sie können die Einrichtung von Google Analytics überspringen, indem Sie die Schaltfläche Google Analytics für dieses Projekt aktivieren deaktivieren.
  5. Klicken Sie auf Projekt erstellen, um die Einrichtung des Firebase-Projekts abzuschließen.

Schritt 2: App bei Firebase registrieren

Nachdem Sie nun ein Firebase-Projekt haben, können Sie Ihre Android-App hinzufügen.

  1. Klicken Sie in der Mitte der Projektübersichtsseite von Firebase auf das Symbol Android, um den Einrichtungsworkflow zu starten.

  1. Geben Sie im Feld Android-Paketname den Wert com.example.android.eggtimernotifications ein.
  2. Klicken Sie auf App registrieren.

Wichtig: Geben Sie die korrekte ID für Ihre App ein, weil Sie den Wert nach der Registrierung Ihrer App für das Firebase-Projekt nicht mehr hinzufügen oder ändern können.

Schritt 3: Firebase-Konfigurationsdatei zu einem Projekt hinzufügen

Fügen Sie der App die Firebase-Android-Konfigurationsdatei hinzu.

  1. Klicken Sie auf google-services.json herunterladen, um Ihre Firebase-Android-Konfigurationsdatei (google-services.json) abzurufen. Achten Sie darauf, dass die Konfigurationsdatei keine zusätzlichen Zeichen enthält und den Namen google-services.json enthält.
  2. Verschieben Sie Ihre Konfigurationsdatei in das Modulverzeichnis Ihrer App.

Schritt 4: Android-Projekt konfigurieren, um Firebase-Produkte zu aktivieren

Um Firebase-Produkte in Ihrer App zu aktivieren, müssen Sie Ihren Gradle-Dateien das Google-Dienste-Plug-in hinzufügen.

  1. Prüfen Sie in Ihrer Gradle-Datei (build.gradle) auf Stammverzeichnis-Ebene (Projektebene), ob Sie das Maven-Repository von Google haben.
  2. Fügen Sie dann Regeln hinzu, um das Plug-in für Google-Dienste einzuschließen.

build.gradle

buildscript {

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }

  dependencies {
    // ...

    // Add the following line:
    classpath 'com.google.gms:google-services:4.3.2'  // Google Services plugin
  }
}

allprojects {
  // ...

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    // ...
  }
}
  1. Fügen Sie in Ihrer Gradle-Datei (in der Regel app/build.gradle) in Ihrer Moduldatei (auf App-Ebene) eine Zeile hinzu, in der das Plug-in am Ende der Datei angewendet wird.

app/build.gradle

apply plugin: 'com.android.application'

android {
  // ...
}

// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

In dieser Aufgabe fügen Sie Ihrem Projekt Firebase Cloud Messaging (FCM) hinzu, damit Sie Push-Benachrichtigungen verwenden können.

Der Android-Dienstcode für die FCM dieses Codelabs ist in MyFirebaseMessagingService.kt angegeben. In den folgenden Schritten wird der Code in Ihrer Android-App eingefügt.

Ihre Implementierung wird mit dem Ersteller von Benachrichtigungen getestet. Composer ist ein Tool, mit dem Sie Nachrichten auf der Firebase Console-Website schreiben und senden können.

  1. MyFirebaseMessagingService.kt öffnen
  2. Prüfen Sie die Datei und insbesondere die folgenden Funktionen:
  • onNewToken(): Wird automatisch aufgerufen, wenn Ihr Dienst im Android-Manifest registriert ist. Diese Funktion wird aufgerufen, wenn Ihre App das erste Mal ausgeführt wird und jedes Mal, wenn Firebase ein neues Token für Ihre App ausgibt. Ein Token ist ein Zugangscode für Ihr Firebase-Back-End-Projekt. Es wird für Ihr Clientgerät generiert. Mit diesem Token weiß Firebase, an welchen Client das Back-End Nachrichten senden soll. Außerdem wird in Firebase angegeben, ob dieser Client gültig ist und Zugriff auf dieses Firebase-Projekt hat.
  • onMessageReceived: Wird aufgerufen, wenn Ihre App ausgeführt wird, und Firebase sendet eine Nachricht an die App. Diese Funktion empfängt ein RemoteMessage-Objekt, das eine Benachrichtigung oder eine Datennutzlast tragen kann. Mehr zu den Unterschieden zwischen Benachrichtigungen und Nutzlasten von Datennachrichten erfahren Sie weiter unten in diesem Codelab.

Schritt 1: FCM-Benachrichtigungen an ein einzelnes Gerät senden

In der Benachrichtigungskonsole können Sie das Senden einer Benachrichtigung testen. Wenn Sie eine Nachricht an ein bestimmtes Gerät über die Konsole senden möchten, müssen Sie das Registrierungstoken des Geräts kennen.

Wenn das Firebase-Back-End ein neues oder aktualisiertes Token generiert, wird die Funktion onNewToken() aufgerufen, wobei das neue Token als Argument weitergegeben wird. Wenn Sie eine Ausrichtung auf ein einzelnes Gerät oder eine Gruppe von Geräten erstellen möchten, auf die Sie eine Nachricht senden möchten, erweitern Sie FirebaseMessagingService und überschreiben Sie onNewToken(), um auf das Token zuzugreifen.

  1. Öffnen Sie AndroidManifest.xml und deaktivieren Sie den folgenden Code, um MyFirebaseMessagingService für die Ei-Timer-App zu aktivieren. Die Dienst-Metadaten im Android-Manifest registrieren MyFirebaseMessagingService als Dienst und fügen einen Intent-Filter hinzu, damit dieser Dienst Nachrichten von FCM erhält. Im letzten Teil der Metadaten wird breakfast_notification_channel_id für Firebase als default_notification_channel_id deklariert. Sie benötigen diese ID im nächsten Schritt.
<!-- AndroidManifest.xml -->
<!-- TODO: Step 3.0 uncomment to start the service  -->

        <service
                android:name=".MyFirebaseMessagingService"
                android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <!-- [START fcm_default_icon] -->
        <!--
 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/common_google_signin_btn_icon_dark"/>
        <!--
 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"/> <!-- [END fcm_default_icon] -->
        <!-- [START fcm_default_channel] -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/breakfast_notification_channel_id" />
        <!-- [END fcm_default_channel] -->

Sie sollten einen neuen Benachrichtigungskanal für die FCM erstellen, da Ihre Nutzer die Ei-Timer oder FCM-Push-Benachrichtigungen möglicherweise separat aktivieren/deaktivieren.

  1. Öffnen Sie ui/EggTimerFragment.kt. Füge in onCreateView() den folgenden Code zur Kanalerstellung hinzu.
// EggTimerFragment.kt

   // TODO: Step 3.1 create a new channel for FCM
    createChannel(
        getString(R.string.breakfast_notification_channel_id),
        getString(R.string.breakfast_notification_channel_name)
    )
  1. Öffnen Sie MyFirebaseMessagingService.kt und entfernen Sie die Kommentarfunktion in der onNewToken()-Funktion. Diese Funktion wird aufgerufen, wenn ein neues Token generiert wird.
// MyFirebaseMessagingService.kt

   // TODO: Step 3.2 log registration token
    // [START on_new_token]
    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the     
     * InstanceID token is initially generated so this is where you would retrieve     
     * the token.
     */
    override fun onNewToken(token: String?) {
        Log.d(TAG, "Refreshed token: $token")

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(token)
    }
    // [END on_new_token]
  1. Führen Sie die Timer-App für Ei aus.
  2. Beobachten Sie die Logcat (Ansicht > Tool Windows > Logcat). Sie sollten eine Protokollzeile sehen, die Ihr Token ähnlich wie das unten stehende Token zeigt. Das ist das Token, das Sie benötigen, um eine Nachricht an dieses Gerät zu senden. Diese Funktion wird nur aufgerufen, wenn ein neues Token erstellt wird.
2019-07-23 13:09:15.243 2312-2459/com.example.android.eggtimernotifications D/MyFirebaseMsgService: Refreshed token: f2esflBoQbI:APA91bFMzNNFaIskjr6KIV4zKjnPA4hxekmrtbrtba2aDbh593WQnm11ed54Mv6MZ9Yeerver7pzgwfKx7R9BHFffLBItLEgPvrtF0TtX9ToCrXZ5y7Hd-m

Hinweis: Wenn Sie das Token nicht in den Logcat-Nachrichten sehen, hat Ihre App das Token möglicherweise bereits zuvor erhalten. In diesem Fall können Sie mit der Deinstallation der App ein neues Token erhalten.

Sie können dies jetzt testen, indem Sie eine Benachrichtigung senden. Verwenden Sie zum Erstellen einer Benachrichtigung das Ersteller von Benachrichtigungen.

  1. Öffnen Sie die Firebase Console und wählen Sie Ihr Projekt aus.
  2. Wählen Sie dann in der Navigationsleiste links Cloud Messaging aus.
  3. Klicken Sie auf Erste Nachricht senden.

  1. Geben Sie Time for Breakfast! als Titel der Benachrichtigung und Don't forget to eat eggs! als Benachrichtigungstext ein. Wählen Sie dann Testnachricht senden aus. Das Pop-up-Dialogfeld Auf Gerät testen wird geöffnet und Sie werden aufgefordert, ein FCM-Registrierungstoken anzugeben.

  1. Kopieren Sie Ihr App-Token aus logcat.

  1. Fügen Sie das Token im Pop-up-Fenster in das Feld FCM-Registrierungstoken hinzufügen ein und klicken Sie neben dem Token auf Hinzufügen.
  2. Wählen Sie das Token aus der angezeigten Kästchenliste aus. Die Schaltfläche Testen wird aktiviert.

  1. Setzen Sie die Egg Timer-App auf Ihrem Gerät auf den Hintergrund.
  2. Klicken Sie im Pop-up auf Testen.
  1. Nachdem Sie auf Testen geklickt haben, sollte das Clientgerät, auf dem Ihre App im Hintergrund ausgeführt wird, die Benachrichtigung in der Taskleiste anzeigen. (Weitere Informationen zum Umgang mit den FCM-Mitteilungen, wenn deine App im Vordergrund ausgeführt wird, findest du unten.)

Aufgabe: FCM-Benachrichtigungen an ein Thema senden

Die FCM-Themenbotschaft basiert auf dem Veröffentlichungs-/Abomodell.

Eine Messaging-App kann ein gutes Beispiel für das Modell Veröffentlichen/Abonnieren sein. Angenommen, eine App sucht alle 10 Sekunden nach neuen Nachrichten. Dadurch wird nicht nur der Akku des Smartphones belastet, sondern es werden auch unnötige Netzwerkressourcen genutzt. Außerdem wird so der Server deiner App unnötig belastet. Stattdessen kann ein Clientgerät ein Abo abschließen und sich benachrichtigen lassen, wenn neue Nachrichten von Ihrer App eingehen.

Über Themen können Sie eine Nachricht an mehrere Geräte senden, auf denen das jeweilige Thema aktiviert wurde. Für Kunden sind Themen bestimmte Datenquellen, für die der Kunde sich interessiert. Für den Server sind Themen Gruppen von Geräten, die den Empfang von Updates für eine bestimmte Datenquelle aktiviert haben. Sie können Kategorien für Benachrichtigungskategorien verwenden, etwa Nachrichten, Wettervorhersagen oder Sportergebnisse. Für diesen Teil des Codelabs erstellst du ein „Frühstücksthema“, das die interessierten App-Nutzer daran erinnert, beim Frühstück Eier zu essen.

Um ein Thema zu abonnieren, ruft die Client-App die Firebase Cloud Messaging-Funktion subscribeToTopic() mit dem Themennamen breakfast auf. Dieser Aufruf kann zwei Folgen haben. Wenn der Aufrufer erfolgreich ist, wird der OnCompleteListener-Callback mit der abonnierten Nachricht aufgerufen. Wenn der Client kein Abo abschließt, erhält der Callback stattdessen eine Fehlermeldung.

In Ihrer App abonnieren Sie Ihre Nutzer automatisch zum Thema „Frühstück“. In den meisten Produktions-Apps ist es jedoch besser, Nutzern die Kontrolle darüber zu geben, welche Themen sie abonnieren möchten.

  1. Öffnen Sie EggTimerFragment.kt und suchen Sie die leere subscribeTopic()-Funktion.
  2. Rufen Sie eine Instanz von FirebaseMessaging ab und rufen Sie die Funktion subscibeToTopic() mit dem Themennamen auf.
  3. Fügen Sie einen addOnCompleteListener hinzu, um von FCM wieder benachrichtigt zu werden, ob Ihr Abo erfolgreich abgeschlossen wurde.
// EggTimerFragment.kt

   // TODO: Step 3.3 subscribe to breakfast topic
    private fun subscribeTopic() {
        // [START subscribe_topics]
        FirebaseMessaging.getInstance().subscribeToTopic(TOPIC)
            .addOnCompleteListener { task ->
                var msg = getString(R.string.message_subscribed)
                if (!task.isSuccessful) {
                    msg = getString(R.string.message_subscribe_failed)
                }
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
            }
        // [END subscribe_topics]
    }
  1. Rufen Sie die Funktion subscribeTopic() auf, um beim Start der App ein Thema zu abonnieren. Scrollen Sie nach oben zu onCreateView() und fügen Sie subscribeTopic() hinzu.
// EggTimerFragment.kt

   // TODO: Step 3.4 call subscribe topics on start
    subscribeTopic()

    return binding.root
  1. Wenn du das Frühstücksthema abonnieren möchtest, führe die App noch einmal aus. Sie sollten eine Toast-Meldung mit dem Hinweis „Thema“ abonniert haben.

Jetzt können Sie Nachrichten an ein Thema senden:

  1. Öffnen Sie die Anwendung Ersteller von Benachrichtigungen und wählen Sie Benachrichtigung schreiben aus.
  2. Legen Sie wie bisher den Benachrichtigungstitel und den Benachrichtigungstext fest.
  3. Statt die Nachricht an ein einzelnes Gerät zu senden, klicken Sie stattdessen unter Ziel auf Thema und geben Sie breakfast als Thema ein.

  1. Wählen Sie Jetzt für die Planung aus.

  1. Prüfen Sie, ob Ihre App auf Ihrem Testgerät im Hintergrund ausgeführt wird.
  1. Klicken Sie auf Überprüfen und dann auf Veröffentlichen. Wenn Sie die App auf mehreren Geräten ausführen können, können Sie testen und beobachten, dass die Benachrichtigung auf allen Geräten empfangen wird, die dieses Thema abonniert haben.

Die App hat jetzt die folgenden Kanäle für Benachrichtigungen: Ei und Frühstück. Klicken Sie auf einem Clientgerät lange auf das App-Symbol, wählen Sie Info aus und klicken Sie auf Benachrichtigungen. Die Benachrichtigungskanäle Egg und Frühstück sollten wie auf dem folgenden Screenshot dargestellt werden. Wenn du die Auswahl des Kanals Frühstück aufhebst, erhält deine App keine Benachrichtigungen, die über diesen Kanal gesendet werden.

Denken Sie bei der Verwendung von Benachrichtigungen daran, dass Nutzer Benachrichtigungskanäle jederzeit deaktivieren können.

Schritt 1: Datennachrichten

FCM-Nachrichten können ebenfalls eine Datennutzlast enthalten, die die Nachrichten in der Client-App verarbeitet. Verwenden Sie diese anstelle von Benachrichtigungen.

Für die Verarbeitung von Datennachrichten muss die Datennutzlast in der onMessageReceived()-Funktion von MyFirebaseMessagingService verarbeitet werden. Die Nutzlast wird in der Property data des remoteMessage-Objekts gespeichert. Sowohl das remoteMessage-Objekt als auch die data-Property können null sein.

  1. MyFirebaseMessagingService. öffnen
  2. Prüfe, ob die data-Property des remoteMessage-Objekts einen bestimmten Wert hat, und drucke die Daten im Protokoll aus.
// MyFirebaseMessagingService.kt

    // [START receive_message]
    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
        Log.d(TAG, "From: ${remoteMessage?.from}")
        
       // TODO: Step 3.5 check messages for data
        // Check if the message contains a data payload.
        remoteMessage?.data?.let {
            Log.d(TAG, "Message data payload: " + remoteMessage.data)
        }

    }
    // [END receive_message]

Zum Testen des Codes können Sie den Benachrichtigungsersteller noch einmal verwenden.

  1. Öffnen Sie den Ersteller der Benachrichtigung und erstellen Sie eine neue Nachricht. Wählen Sie dazu als Ziel das Thema „Frühstück“.
  2. Wenn Sie das nächste Mal unter Zusätzliche Optionen mit Schritt 4 fortfahren, legen Sie die Schlüssel- und Werteigenschaften für Benutzerdefinierte Daten so fest:
  1. Schlüssel: eggs
  2. Wert: 3

  1. Prüfen Sie, ob Ihre App im Vordergrund ausgeführt wird. Wenn sich deine App im Hintergrund befindet, löst die FCM-Nachricht eine automatische Benachrichtigung aus und die onMessageReceived()-Funktion erhält nur das remoteMessage-Objekt, wenn der Nutzer auf die Benachrichtigung klickt.
  2. Senden Sie die Nachricht vom Composer-Ereignis und beobachten Sie das Datennachrichtenprotokoll, das in logcat angezeigt wird.

Schritt 2: Nachrichten im Vordergrund und im Hintergrund verarbeiten

Wenn ein Clientgerät, auf dem Ihre App ausgeführt wird, sowohl Benachrichtigungen als auch Datennutzlasten erhält, hängt das Verhalten der App davon ab, ob Ihre App auf diesem Gerät im Hintergrund oder im Vordergrund ausgeführt wird:

  • Wenn die App im Hintergrund ausgeführt wird und die Nachricht eine Benachrichtigungsnutzlast hat, wird die Benachrichtigung automatisch in der Benachrichtigungsleiste angezeigt. Wenn die Nachricht auch eine Datennutzlast enthält, wird sie von der App verarbeitet, wenn der Nutzer auf die Benachrichtigung tippt.
  • Wenn die App im Vordergrund ausgeführt wird und die Benachrichtigungsnutzlast für die Nachricht aktiviert ist, wird sie nicht automatisch angezeigt. Die App muss entscheiden, wie mit der Benachrichtigung in der Funktion onMessageReceived() verfahren werden soll. Wenn die Nachricht auch eine Nutzlast hat, werden beide Nutzlasten von der App verarbeitet.

Für dieses Codelab sollen Sie den App-Nutzer daran erinnern, Frühstückseier zu kaufen. Sie möchten keine Daten senden, möchten aber trotzdem sicherstellen, dass die Erinnerung immer angezeigt wird, unabhängig davon, ob die App im Vordergrund oder im Hintergrund ausgeführt wurde.

Wenn Sie eine FCM-Nachricht an Geräte senden, auf denen die Ei-Timer-App installiert ist, wird die Meldung automatisch angezeigt, wenn die App nicht ausgeführt oder im Hintergrund ausgeführt wird. Wird die App jedoch im Vordergrund ausgeführt, wird die Benachrichtigung nicht automatisch angezeigt. Stattdessen entscheidet der Code der App, was mit der Nachricht passieren soll. Wenn sich die App im Vordergrund befindet, wenn sie eine FCM-Nachricht erhält, wird die Funktion onMessageReceived() automatisch mit der FCM-Nachricht ausgelöst. Hier kann deine App automatisch Benachrichtigungen und Datennutzlasten verarbeiten oder eine Benachrichtigung auslösen.

Für Ihre App soll sichergestellt werden, dass der Nutzer eine Erinnerung erhält, wenn die App im Vordergrund ausgeführt wird. Fügen Sie daher Code ein, um eine Benachrichtigung auszulösen:

  1. Öffnen Sie die Funktion onMessageReceived() noch einmal in MyFirebaseMessagingService.
  2. Fügen Sie unmittelbar nach dem kürzlich hinzugefügten Code zum Prüfen der Datennachricht den folgenden Code hinzu. Dadurch wird eine Benachrichtigung über das Benachrichtigungs-Framework gesendet.
// MyFirebaseMessagingService.kt

    // TODO: Step 3.6 check messages for notification and call sendNotification
    // Check if the message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
        sendNotification(it.body as String)
    }
  1. Wenn Sie die App noch einmal ausführen und mit dem Composer eine Benachrichtigung senden, sollten Sie eine Benachrichtigung wie im ersten Teil des Codelabs sehen, unabhängig davon, ob die App im Vordergrund oder im Hintergrund ausgeführt wird.

Der Lösungscode befindet sich im Master-Branch des heruntergeladenen Codes.

Udacity-Kurs:

Firebase-Dokumentation:

Links zu weiteren Codelabs in diesem Kurs finden Sie auf der Landingpage für Codelabs auf Android-Geräten für Fortgeschrittene.