使用GCMReceiver和GcmListenerService

时间:2016-02-07 18:34:01

标签: android google-cloud-messaging

我已按照说明设置了Android GCM客户端应用here,并特别针对此摘录提出了问题:

  

对于扩展WakefulBroadcastReceiver的现有应用程序,Google   建议迁移到GCMReceiver和GcmListenerService。至   迁移:在应用清单中,将GcmBroadcastReceiver替换为   “com.google.android.gms.gcm.GcmReceiver”,并替换当前   将IntentService扩展到新的服务声明   GcmListenerService从中删除BroadcastReceiver实现   您的客户端代码重构当前的IntentService服务   实现使用GcmListenerService

我在GCM实现中看到的大多数示例都使用扩展WakefulBroadcastReceiver的类。例如this one。当您这样做时,您有机会使用NotificationManager并自定义通知图标,声音等。但是,如果您遵循Google的建议,我不确定如何自定义通知。大多数使用Google建议使用GcmListenerService的示例,只需覆盖onMessageReceived方法即可。但是,只有在收到通知时应用程序已经位于前台,或者用户单击通知本身时,才会调用该方法。该方法不是自定义通知声音的正确位置。在调用该方法之前已经播放了声音。

因此,如果我需要自定义通知声音,我应该在GcmListenerService中覆盖不同的方法,但是没有文档显示哪一个。另一种选择是使用here描述的sound属性。但是你必须自己将声音文件捆绑在应用程序的res/raw目录中。这似乎是错的。我宁愿只使用系统提供的声音,主题等。

思想?

2 个答案:

答案 0 :(得分:5)

@SamStern在我发布Google Samples github wiki后发现了这个问题:

  

所以有two kinds of GCM messages

     

通知消息 - 这些消息旨在生成通知   没有应用程序的中间处理。他们只打了   如果应用正在运行,则onMessageReceived。

     

数据消息 - 这些消息旨在以静默方式将数据传递给应用程序   消息服务。即使应用程序在,它们也会触发MessageReceived   的背景。然后,服务可以选择生成通知   使用正常的系统通知API,或者它可以选择处理   信息默默无闻。

我的想法是,如果客户端应用程序想要自定义通知如何呈现给用户(即更改通知栏中的图标,根据应用程序的共享首选项中的声音设置播放声音等),那么我们必须使服务器发送“数据消息”而不是“通知消息”。 Here's Google Samples项目中的实现,展示了如何处理数据消息。

答案 1 :(得分:0)

我只能看到可能的选项是通过有效负载(如您所示),由XMPPHTTP连接服务器处理。我不确定为什么你的错误似乎是错误的,因为服务器将在有效负载中定义sound数据,客户端只需要相应资产文件夹中的文件。

显示自定义也可以通过通知有效负载完成(尽管它仅限于coloricon