web-dev-qa-db-fra.com

Android Notification avec FCM - Qui a démarré FirebaseMessagingService?

Selon le guide de configuration ici , dans un exemple d'application, A) J'ai créé une classe qui extends classe de services firebase. B) J'ai mis ces classes dans le AndroidManifest.xml

A) Java classe

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //a) What's the life cycle of the service? How can I ensure this method is getting called?
        //b) If the service is killed at some point, will system restart it on receiving new messages?
        Log.d(TAG, "From: " + remoteMessage.getFrom());
    }
}

B) AndroidManifest.xml

<service
    Android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

Ensuite, l'application peut recevoir des notifications de FCM!

Voici ma question:

  1. Qui a lancé le service de notification FirebaseMessagingService? Il doit y avoir un endroit appelant startService (), n'est-ce pas?

  2. D'après ce que je comprends, la notification en aval sera envoyée au service Google Play de mon appareil mobile, quel que soit l'état de mon application. Ensuite, dans quelle mesure puis-je m'assurer que ma onMessageReceive() est appelée lorsque app ou service est swipe closed/killed/force stop? Le comportement pertinent est-il documenté quelque part?

ÉDITER:

  1. Je suis plus préoccupé par le cas suivant. Parlons du data message. (par rapport à notification message.) Mon application client a reçu le message FCM et affiche la notification par défaut, car le service google play est en cours d'exécution et l'envoie à la barre d'état système. Mais ma onMessageReceive() n'est pas appelée, car MyFirebaseMessagingService est détruite par le système et non redémarrée. C'est possible?
14
Weishi Zeng

1. Qui a lancé le service de notification FirebaseMessagingService? Il doit y avoir un endroit appelant startService (), n'est-ce pas?

Le SDK le fait automatiquement pour vous.

2. D'après ce que je comprends, la notification en aval sera envoyée au service Google Play de mon appareil mobile, quel que soit l'état de mon application. Ensuite, dans quelle mesure puis-je m'assurer que ma onMessageReceive() est appelée lorsque app ou service est swipe closed/killed/force stop? Le comportement pertinent est-il documenté n'importe où?

Les documents officiels pour Receiving Message for Android is here . Il décrit le comportement du message (en fonction du type de charge utile de message que vous utilisez (par exemple notification ou data)) lorsque votre application est au premier plan et en arrière-plan.

Pour pouvoir gérer le message vous-même (dans onMessageReceived()), vous devrez envoyer data- uniquement charge utile du message.

Pour le sujet concernant glisser fermé/tué/forcer arrêté, 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 toujours un message (testé avec un data- seulement message payload) if I Swipe close my app. Mais quand je force fermé dans le menu Paramètres, je n'ai 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 glissez près l'application, ce sera la même chose que forcez l'arrêt eux (voir ma réponse ici ).

Il existe également des appareils où même si l'application est toujours simplement glissée, même si ce n'est pas forcé, l'appareil lui-même l'empêche de recevoir des messages . D'autres disent que cela ne peut pas être le cas, car des applications comme WhatsApp ont pu le faire. La raison pour laquelle j'ai appris jusqu'à présent pour cela est que les fabricants d'appareils ont liste blanche la plupart des applications bien connues pour que cela soit possible.

Donc, juste pour répondre à votre question, non. Ce n'est documenté nulle part car (IMO) c'est un sujet qui dépend aussi de l'appareil et que FCM n'a pas contrôle total terminé.

3. Je suis plus préoccupé par le cas suivant. Parlons du message de données. (par rapport au message de notification.) Mon application client a reçu le message FCM et affiche la notification par défaut, car le service google play est en cours d'exécution et l'envoie à la barre d'état système. Mais mon onMessageReceive () n'est pas appelé, car MyFirebaseMessagingService est tué par le système et non redémarré. Est-ce possible?

AFAIK, le FirebaseMessagingService est lié avec le service Google Play tant que le service Google Play est actif, le service Firebase aussi. Une partie de mon réponse ici :

Cependant, j'ai vu que cela avait déjà été mentionné auparavant pour FirebaseMessagingService (voir ceci post , commentaire de @ArthurThompson):

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

12
AL.