Recevoir des messages dans les applications Android

Sélectionnez une plate-forme : iOS+ Android Web Flutter Unity C++


Pour recevoir des messages, vous pouvez utiliser un service qui étend FirebaseMessagingService. Votre service doit remplacer les rappels onMessageReceived et onDeletedMessages. Pour obtenir un exemple complet, consultez l'exemple de démarrage rapide de Firebase Cloud Messaging sample.

onMessageReceived est fourni pour la plupart des types de messages, à l'exception des suivants :

  • Messages de notification distribués lorsque votre application est en arrière-plan. Dans ce cas, la notification est distribuée dans la barre d'état système de l'appareil. Par défaut, lorsqu'un utilisateur appuie sur une notification, le lanceur d'applications s'ouvre.

  • Messages contenant une charge utile de notification et de données, lorsqu'ils sont reçus en arrière-plan. Dans ce cas, la notification est distribuée dans la barre d'état système de l'appareil, et la charge utile de données est distribuée dans les extras de l'intent de votre activité de lancement.

En résumé :

État app Notification Données Les deux
Premier plan onMessageReceived onMessageReceived onMessageReceived
Arrière-plan Barre d'état système onMessageReceived Notification : barre d'état système Données : dans les extras de l'intent.

Pour en savoir plus sur les types de messages, consultez la section Messages de notification et de données.

Le rappel onMessageReceived dispose d'une courte fenêtre d'exécution. De nombreux facteurs peuvent affecter la durée de cette fenêtre, y compris les retards du système d'exploitation, le temps de démarrage de l'application, le blocage du thread principal par d'autres opérations ou la durée excessive des appels onMessageReceived précédents.

Pour cette raison, évitez les tâches de longue durée (comme la récupération d'images à partir d'un serveur pour les afficher dans une notification) dans onMessageReceived. Planifiez plutôt une tâche à l'aide de WorkManager pour gérer toutes les tâches qui peuvent prendre plus de quelques secondes. Pour en savoir plus sur la priorité des messages et son impact sur le traitement, consultez la section Traitement des messages à priorité élevée et normale.

Modifier le fichier manifeste de l'application

Pour utiliser FirebaseMessagingService, vous devez ajouter le code suivant au fichier manifeste de votre application :

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

Nous vous recommandons de définir des valeurs par défaut pour personnaliser l'apparence des notifications. Vous pouvez spécifier une icône par défaut personnalisée et une couleur par défaut personnalisée qui sont appliquées lorsque des valeurs équivalentes ne sont pas définies dans la charge utile de la notification.

Ajoutez les lignes suivantes dans la balise application pour définir l'icône par défaut personnalisée et la couleur personnalisée :

<!-- 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 affiche et utilise l'icône par défaut personnalisée pour

  • tous les messages de notification envoyés depuis le compositeur de notifications.
  • tout message de notification qui ne définit pas explicitement l'icône dans la charge utile de la notification.

Si aucune icône par défaut personnalisée n'est définie et qu'aucune icône n'est définie dans la charge utile de la notification, Android affiche l'icône de l'application en blanc.

Remplacer onMessageReceived

En remplaçant la méthode FirebaseMessagingService.onMessageReceived, vous pouvez effectuer des actions en fonction de l'objet RemoteMessage reçu et obtenir les données du message :

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

Remplacer onDeletedMessages

Dans certains cas, FCM peut ne pas distribuer un message. Cela se produit lorsqu'il y a trop de messages (> 100) en attente pour votre application sur un appareil particulier au moment où il se connecte ou si l'appareil ne s'est pas connecté à FCM depuis plus d'un mois. Dans ce cas, vous pouvez recevoir un rappel à FirebaseMessagingService.onDeletedMessages(). Lorsque l'instance de l'application reçoit ce rappel, elle doit effectuer une synchronisation complète avec le serveur de votre application. Si vous n'avez pas envoyé de message à l'application sur cet appareil au cours des quatre dernières semaines, FCM n'appellera pas onDeletedMessages().

Gérer les messages de notification dans une application en arrière-plan

Lorsque votre application est en arrière-plan, Android dirige les messages de notification vers la barre d'état système. Par défaut, lorsqu'un utilisateur appuie sur la notification, le lanceur d'applications s'ouvre.

Cela inclut les messages contenant une charge utile de notification et de données (et tous les messages envoyés depuis la console Notifications). Dans ce cas, la notification est distribuée dans la barre d'état système de l'appareil, et la charge utile de données est distribuée dans les extras de l'intent de votre activité de lancement.

Pour en savoir plus sur la distribution des messages à votre application, consultez le FCM tableau de bord de rapports, qui enregistre le nombre de messages envoyés et ouverts sur les appareils Apple et Android, ainsi que les données sur les "impressions" (notifications vues par les utilisateurs) pour les applications Android.