Android:后台传递数据的FCM推送通知

时间:2017-08-02 11:56:52

标签: android firebase firebase-cloud-messaging

我在将背景数据传递到屏幕时遇到了困难。在后台,应用程序正在正确调用屏幕,但该屏幕所需的数据位于通知中的“数据”(来自数据对象的id)中,并未被提取。 在前台,我正确地获得了“数据”。

通知json

{
    "to" : "akshih890uhnkjh389jfkn3...",
    "priority" : "normal",
    "time_to_live" : 0,
    "data" : {
        "type" : "my_type",
        "id" : "my_id"
    },
    "notification" : {
        "body" : "Test body",
        "title" : "Test title",
        "click_action" : ".MyActivity"
    }
}


 public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

            String title = remoteMessage.getNotification().getTitle();
            String body = remoteMessage.getNotification().getBody();
            String clickAction = remoteMessage.getNotification().getClickAction();

                Map<String, String> data = remoteMessage.getData();
                Gson gson = new Gson();
                MyObject myObject = new MyObject(data.get("id"), data.get("type"), remoteMessage.getNotification().getTitle(),
                    remoteMessage.getNotification().getBody());

                Intent intent = new Intent(myObject.getClickAction());
                intent.putExtra("id", myObject.getId());

                PendingIntent contentIntent = PendingIntent.getActivity(
                        this, 0, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT);

                sendFCMNotification(title, body, contentIntent);

        }

MyActivity

 if(getIntent() != null) {

            Bundle extras = getIntent().getExtras();
            code = extras.getString("id");

        }

4 个答案:

答案 0 :(得分:1)

int id = Integer.valueOf(remoteMessage.getData().get("id"));

由于您使用remoteMessage.getData(),因此您获得整个data对象,而不是内部有data json的对象,您可以使用您的字段获得实际的data json。

String data = remoteMessage.getData();
Gson gson = new Gson();
MyObject myObject = gson.fromJson(data, MyObject.class);

答案 1 :(得分:1)

如果您的应用处于后台,Firebase将不会触发onMessageReceived()。为什么.....?我不知道。在这种情况下,我认为实施FirebaseMessagingService没有任何意义。

根据文档,如果您要处理后台邮件到达,则必须发送带有邮件的“click_action”。但是,如果您仅通过Firebase API从Firebase控制台发送消息,则无法进行此操作。这意味着您必须构建自己的“控制台”才能使营销人员使用它。所以,这使得Firebase控制台也毫无用处!

这个新工具背后有很好的,有希望的想法,但执行得很糟糕。

我想我们将不得不等待新版本和改进/修复!

答案 2 :(得分:0)

在后台,如果要调用特定活动,则可以从intent extras获取数据,然后在数据的click_action属性中指定它

参阅:

Firebase Server reference

Firebase Push

答案 3 :(得分:0)

我发现了问题,当服务器在后台发送通知对象时我看不到日期。但是当服务器只发送我获得id的日期时,如何在没有标题和正文数据的情况下构建通知?