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
}
答案 0 :(得分:2)
在第二次修改后,我们可以看到您向FCM发送了notification
和data
个有效负载。如果选中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()方法。