77 votes

Une application Android ne reçoit pas de notification Firebase lorsque l'application est arrêtée à partir de la barre d'état multi-tâches.

J'ai lu un question similaire sur SO, mais je n'ai pas réussi à en tirer la bonne réponse.

J'ai un système dans lequel nous envoyons des notifications à environ 500 appareils.

Malheureusement, beaucoup de ces appareils ne reçoivent pas la notification. J'ai constaté que les téléphones de la série OPPO F1 ne reçoivent pas la notification en particulier.

J'ai observé que cela se produit si l'application est arrêtée à partir de la barre multi-tâches. Comment puis-je résoudre ce problème ?

Mise à jour : J'ai observé que lorsque je ferme l'application à partir du tableau des tâches, mon application est forcée de s'arrêter dans le gestionnaire d'applications. Mais lorsque je ferme Whatsapp depuis la barre des tâches, elle n'est toujours pas forcée de s'arrêter. Comment cela est-il géré par Whatsapp ?

1 votes

Le même problème résolu peut être résolu stackoverflow.com/a/45810771/1993001

0 votes

0 votes

Ici Voici quelques mesures qui pourraient vous aider.

56voto

AL. Points 21726

Mise à jour 03/2017 - Incluant une partie de ma réponse. ici .

Pour le sujet concernant swipe fermé/tué/force arrêtée Ce sujet a été discuté pendant un certain temps et il ne semble pas y avoir de réponse définitive. Lors d'un de mes tests, je suis capable de recevoir encore un message (testé avec un data - uniquement charge utile du message) si I Fermeture par glissement mon application. Mais lorsque je force fermée à partir du menu Paramètres, je n'a pas pu recevoir de messages . Notez que c'est pas toujours le comportement.

Il y a des appareils qui ont été conçus pour que lorsque vous fermeture par glissement l'application, ce sera la même chose que arrêt de force (voir ma réponse ici ).

Il y a aussi des appareils où, même si l'application est encore tout simplement emporté par le vent même si ce n'est pas le cas force fermée l'appareil lui-même l'empêche de recevoir des messages. D'autres disent que cela ne peut pas être le cas parce que des applications comme WhatsApp ont pu le faire. La raison que j'ai apprise jusqu'à présent pour cela est que les fabricants d'appareils ont Liste blanche la plupart des applications connues pour que cela soit possible.

Ceci n'est documenté nulle part parce que (IMO), c'est un sujet qui dépend aussi de l'appareil et que le FCM n'a pas la possibilité d'y répondre. contrôle total sur.


Réponse originale :

Puisqu'il s'agit d'un dispositif spécifique ( comme vous l'avez mentionné dans votre message : Les téléphones de la série OPPO F1 ), il est tout à fait possible que lorsqu'une application est arrêté depuis le plateau multi-tâches dans ce dispositif, c'est en fait meurtre l'application, entraînant la destruction des services et autres processus d'arrière-plan qui lui sont associés. Voir ce qui suit réponse pour avoir une idée un peu plus précise de ce que j'essaie de dire.

