web-dev-qa-db-fra.com

FirebaseMessagingService 11.6.0 HandleIntent

FirebaseMessagingService a la méthode onMessageReceived() que nous devrions override gérer notifications, mais cela ne fonctionne que lorsque l'application est dans Foreground.

Pour gérer notifications même lorsque l'application est en arrière-plan, j'avais l'habitude de remplacer la handleIntent, d'appeler simplement la onMessageReceived().

Dans FirebaseMessagingService 11.6.0, la méthode handleIntent est devenue finale. Ceci dit, je ne peux pas la remplacer comme je le faisais.

Comment dois-je gérer les notifications lorsque mon application est en arrière-plan dans la version 11.6.0?

public class NotificationsListenerService extends FirebaseMessagingService {
    private static final String TAG = "NotificationsListenerService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) 

        String notifyData = remoteMessage.getData().get("notifData");

        if(notifyData.contains("|")){
            String[] itens = notifyData.split("\\|");
            notifyData = itens[0];
        }


        String notifyType = remoteMessage.getData().get("notifType");
        String title = remoteMessage.getData().get("title");
        String message = remoteMessage.getData().get("body");

        if(!isAppInForeground(App.getContext())){
            sendNotification(title, message, notifyData, notifyType);
        }
    }

    @Override
    public final void handleIntent(Intent intent) {
        ...
        this.onMessageReceived(builder.build());
        ...
    }

    private void sendNotification(String messageTitle, String messageBody, String notifyData, String notifyType) {
        ...
    }


    //Detect if app is in foreground
    private boolean isAppInForeground(Context context) {
        ...
    }
}
5

Il n'est pas destiné à quiconque de remplacer handleIntent(). C'est pourquoi il a été rendu final. En outre, vous remarquerez qu'il manque complètement à la javadocs - c'est intentionnel.

Si vous souhaitez gérer un message en toutes circonstances (à la fois au premier plan et à l'arrière-plan), utilisez onMessageReceived () . Le javadoc de cette méthode dit:

Appelé lorsqu'un message est reçu.

Ceci est aussi appelé lorsqu’un message de notification est reçu alors que le l'application est au premier plan. Les paramètres de notification peuvent être récupérés avec getNotification ().

Cela devrait fonctionner pour les messages de données, mais pas pour les messages de notification envoyés depuis la console. Les messages de notification ont un comportement de remise différent. Reportez-vous à la documentation sur types de message _ et comment les gérer _.

2
Doug Stevenson

J'ajouterais que dans les documents FirebaseMessagingService 11.8.0, il est indiqué dans https://firebase.google.com/docs/cloud-messaging/Android/receive que si une notification contient une charge de données, elle sera appelée onMessageRecieved () lorsque l'application est au premier plan et si l'application est en arrière-plan, la notification et la charge utile des données sont livrées dans les extras de l'intention de votre activité de lancement. 

Cela signifie donc que vous devez décider comment gérer la notification à deux endroits, selon que l'utilisateur utilise activement l'application ou en arrière-plan.

Comme vous l'avez constaté vous-même, si vous recevez la notification alors que l'application est au premier plan, onMessageReceived () est appelé et vous gérez la notification à cet endroit. 

Lorsque l'application est lancée à partir de l'arrière-plan, vous avez 2 options:

1: Par défaut, la notification est envoyée à la barre d'état système et, lorsque l'utilisateur clique dessus, elle ouvre votre activité principale en transmettant les données (ce qui aurait été remoteMessage.getData () dans onMessageReceived ()) à votre activité en tant qu'extrants d'intention. Vous pouvez gérer les extras de votre activité principale comme suit et décider quoi faire avec eux, par exemple, rechercher une valeur de clé et lancer une intention connexe. 

    // [START handle_data_extras]
    if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d(TAG, "Key: " + key + " Value: " + value);
        }
    }
  1. Vous pouvez décider quelle intention d'ouvrir au clic si vous ajoutez un filtre d'intention dans le manifeste de votre application et une valeur "click_action" désignée dans votre notification, puis gérer les extras d'intention dans l'activité désignée. Voir https://stackoverflow.com/a/39665485/3746204

Je suggérerais également de consulter l'exemple d'application de messagerie Firebase pour des idées: https://github.com/firebase/quickstart-Android/tree/master/messaging

3
astralbody888

j'ai le même problème après la version mise à jour de la bibliothèque Firebase.

je pense que le moyen le plus simple est de déclasser à nouveau la bibliothèque Firebase (j'utilise 11.4.2) et handleIntent() fonctionne toujours!

1
M Moersalin