我正在使用Firebase并测试在应用程序处于后台时从服务器发送通知到我的应用程序。通知发送成功,它甚至出现在设备的通知中心,但当通知出现或即使我点击它,我的FCMessagingService中的onmessagerreceived方法永远不会被调用。

当我测试这个,而我的应用程序是在前台,onmessagerreceived方法被调用,一切工作正常。问题发生在应用程序在后台运行时。

这是我有意为之的行为吗,或者我有办法解决这个问题吗?

这是我的FBMessagingService:

import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class FBMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.i("PVL", "MESSAGE RECEIVED!!");
        if (remoteMessage.getNotification().getBody() != null) {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
        } else {
            Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
        }
    }
}

当前回答

我正在使用的后端使用通知消息,而不是数据消息。因此,在阅读了所有的答案后,我试图从启动的活动的意图包中检索额外的内容。 但无论我试图从getIntent(). getextras();中检索哪个键,值始终为空。

然而,我最终找到了一种方法,使用通知消息发送数据,并从意图中检索它。

这里的关键是向Notification消息添加数据有效负载。

例子:

{
    "data": {
        "message": "message_body",
        "title": "message_title"
    },
    "notification": {
        "body": "test body",
        "title": "test title"
    },
    "to": "E4An.."
}

在你这样做之后,你将能够以这种方式获得你的信息:

intent.getExtras () .getString(“标题”) message_title

而且 intent.getExtras () .getString(“信息”) message_body

参考

其他回答

看看@Mahesh Kavathiya的答案。对于我的情况,在服务器代码中只有这样:

{
"notification": {
  "body": "here is body",
  "title": "Title",
 },
 "to": "sdfjsdfonsdofoiewj9230idsjkfmnkdsfm"
}

您需要更改为:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
"notification": {
  "body": "here is body",
  "title": "Title"
 },
 "to": "sdfjsdfonsdofoiewj9230idsjkfmnkdsfm"
}

然后,如果app在后台,默认的活动意图extra会得到"data"

好运!

这个方法handleIntent()已经被贬低了,所以处理通知可以如下所示:

前台状态:点击通知将转到你在创建通知时提供的pending Intent的活动,因为它通常是用通知的数据负载创建的。 后台/已终止状态——在这里,系统本身根据通知有效负载创建了一个通知,点击该通知将带你到应用程序的启动器活动,在那里你可以轻松地获取任何生命周期方法中的Intent数据。

Firebase推送通知有两种类型:

1-通知消息(显示消息)-> . 0 如果你选择这个变体,如果app在后台,操作系统会自己创建一个通知,并在intent中传递数据。然后由客户端来处理这些数据。

如果应用程序在前台,那么通知将通过FirebaseMessagingService中的回调函数接收,并由客户端来处理。

2-数据消息(最多4k数据)->这些消息只用于发送数据到客户端(静默),这是由客户端来处理这两种情况下后台/前台通过FirebaseMessagingService的回调函数

这是官方文档:https://firebase.google.com/docs/cloud-messaging/concept-options

我有这个问题(应用程序不想打开通知点击,如果应用程序是在后台或关闭),问题是在通知主体无效的click_action,尝试删除或更改为有效的东西。

值得强调的一点是,你必须使用数据消息-数据键-让onmessagerecreceived处理程序被调用,即使应用程序是在后台。你不应该在你的有效负载中有任何其他通知消息键,否则如果应用程序在后台,处理程序将不会被触发。

这里提到了(但在FCM文档中没有特别强调):

https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

使用您的应用服务器和FCM服务器API:只设置数据键。可以 要么可折叠,要么不可折叠。