Recevoir des messages dans une application Android

Les notifications Firebase se comportent différemment selon l'état de premier plan/arrière-plan de l'application réceptrice. Si vous souhaitez que les applications de premier plan reçoivent des messages de notification ou des messages de données, vous devez écrire du code pour gérer le rappel onMessageReceived. Pour obtenir une explication de la différence entre les messages de notification et les messages de données, consultez la section Types de messages.

Traiter les messages

Pour recevoir des messages, utilisez un service qui étend FirebaseMessagingService. Votre service doit ignorer les paramètres onMessageReceived et onDeletedMessages .

La période de traitement d'un message peut être inférieure à 20 secondes en fonction des retards subis avant l'appel de onMessageReceived, y compris les retards de l'OS, le temps de démarrage de l'application, le thread principal bloqué par d'autres opérations ou les appels onMessageReceived précédents prenant trop de temps. Passé ce délai, divers comportements du système d'exploitation, tels que traitement tuer ou d'Android O. limites d'exécution en arrière-plan peuvent interférer avec votre capacité à terminer votre travail.

onMessageReceived est fourni pour la plupart des types de messages, avec les éléments suivants : exceptions:

  • Messages de notification envoyés lorsque votre application est exécutée en arrière-plan : Dans ce la notification est envoyée à la barre d'état système de l'appareil. Un utilisateur appuie sur une notification ouvre le lanceur d'applications par défaut.

  • Messages avec à la fois des notifications et des données utiles, lorsqu'ils sont reçus en arrière-plan : Dans ce cas, la notification est envoyée à la barre d’état système de l’appareil, et la charge utile des données est fournie dans les extras l'intent de votre activité du lanceur d'applications.

En résumé :

État de l'application Notification Données Les deux
Premier plan onMessageReceived onMessageReceived onMessageReceived
Contexte 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 Les notifications et messages de données.

Modifier le fichier manifeste de l'application

Pour utiliser FirebaseMessagingService, vous devez ajouter ce qui suit dans votre fichier manifeste de l'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 également de définir des valeurs par défaut pour personnaliser l'apparence des notifications. Toi vous pouvez spécifier une icône et une couleur par défaut personnalisées appliquées des valeurs équivalentes ne sont pas définies dans la charge utile de la notification.

Ajoutez ces lignes à l'intérieur des Balise application pour définir l'icône et la couleur personnalisées par défaut:

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

  • Tous les messages de notification envoyés depuis le Outil de création de notifications.
  • Tout message de notification qui ne définit pas explicitement l'icône dans la charge utile de la notification.

Android utilise la couleur personnalisée par défaut pour

  • Tous les messages de notification envoyés depuis le Outil de création de notifications.
  • Tout message de notification qui ne définit pas explicitement la couleur 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.

Ignorer onMessageReceived

En remplaçant la méthode FirebaseMessagingService.onMessageReceived, vous pouvez effectuer des actions en fonction des Message distant et récupérer les données du message:

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

Ignorer onDeletedMessages

Il peut arriver que FCM ne distribue pas de message. Cela se produit lorsqu'il y a trop de messages (> 100) en attente pendant votre application sur un appareil spécifique au moment où elle se connecte ou si l'appareil ne s'est pas connecté à FCM dans plus d'un mois. Dans ce cas, vous pouvez recevoir un rappel vers FirebaseMessagingService.onDeletedMessages(). Lorsque l'instance de l'application reçoit ce rappel, elle doit effectuer une synchronisation complète avec votre serveur d'application. Si vous n'avez pas envoyé de message à l'application sur cette 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. Lorsqu'un utilisateur appuie sur la notification, il ouvre le lanceur d'applications par défaut.

Cela inclut les messages contenant à la fois des notifications et des données (et tous les messages envoyés depuis la console Notifications). Dans ce cas, la notification est envoyée au barre d'état système, et la charge utile des données est fournie dans les extras de l'intent de l'activité du lanceur d'applications.

Pour en savoir plus sur la distribution de messages dans votre application, consultez le <ph type="x-smartling-placeholder"></ph> FCM, tableau de bord de reporting, qui enregistre le nombre de messages envoyés et ouverts sur des appareils Apple et Android, ainsi que de données sur les "impressions" (notifications visibles par les utilisateurs) pour les applications Android.

Recevoir des messages FCM en mode démarrage direct

Développeurs qui souhaitent envoyer des messages FCM aux applications avant même que le l'appareil est déverrouillé peut permettre à une application Android de recevoir des messages lorsque l'appareil est en mode démarrage direct. Par exemple, vous pouvez souhaiter que les utilisateurs de votre application recevoir des notifications d'alarme même sur un appareil verrouillé.

Lorsque vous créez ce cas d'utilisation, observez les Bonnes pratiques et restrictions concernant le mode Démarrage direct. Il est il est particulièrement important de tenir compte de la visibilité des fonctionnalités de démarrage direct messages tout utilisateur ayant accès à l'appareil peut consulter ces messages en saisissant les identifiants de l'utilisateur.

Prérequis

  • L'appareil doit être configuré pour le mode de démarrage direct.
  • Une version récente des services Google Play (version 19.0.54 ou ultérieure) doit être installée sur l'appareil.
  • L'application doit utiliser le SDK FCM (com.google.firebase:firebase-messaging) pour recevoir des messages FCM.

Activer la gestion des messages en mode Démarrage direct dans votre application

  1. Dans le fichier Gradle au niveau de l'application, ajoutez une dépendance à la bibliothèque Support de démarrage direct FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Activez le démarrage direct FirebaseMessagingService de l'application en ajoutant l'attribut android:directBootAware="true" dans le fichier manifeste de l'application:

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

Il est important de s'assurer que ce FirebaseMessagingService peut s'exécuter en mode de démarrage direct. Chèque pour les exigences suivantes:

  • Le service ne doit pas accéder au stockage protégé par identifiants lorsqu'il s'exécute en mode de démarrage direct.
  • Le service ne doit pas tenter d'utiliser des composants tels que Activities, BroadcastReceivers, ou d'autres éléments Services qui ne sont pas marqués comme compatibles avec le démarrage direct lors de l'exécution en mode de démarrage direct.
  • Les bibliothèques utilisées par le service ne doivent pas non plus accéder au stockage protégé par identifiants appeler des composants non directsBootAware lors de l'exécution en mode de démarrage direct. Cela signifie que toute bibliothèque utilisées par l'application et appelées à partir du service doivent être compatibles avec le démarrage direct, ou l'application doit vérifier si elle fonctionne en mode de démarrage direct et ne pas les appeler dans ce mode. Par exemple, les SDK Firebase fonctionnent avec le démarrage direct (ils peuvent être inclus dans une application sans la planter en mode démarrage direct), mais de nombreuses API Firebase ne peuvent pas être appelées en mode démarrage direct.
  • Si l'application utilise un Application personnalisé, celui-ci doit également être compatible avec le démarrage direct (aucun accès au stockage protégé par identifiants en mode Démarrage direct).

Pour obtenir des conseils sur l'envoi de messages à des appareils en mode de démarrage direct, consultez Envoyez des messages avec démarrage direct.