Cette page a été traduite par l'API Cloud Translation.
Switch to English

Recevoir des messages dans une application Android

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

Traitement des messages

Pour recevoir des messages, utilisez un service qui étend FirebaseMessagingService . Votre service doit remplacer les onMessageReceived et onDeletedMessages . Il doit traiter tout message dans les 20 secondes suivant sa réception (10 secondes sur Android Marshmallow). La fenêtre de temps peut être plus courte en fonction des retards du système d'exploitation encourus avant l'appel à onMessageReceived . Après cette période, divers comportements du système d'exploitation tels que les limites d'exécution en arrière - plan d' Android O peuvent interférer avec votre capacité à terminer votre travail. Pour plus d'informations, consultez notre présentation de la priorité des messages .

onMessageReceived est fourni pour la plupart des types de messages, avec les exceptions suivantes:

  • Messages de notification envoyés lorsque votre application est en arrière-plan . Dans ce cas, la notification est envoyée dans la barre d'état système de l'appareil. Un utilisateur tapant sur une notification ouvre le lanceur d'application par défaut.

  • Messages contenant à 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 dans la barre d'état système de l'appareil et la charge de données est livrée dans les extras de l'intention de votre activité de lancement.

En résumé:

État de l'application Notification Les données Tous les deux
Premier plan onMessageReceived onMessageReceived onMessageReceived
Contexte Barre d'état système onMessageReceived Notification: barre d'état système
Données: en extras de l'intention.
Pour plus d'informations sur les types de messages, consultez Notifications et messages de données .

Modifier le manifeste de l'application

Pour utiliser FirebaseMessagingService , vous devez ajouter ce qui suit dans votre manifeste d'application:

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

De plus, il est recommandé 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 chaque fois que des valeurs équivalentes ne sont pas définies dans la charge utile de notification.

Ajoutez ces lignes à l'intérieur de la balise d' 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 l'icône par défaut personnalisée pour

  • Tous les messages de notification envoyés par l' éditeur de notifications .
  • Tout message de notification qui ne définit pas explicitement l'icône dans la charge utile de notification.

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

  • Tous les messages de notification envoyés par l' éditeur de notifications .
  • Tout message de notification qui ne définit pas explicitement la couleur dans la charge utile de 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 notification, Android affiche l'icône de l'application rendue 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:

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

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}")

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

Remplacer onDeletedMessages

Dans certaines situations, FCM peut ne pas remettre 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 ces cas, vous pouvez recevoir un rappel vers FirebaseMessagingService.onDeletedMessages() Lorsque l'instance d'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 cet appareil au cours des 4 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. Un utilisateur tapant sur la notification ouvre le lanceur d'applications par défaut.

Cela inclut les messages qui contiennent à la fois des notifications et des données utiles (et tous les messages envoyés depuis la console Notifications). Dans ces cas, la notification est envoyée dans la barre d'état système de l'appareil et la charge de données est livrée dans les extras de l'intention de votre activité de lancement.

Pour obtenir un aperçu de la livraison des messages à votre application, consultez le tableau de bord de création de rapports FCM , qui enregistre le nombre de messages envoyés et ouverts sur les appareils iOS et Android, ainsi que les données relatives aux "impressions" (notifications vues par les utilisateurs) pour les applications Android.

Applications restreintes en arrière-plan (Android P ou plus récent)

FCM ne peut pas envoyer de messages aux applications qui ont été mises en restriction en arrière-plan par l'utilisateur (par exemple via: Paramètres -> Applications et notification -> [nom de l'application] -> Batterie). Une fois que votre application est supprimée de la restriction en arrière-plan, les nouveaux messages envoyés à l'application seront envoyés comme auparavant. Afin d'éviter la perte de messages et d'autres impacts de restriction en arrière-plan, assurez-vous d'éviter les mauvais comportements répertoriés par l'effort Android Vitals . Ces comportements peuvent amener l'appareil Android à recommander à l'utilisateur que votre application soit limitée en arrière-plan. Votre application peut vérifier si elle est restreinte en arrière-plan à l'aide de: isBackgroundRestricted () .

Recevoir des messages FCM en mode de démarrage direct

Les développeurs qui souhaitent envoyer des messages FCM à des applications avant même que l'appareil ne soit déverrouillé peuvent activer une application Android pour recevoir des messages lorsque l'appareil est en mode de démarrage direct. Par exemple, vous pouvez souhaiter que les utilisateurs de votre application reçoivent des notifications d'alarme même sur un appareil verrouillé.

Lors de la création de ce cas d'utilisation, observez les meilleures pratiques générales et les restrictions pour le mode de démarrage direct . Il est particulièrement important de prendre en compte la visibilité des messages activés pour le démarrage direct; tout utilisateur ayant accès à l'appareil peut afficher ces messages sans entrer les informations d'identification de l'utilisateur.

Conditions préalables

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

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

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

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Faites en FirebaseMessagingService le démarrage direct FirebaseMessagingService l'application soit conscient en ajoutant l' android:directBootAware="true" dans le 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. Vérifiez les exigences suivantes:

  • Le service ne doit pas accéder au stockage protégé par des informations d'identification lors de l'exécution en mode de démarrage direct.
  • Le service ne doit pas tenter d'utiliser des composants, tels que des Activities , des BroadcastReceivers ou d'autres Services qui ne sont pas marqués comme prenant en charge 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 des informations d'identification ni appeler des composants non directBootAware lors de l'exécution en mode de démarrage direct. Cela signifie que toutes les bibliothèques utilisées par l'application qui sont appelées à partir du service devront être compatibles avec le démarrage direct, ou l'application devra vérifier si elle s'exécute en mode de démarrage direct et ne pas les appeler dans ce mode. Par exemple, les SDK Firebase fonctionnent avec un démarrage direct (ils peuvent être inclus dans une application sans la planter en mode de démarrage direct), mais de nombreuses API Firebase ne prennent pas en charge l'appel en mode de démarrage direct.
  • Si l'application utilise une Application personnalisée, l' Application devra également être compatible avec le démarrage direct (pas d'accès au stockage protégé par des informations d'identification en mode de démarrage direct).

Pour obtenir des conseils sur l'envoi de messages aux appareils en mode de démarrage direct, consultez Envoyer des messages activés pour le démarrage direct .