Si vous faites des recherches dans la communauté, ce qui est communément suggéré ici est d'utiliser l'outil START_STICKY drapeau. Cependant, j'ai vu qu'il avait été mentionné précédemment pour FirebaseMessagingService (voir ce poste (commentaire de @ArthurThompson) :

Ces services seront lancés par les services Google Play, qui sont toujours en cours d'exécution sur l'appareil. Vous n'avez pas à et ne devez pas démarrer/arrêter ces services vous-même.

Cela dit, il y a aussi la possibilité de (toujours d'après les commentaires) :

Il se peut qu'il y ait un paramètre sur l'appareil qui autorise/interdise cela.


Je suggère de faire des tests supplémentaires pour voir si les services sont tués par l'appareil lui-même ou si certains paramètres bloquent les notifications.

0 votes

Ce qui est étrange, c'est que les notifications WhatsApp sont reçues par le mobile même lorsqu'il est fermé par un glissement vers l'extérieur.

0 votes

@milanm WhatsApp est souvent l'exemple à suivre sur ce sujet. Bien que je ne sache pas exactement comment ils s'y prennent. Peut-être qu'utiliser un AlarmManager et redémarrer le service pourrait aider ? J'ai vu beaucoup de personnes dans la communauté le mentionner également.

0 votes

Lorsque vous utilisez les notifications push à distance, Android réveille votre application et vous envoie la notification en utilisant un Intent. Sur la majorité des appareils, lorsque vous faites glisser l'application vers la gauche dans le plateau multi-tâches, vous détruisez effectivement l'application et ses services, mais cela n'empêche pas l'application de recevoir des notifications push.

19voto

danesz Points 389

Avez-vous essayé d'utiliser stopWithTask sur votre classe de service ?

<service
    android:name="com.yourapp.YourPushService"
    android:stopWithTask="false" />

S'il est défini à true, ce service sera automatiquement arrêté lorsque l'utilisateur supprime une tâche enracinée dans une activité appartenant à l'application. utilisateur supprime une tâche enracinée dans une activité appartenant à l'application. La valeur par défaut de défaut est false.

Si le drapeau est faux, il y a un onTaskRemoved dans votre classe de service.

Dans ce cas, vous pouvez détecter l'événement "swipe", et vous pouvez mettre en place une solution de contournement.

0 votes

Cela a fonctionné pour moi. Dans le com.yourapp.YourPushService vous devez entrer votre classe qui étend FirebaseMessagingService :)

1 votes

Donc mettre vrai ou faux ? pour empêcher le service de tuer.

22 votes

La valeur par défaut de stopWithTask est false, alors à quoi bon ?

11voto

thetanuj Points 194

J'ai vécu la même chose mais dans mon cas, c'était des téléphones Xiaomi au lieu de téléphones Oppo. Ce qui se passe en fait, c'est que lorsque vous fermez l'application depuis la barre d'état système, le système tue entièrement l'application. Cela signifie que votre application ne sera pas en mesure de recevoir des notifications via GCM/FCM. WAKE_LOCK La permission n'aide pas non plus.

Cela ne signifie PAS que le téléphone ne reçoit pas la notification. Il la reçoit. Il ne laisse simplement pas les applications l'afficher. Vous pouvez le vérifier en envoyant une diffusion depuis adb et en regardant votre logcat.

Une solution possible à ce problème est d'utiliser SyncAdapter . Bien que cela ne soit PAS conseillé, j'ai vu certaines applications l'utiliser. D'autres solutions possibles sont d'utiliser une sorte de service d'arrière-plan qui est toujours en cours d'exécution. Certaines personnes utilisent également AlarmManager car il n'est presque jamais tué. Ce que je veux dire, c'est que vous ne pouvez pas vous fier à GCM/FCM pour vos notifications.

Parlons maintenant de WhatsApp -

Dans les téléphones Xiaomi, ils mettent une application sur une liste blanche ou noire en fonction de certains critères. Si vous téléchargez une application et qu'elle figure sur leur liste blanche, ils autoriseront l'application à afficher des notifications. Dans le cas contraire, vous savez déjà ce qui se passe. Mais la bonne nouvelle, c'est que vous pouvez modifier ces paramètres. Cherchez une application nommée Sécurité. Si vous révoquez les bonnes autorisations, même WhatsApp cessera d'afficher les notifications.

1 votes

Pourriez-vous nous expliquer comment tirer profit de l'expérience de l'entreprise ? SyncAdapter pour envoyer des notifications ? Nous utilisons déjà SyncAdapter pour la synchronisation de nos données. Comment pouvons-nous également gérer les notifications push ?

0 votes

Veuillez fournir un exemple de la manière dont vous utilisez SyncAdapter pour ce cas

4voto

Mohammed Atif Points 2401

J'étais également confronté au même problème, mais j'ai réalisé après beaucoup de débogage que, j'ai arrêté les services qui reçoivent le message Firebase notifications sur la méthode d'arrêt d'une des activités.

  1. Veuillez vérifier si vous arrêtez ces services n'importe où dans l'application.
  2. Assurez-vous que vous utilisez le service et non l'intention-service.
  3. Faire glisser l'application n'arrêtera jamais les services. Essayez donc de déboguer l'application pour les deux premiers points.

2voto

Andriy Antonov Points 407

La réponse a été trouvée ici

Il n'y a aucun moyen d'envoyer un message de données depuis la console de notification.

Mais il existe d'autres moyens d'envoyer une notification aux appareils et ils seront pris en compte dans onMessageReceived !

Vous pouvez utiliser un terminal (Mac ou Linux) ou un service comme Postman pour envoyer une requête postale sur ce lien : https://fcm.googleapis.com/fcm/send

avec le prochain corps :

{
    "to": "/topics/your_topic_here",
   "data": {
       "text":"text",
       "text1":"text1",
       ...
   }
}

Vous devez également ajouter 2 en-têtes :

  1. Autorisation - clé=votre_key_serveur_ici
  2. Content-Type - application/json

Pour obtenir votre clé de serveur, vous pouvez la trouver dans la console firebase : Votre projet -> paramètres -> Paramètres du projet -> Messagerie en nuage -> Clé du serveur

enter image description here

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X