当应用程序在后台时处理数据有效负载

时间:2017-03-21 15:59:12

标签: android firebase firebase-cloud-messaging

我正在尝试让我的应用程序在后台处理DATA有效负载。

"data": {
        "aKey": "aValue",
        "customtitle": "my title",
        "custombody": "my body",
        "customimage": "my image"
    },
    "notification": {
        "title": "my title",
        "text": "some text",
        "icon": "icon to use",
        "sound": "soundtouse"
    }

根据 处理后台应用程序中的通知消息

下的documentation进行评估
  

..数据有效负载是在启动器Activity的意图的附加内容中提供的。

在我的应用程序中,onMessageReceived只会收到RemoteMessage个对象。

我尝试覆盖onMessageReceived签名以接受Intent,但这不起作用。

除了文档中非常持久的句子外,我找不到任何教程或解释。

当有人在应用程序处于后台或关闭时,有人可以告诉我有关如何处理数据有效负载的示例吗?

如果应用程序已打开,则它会从我的onMessageReceived(RemoteMessage)方法处理数据有效负载。

2 个答案:

答案 0 :(得分:0)

您可以简单地使用Map来检索数据frm RemoteMessage对象。

public void onMessageReceived(RemoteMessage msg)
        {
            Log.d("Remote msg",msg.getData().toString());
            try
            {
                Map<String, String> params = msg.getData();
                JSONObject object = new JSONObject(params);
                Log.d("Remote msg", object.toString());
          }
       }

<强>更新 仅当应用程序位于前台时,才会在onMessageReceived中接收通知消息。

在后台,应用程序在通知托盘中接收通知有效负载,并仅在用户点击通知时处理数据有效负载。 在前台时,您的应用会收到一个消息对象,其中包含两个可用的有效负载。 资料来源:https://firebase.google.com/docs/cloud-messaging/concept-options

解决方法: 看起来您正在使用通知和数据。您只能使用数据并调用onMessageReceived(),您应该触发自己的通知。 资源: https://medium.com/@Miqubel/mastering-firebase-notifications-36a3ffe57c41#.z1s28d59d

答案 1 :(得分:0)

您只遇到FCM的预期行为。在您关联的documentation中,该表显示在使用data有效负载时,只会触发onMessageReceived() ,如果,则消息有效负载仅包含数据:

"data": {
        "aKey": "aValue",
        "customtitle": "my title",
        "custombody": "my body",
        "customimage": "my image"
    }

但您在消息有效负载中同时使用notificationdata。这意味着当您的应用处于后台时,有效负载将由Android系统自行处理,在通知托盘中显示notification详细信息。

然后当用户点击关于该Android处理过的通知时,它应该打开您的应用(通常是MainActivity或您使用click_action设置为打开的任何活动)并从那里,你应该像这样处理意图:

    Intent intent = getIntent();
    String pos = getIntent().getStringExtra("<YOUR KEY HERE>");
    if(pos !=null){
        selectDrawerItem(navigationView.getMenu().getItem(Integer.parseInt(pos)));
    }