如果应用未运行,则FirebaseMessagingService:intent.putExtra()无效

时间:2016-09-29 18:55:06

标签: android android-intent firebase firebase-notifications

EDIT3:确定我发现了问题:如果应用被杀,则发送data notification不会触发onMessageReceived。如果目标设备是android,则需要将notification设置为null。

这真的是一种愚蠢的行为。

原帖:

我可以在应用程序启动时从notificationBuilder传递给活动的意图成功检索到包。

但是,如果我终止该应用,通知仍然有效,但意图中的GetExtras()为空。

在我的FirebaseMessagingService子课程中:

@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());

}

当应用被杀时,firebaseMessagingService甚至无法写入文件。它不会崩溃,它会构建并显示通知,但是对磁盘所做的任何操作都不起作用。

编辑:我已将onMessageReceived方法的内容替换为如下:

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

当应用程序运行时,没有任何事情发生 - 按预期 - 但是当应用程序被杀死时,会显示一个通知,其中名称应用程序为标题,remoteMessage.getNotification().getBody()为内容文本。

onMessageReceived似乎没有被解雇。相反,另一个魔术函数被称为......

EDIT2:根据要求,这是从服务器发送的内容:

{
    "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
}

2 个答案:

答案 0 :(得分:2)

在第二次修改后,我们可以看到您向FCM发送了notificationdata个有效负载。如果选中FCM Documentation,则可以看到应用程序的行为方式,具体取决于处于前台还是后台。 (您的应用程序被杀死与在后台运行相同。)

  

[例外2] 包含通知和数据有效负载的消息,包括后台和前台。在这种情况下,通知将传递到设备的系统托盘,数据有效负载将在附加内容中传送您的启动器活动的意图。

这意味着在此状态下永远不会调用onMessageReceived方法。 FCM服务在内部创建启动主活动的通知,并自动传递意图包中的data有效负载

您应该正确处理这种情况,或者仅使用data个有效负载来选择退出内置行为。

答案 1 :(得分:0)

我的第一个回答你最后删除的问题,因为我们都觉得在你的情况下调用onMessageReceived()。但这就是它真正的

onMessageReceived()方法如果应用程序处于后台或被杀,并且发送的邮件包含DATA和NOTIFICATION有效负载,则不会被称为

当应用未运行时,您仍会收到通知。但是如果你想通过onMessageReceived()拦截数据,那么你将不得不创建一个自定义应用服务器,它将仅发送DATA有效载荷到fcm端点。

类似的东西:

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

希望这能解决您的问题。

编辑:我刚刚意识到,如果您想要在应用程序被杀并在后台发送通知和数据有效负载,则可以拦截意图 strong>在启动器活动中 当用户点击通知时。只需这样做:

Intent fcmIntent = getIntent();

但这只适用于通知点击启动的Launcher Activity。 您只需将其放入onCreate()方法。