当应用程序处于前台并调用 onMessageReceived 时不显示通知
Posted
技术标签:
【中文标题】当应用程序处于前台并调用 onMessageReceived 时不显示通知【英文标题】:Notifications not displayed when app is in foreground and onMessageReceived is called 【发布时间】:2019-07-02 09:05:27 【问题描述】:我正在尝试在收到 fcm 消息并且 APP 在后台时显示通知。我尝试了不同风格的通知,但没有运气。通知不会显示
这里是代码
public void onMessageReceived(RemoteMessage remoteMessage)
Log.d(GlobalVar.TAG, "From: " + remoteMessage.getFrom());
super.onMessageReceived(remoteMessage);
String channelId = getString(R.string.notification_channel_id);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody()).setAutoCancel(true);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(0, builder.build());
我知道这会被调用,因为我得到了日志。 如果应用程序在后台,则 FCM 会显示通知。当应用程序在前台时,上面的代码不显示它 有什么建议吗?
PS:我在Application类中创建了频道
我没有在日志猫中得到错误。我还按照下面的代码设置所有通知设置。请注意,我的设备在后台时已经接收并显示来自 FCM 的通知。但是当它在前台并且“我”处理通知的显示时,它就不起作用了
【问题讨论】:
提供您的清单 检查设置中是否允许该应用程序通知 这也取决于你如何创建 NotificationChannel。尝试在您的代码中使用IMPORTANCE_HIGH
创建 NotificationChannel。在某些设备中,如果您的通知通道的优先级不高,则不会显示通知。
在 FCM 的实施中。在您没有修改来自 FCM 的 JSON 之前,您无法在后台显示通知。您需要将 JSON 从通知标签修改为数据标签。
medium.com/@piyush052/…查看此链接。
【参考方案1】:
希望您的服务器通过data
键向您发送通知。
当我看到您的代码时,您正在使用 remoteMessage.getNotification()
现在您必须在服务器端脚本中进行更改,他们在data
键中发送如下 (You can test temporary before changing server code):
"to" : "YOUR_FCM_TOKEN_WILL_BE_HERE",
"collapse_key" : "type_a",
"data" :
"body" : "Body of Your Notification in Data",
"title": "Title of Your Notification in Title",
"key_1" : "Value for key_1",
"key_2" : "Value for key_2"
然后你可以收到这样的:
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
super.onMessageReceived(remoteMessage);
Log.d(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0)
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
要了解更多信息:
希望您能在这方面得到帮助。如果您有任何问题,请告诉我。
【讨论】:
尽量不要在这里发布一些随机代码。我的意思是NotificationBean
是什么? #sendNotification()
在哪里?
@ADM 是的,让我改变一下。
谢谢,但正如我在问题中所说的那样。 onMessageReceive 被调用,所以我知道我收到了来自 FCM 的电话。当应用程序在后台并通过 FCM 处理时,通知也已经工作。我的问题是,当应用程序处于前台并且“我”创建通知时,它不会显示【参考方案2】:
如果您不使用自己的服务器,则无法实现此目的。您需要使用自己的服务器从这里修改 JSON 格式:
"to" : "YOUR_FCM_TOKEN_WILL_BE_HERE",
"collapse_key" : "type_a",
"notification" :
"body" : "Body of Your Notification in Data",
"title": "Title of Your Notification in Title",
"key_1" : "Value for key_1",
"key_2" : "Value for key_2"
到:
"to" : "YOUR_FCM_TOKEN_WILL_BE_HERE",
"collapse_key" : "type_a",
"data" :
"body" : "Body of Your Notification in Data",
"title": "Title of Your Notification in Title",
"key_1" : "Value for key_1",
"key_2" : "Value for key_2"
当您的服务器将使用“数据”修改“通知”标签时,只有您可以在后台接收通知。
【讨论】:
以上是关于当应用程序处于前台并调用 onMessageReceived 时不显示通知的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序处于前台时收到推送通知时,是不是可以为 ios 显示横幅?
当应用程序在 iOS 10 的前台时,不会调用“willPresent 通知”并且本地通知不会显示