2016-09-29 9 views
3

EDIT3: Ok je trouve le problème: Si l'application est tué, l'envoi à la fois dataetnotification ne se déclenche pas onMessageReceived. notification doit être défini sur null si le périphérique cible est android.FirebaseMessagingService: intent.putExtra() ne fonctionne pas si l'application ne fonctionne pas

C'est vraiment un comportement stupide.

Original post:

je peux récupérer avec succès le paquet de l'intention adoptée par le notificationBuilder à l'activité lorsque l'application est lancée.

Cependant, si je tue l'application, la notification fonctionne toujours mais le GetExtras() de l'intention est null.

Dans ma FirebaseMessagingService classe enfant:

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) 
{ 
    Intent intent = new Intent(this, MainActivity.class);   
    intent.putExtra("key_1","value"); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    //also tried with PendingIntent.FLAG_CANCEL_CURRENT 


    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle("title") 
      .setContentText("messageBody") 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(0, notificationBuilder.build()); 

} 

Lorsque l'application est tué, le firebaseMessagingService ne peut pas écrire même un fichier. Il ne plante pas, il construit et affiche la notification, mais tout ce qui est fait sur le disque ne fonctionne pas.

EDIT: J'ai remplacé le contenu de la méthode onMessageReceived comme suit:

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) 
{ 
    // Do nothing 
} 

Lorsque l'application est en cours d'exécution ne se passe-t -comme prévu- mais quand l'application est tué une notification est affichée cinque la app nom comme un titre et remoteMessage.getNotification().getBody() comme texte de contenu.

Il semble que onMessageReceived ne soit pas utilisé. Au lieu de cela une autre fonction magique est appelée ...

EDIT2: Comme l'a demandé, voici ce qui est envoyé à partir du serveur:

{ 
    "data": 
    { 
      "form_id":"33882606580812", 
      "recipientUserId":10500 
    } 
    , 
    "to":"e0bU2jIVO9g:APA91bHsS-s3G1gQLcTFtRUC77pJUWcZvD7h9NfUgFLD-bFam1S0dddngVcmrQlXR5i6DfTsc69T8JbIrSuzyF1iv0c4ac1gmkwvGVMwZo_yA4KwOh82Nx-weYeL79r79si4qH3QBEgs", 
    "notification": 
    { 
      "body":"you have a new notification", 
      "badge":"1", 
      "sound":"default" 
    }, 
    "delay_while_idle":false 
} 
+1

S'il vous plaît pouvez-vous partager le JSON de votre fcm que vous utilisez pour envoyer des données et des notifications? –

+0

Également mettez-vous tout ce code ici? '// Vérifie si le message contient une charge utile de données. if (remoteMessage.getData(). Size()> 0) { Log.d (TAG, "Données du message payload:" + remoteMessage.getData()); // et votre autre code i.e intentions et tous } ' –

+0

Pouvez-vous me dire le fabricant ou le modèle de téléphone que vous tester sur. Parce que de nombreux fabricants ** (spécialement ceux basés en Chine) ** ont un service de fond bizarre tuent les applications dans leur architecture qui causent beaucoup de problèmes avec les applications de fond de services et plus encore. Juste un léger souci que même cela pourrait être un problème ici. –

Répondre

1

Ma première réponse à votre question que j'ai fini par supprimer puisque nous avons tous les deux senti que dans votre cas onMessageReceived() est appelée. Mais c'est ce qu'il est vraiment

onMessageReceived() méthode ne sera pas appelé si l'application est en arrière-plan ou tué et si le message envoyé contient la charge utile DATA et de notification à la fois.

Lorsque l'application n'est pas en cours d'exécution, vous recevrez quand même une notification. Mais si vous voulez intercepter des données via onMessageReceived(), vous devrez créer un serveur d'applications personnalisé qui enverra à seulement la charge utile DATA à fcm endpoint.

quelque chose comme ceci:

{ 
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", 
    "data" : { 
    "Title" : "Title for Notification", 
    "body" : "Notification body can go here", 
    "Room" : "Something extra" 
    }, 
} 

Hope this résout votre problème.

EDIT: Je viens de réaliser que si vous voulez envoyer la notification et la charge utile de données à la fois alors que l'application est tué et en arrière-plan alors intention peut être intercepté l'activité de lancement lorsque l'utilisateur clique sur la notification . En faisant simplement ceci:

Intent fcmIntent = getIntent(); 

Mais cela ne fonctionnera que dans l'activité Launcher que le clic de notification lance. Vous pouvez simplement le mettre dans la méthode onCreate().

2

Après votre deuxième édition, nous pouvons voir que vous envoyez à la fois un notification et une charge utile data à FCM. Si vous vérifiez le FCM Documentation, vous pouvez voir comment l'application va se comporter en étant au premier plan ou en arrière-plan. (Avoir votre application tué est le même que celui en cours d'exécution en arrière-plan.)

[Exception 2] messages à la fois la charge utile de notification et de données, à la fois arrière-plan et de premier plan. Dans ce cas, la notification est envoyée à la barre d'état système du périphérique et la charge utile de données est fournie dans les extras correspondant à l'intention de votre activité de lancement.

Cela signifie que votre méthode onMessageReceived n'est jamais appelée dans cet état. Le service FCM crée en interne une notification qui démarre votre activité principale et transmet automatiquement la charge datadans le lot d'intention.

Vous devez gérer correctement cette situation ou utiliser uniquement les charges utiles data pour désactiver le comportement intégré.