使用GCMReceiver和GcmListenerService时如何自定义通知显示和音调

Shi*_*ack 5 android google-cloud-messaging

我已按照说明在此处设置Android GCM客户端应用程序,并且特别针对此摘录存在问题:

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

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

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

思考?

Shi*_*ack 5

当我将它发布在Google Samples github wiki上时,@ SamStern回答了这个问题:

因此有两种GCM消息:

通知消息 - 这些消息旨在生成通知,而不会由应用程序进行中间处理.如果应用程序正在运行,它们只会触发onMessageReceived.

数据消息 - 这些消息旨在以静默方式将数据传递到应用程序的消息服务.即使应用程序在后台,它们也会点击onMessageReceived.然后,服务可以选择使用正常系统通知API生成通知,或者可以选择以静默方式处理消息.

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