Les notifications Firebase se comportent différemment selon que l'application réceptrice est au premier plan ou en arrière-plan. Si vous souhaitez que les applications au 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 comprendre la différence entre les messages de notification et les messages de données, consultez Types de messages.
Gérer les messages
Pour recevoir des messages, utilisez un service qui étend
FirebaseMessagingService
.
Votre service doit remplacer les rappels onMessageReceived
et onDeletedMessages
.
Le délai pour traiter un message peut être inférieur à 20 secondes en fonction des retards encourus avant l'appel de onMessageReceived
, y compris les retards de l'OS, le temps de démarrage de l'application, le blocage du thread principal par d'autres opérations ou les appels onMessageReceived
précédents qui ont pris trop de temps. Après ce délai, divers comportements de l'OS, tels que l'arrêt des processus d'Android ou les
limites d'exécution en arrière-plan d'Android O, peuvent vous empêcher de terminer votre travail.
onMessageReceived
est fourni pour la plupart des types de messages, à l'exception des suivants :
-
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. Par défaut, lorsqu'un utilisateur appuie sur une notification, le lanceur d'applications s'ouvre.
-
Messages avec charge utile de notification et de données, 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 utile de données est envoyée dans les extras de l'intent de votre activité de lanceur.
En résumé :
État de l'application | 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. |
Modifier le fichier manifeste de l'application
Pour utiliser FirebaseMessagingService
, vous devez ajouter les éléments suivants dans le 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 également de définir des valeurs par défaut pour personnaliser l'apparence des notifications. Vous pouvez spécifier une icône et une couleur par défaut personnalisées qui sont appliquées chaque fois que des valeurs équivalentes ne sont pas définies dans la charge utile de notification.
Ajoutez les lignes suivantes dans la 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 compositeur 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 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 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 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 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. }
Ignorer onDeletedMessages
Dans certains cas, FCM ne peut pas envoyer de message. Cela se produit lorsqu'il y a trop de messages (> 100) en attente pour votre application sur un appareil spécifique 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 d'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 à la fois une charge utile de notification et de données (ainsi que tous les messages envoyés depuis la console Notifications). Dans ce cas, la notification est envoyée dans la barre d'état système de l'appareil, et la charge utile de données est envoyée dans les extras de l'intent de votre activité de lanceur.
Pour obtenir des informations sur la distribution des messages à votre application, consultez le tableau de bord de reporting FCM, 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.
Recevoir des messages FCM en mode Démarrage direct
Les développeurs qui souhaitent envoyer des messages FCM aux applications avant même que l'appareil ne soit déverrouillé peuvent activer une application Android pour qu'elle reçoive des messages lorsque l'appareil est en mode Direct Boot. Par exemple, vous pouvez souhaiter que les utilisateurs de votre application reçoivent des notifications d'alarme même lorsque l'appareil est verrouillé.
Lorsque vous développez ce cas d'utilisation, respectez les bonnes pratiques et les restrictions générales pour le mode Démarrage direct. Il est particulièrement important de tenir compte de la visibilité des messages pour le démarrage direct. Tout utilisateur ayant accès à l'appareil peut les consulter sans saisir d'identifiants.
Prérequis
- L'appareil doit être configuré pour le mode Démarrage direct.
- Une version récente des services Google Play (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 les messages FCM.
Activer la gestion des messages en mode démarrage direct dans votre application
Dans le fichier Gradle au niveau de l'application, ajoutez une dépendance à la bibliothèque de compatibilité avec le démarrage direct FCM :
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Rendez l'application compatible avec le démarrage direct en ajoutant l'attribut
android:directBootAware="true"
dans le fichier manifeste de l'application :FirebaseMessagingService
<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 Démarrage direct. Vérifiez que vous respectez les exigences suivantes :
- Le service ne doit pas accéder au stockage protégé par des identifiants lorsqu'il s'exécute en mode Démarrage direct.
- Le service ne doit pas essayer d'utiliser des composants, tels que
Activities
,BroadcastReceivers
ou d'autresServices
qui ne sont pas marqués comme compatibles avec le démarrage direct lorsqu'il s'exécute en mode Démarrage direct. - Toutes les bibliothèques utilisées par le service ne doivent pas non plus accéder au stockage protégé par identifiants ni appeler de composants non directBootAware lorsqu'elles s'exécutent en mode Démarrage direct. Cela signifie que toutes les bibliothèques utilisées par l'application et appelées depuis le service devront être compatibles avec le démarrage direct, ou que l'application devra vérifier si elle s'exécute en mode 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 sont pas compatibles avec l'appel en mode démarrage direct.
- Si l'application utilise un
Application
personnalisé, leApplication
devra également être compatible avec le démarrage direct (pas d'accès au stockage protégé par identifiants en mode Démarrage direct).
Pour savoir comment envoyer des messages aux appareils en mode démarrage direct, consultez Envoyer des messages compatibles avec le démarrage direct.