(新)收到 GCM 消息,但是如何解析?

14
我正在使用Google Play Services中的“新”GCM,它不使用Android和服务器的jar。 Android使用Google Play apk进行注册、接收甚至发送消息。在服务器端,我们只需要向他们的服务器发送POST请求即可与GCM通信(如果不使用XMPP)。我已经完成了所有设置:我的Android应用程序注册并等待来自GCM的消息。我的服务器可以与GCM通信,我能够将消息交付给我的Android应用程序。
问题是:我正在使用一个常见的jar文件(Android和服务器都使用)和POJO对象,我将其转换为JSON格式。由于从服务器到GCM的POST请求使用JSON,而在Android中接收到的消息也使用JSON(至少我认为是这样),所以我认为这会让我的生活更轻松。但是,在Android中从GCM接收消息时,我不知道如何获取消息的有效负载并将其转换为我的对象。我可以看到其中的信息,但它不是我的对象(其中还有一些信息被GCM推入其中)。
我的问题是:在Android端是否有一种方法可以获取有效负载信息,就像我发送到GCM服务器的那样?还是应该在Android中解析接收到的数据而不使用JSON?
我发送的消息(“data”是有效负载)
{"registration_ids":["APA91bFdV..."],"collapse_key":null,"delay_while_idle":false,"time_to_live":2419200,"data":{"type":10,"targetVersion":-1,"message":"test msg","url":"test url"}}
我在Android中得到的信息intent.getExtras().toString()
Bundle[{message=test msg, collapse_key=do_not_collapse, targetVersion=-1, from=483833987130, type=10, url=test url}]
我将不知道如何获取有效负载信息并转换为我的对象,感谢你的帮助。谢谢!
3个回答

24
在Android端是否有一种方法可以获取我发送到GCM服务器的负载信息呢?与其考虑“JSON”,不如考虑“键/值对”。您的服务器以键/值对的形式发送数据。您的应用程序在Intent的extras中接收该数据作为键/值对。您知道您的键是什么,所以只需从与这些键相关联的extras中检索出值即可(例如getStringExtra("message")getStringExtra("url"))。
还是说我应该在Android中解析接收到的数据而不使用JSON?接收到的数据不是JSON。

如何在Java中为Apple和Android定义模型类? - user4798111

10

你需要在JSON数据中添加另一层,显然它们不会递归解析JSON。

{...., "data":{"payload":{"id":5,"a":5}}}

然后在代码中:

String json = intent.getExtras().getString("payload");
// json = {"id":5,"a":5}

这可以轻松转换为POJO,如果你已经有类(或者只想使用对象而不是get...("xyz")),那么对我来说这种方法更好。


谢谢你提供这个小技巧。Google为我们提供了4kb的有效载荷,所以我想使用它来代替“tickle”,这样就不需要再调用我的后端API了。干杯! - ajwest

1

这是我获取数据的方法...我认为这会对你有所帮助。

这是我从UrbanAirship推送通知中收到的响应。

Bundle[{com.urbanairship.push.ALERT=, content-available=1, newscategorycode=O21R97, priority=5, com.urbanairship.push.PUSH_ID=afc9e690-f308-11e4-af8c-001018957618, id=6534.0, from=966150816212, func=News, newscategory=HR, com.urbanairship.push.APID=28e48c60-324b-456c-95b5-8fde9ab1a956, collapse_key=do_not_collapse, com.urbanairship.push.CANONICAL_PUSH_ID=7641453d-9207-4213-81c0-404387583de7}]

解决方案:

    Bundle bundle = message.getPushBundle();

在您的情况下,获取bundle对象,然后像这样使用...
    String func = bundle.getString("func");
    String newscategory = bundle.getString("newscategory");
    String sinceId = bundle.getString("id");

你会得到数据...
愉快编程!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接