我正在使用FirebaseMessagingService
推送通知。它正在按应用程序的意图工作。 调用onMessageReceived
,我可以获取通知标题和正文+数据有效载荷,并使用LocalBroadcastManager
将反应取决于有效载荷数据发送到我的Activity
。
但是后台推送通知存在问题。这只会在后台显示通知,但不是在onMessageReceived
中创建的,因为如果应用程序在后台,则无法调用此函数。
根据文档,推送通知的数据部分存储在extras
中,可以在恢复活动时找到。我已经有此功能并且它正在工作。但问题是我没有标题和消息,因为它没有发送给onMessageReceived
,我无法捕获此信息。
有什么办法可以获得它吗?因为我需要在应用程序内的对话窗口中显示它。推送通知不仅是文本和标题,它不仅仅是用户的信息,但它会执行一些操作。
在FirebaseMessagingService
中接收通知标题、正文和有效负载:
override fun onMessageReceived(msg: RemoteMessage?) {
val pNotification = msg?.notification
val payload = msg?.data
if (pNotification != null){
val ntitle = pNotification.title
val nMsg = pNotification.body
}
//working with payload - creating notification and Intent for LocalBroadcastmanager
}
从onResume()
内部的临时演员中捕获有效载荷
private fun maybeFindBackgroundPayload(extras: Bundle?){
if (extras != null){
extras.keySet().forEach { key->
val keyValue = extras[key]
App.log("BackgroundKeyValues: $keyValue")
if (key.equals("gcm.notification.body", ignoreCase = true) && keyValue != null){
...
//Working with payload data key value - dont have title and body
}
}
}
}
不幸的是,它不可能按照您希望它的工作方式工作。
如果推送通知在有效负载中具有通知部分,并且您的应用程序在后台运行,则永远不会调用 onMessageReceived。通知由 Firebase 自动创建和显示。无法拦截此内容并修改通知或为此执行任何其他操作。只有在单击通知后,您的应用才能获得控制权。
如前所述,当应用位于前台时,将始终调用 onMessageReceived。
确保在所有情况下(前台、后台和应用程序被杀死(调用 onMessageReceived 的唯一方法是从 Firebase 发送仅数据有效负载。也就是说,删除 firebase 有效负载正文的通知部分,并将内容(标题、正文等(放在有效负载的数据部分。并在您的onMessageReceived中将此标题,正文等分配给您正在创建的通知。
以下是来自火力基地的有效载荷需要的方式:
{
"registration_ids":[
"firebase_token"
],
"data":{
"body":"body of notification",
"title":"title of notification",
"otherdatakey":"otherdatavalue"
}
}
然后在 onMessageReceived 函数中,您需要显式提取标题和正文并将其分配给通知(当然,还有您想要执行的任何其他操作(:
@Override
public void onMessageReceived(RemoteMessage message) {
Map<String, String> dataMap = message.getData();
String title = dataMap.get("title");
String body = dataMap.get("body");
String otherdatavalue = dataMap.get("otherdatakey");
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setContentTitle(title)
.setContentText(body)
.setContentIntent(pendingIntent);//To handle click of notification
}
您是否尝试过从public void handleIntent(Intent intent)
方法中获取通知和数据,它非常适合我。我很难始终如一地从通知中获取通知和/或数据,仅使用onMessageRecieved