使用GcmListenerService的多个GCM侦听器

时间:2015-08-17 12:21:10

标签: android google-cloud-messaging

Google建议使用GcmListenerService代替GcmBroadcastReceiver。

正在制作使用GCM的图书馆项目(com.android.library插件)。当应用程序项目(com.android.application插件)不使用GCM时它很适用。

当应用程序项目使用GCM时,库项目接收器不会被调用!

库模块定义了GCM权限和接收器&其中的服务条目清单。应用模块已在其自己的清单中定义了它的服务条目。

使用GcmBroadcastReceiver,这可能是可能的,因为它是广播。在这里看到了很多相同的问题。由于弃用,不想使用GcmBroadcastReceiver。

有没有办法让这项工作?

编辑:将调用哪个服务取决于它在合并清单xml中定义的顺序。如果我撤销订单,则会调用其他服务!有没有办法打电话给两个服务?

2 个答案:

答案 0 :(得分:4)

@morepork已经正确回答了这个问题。我只是回答这个问题来添加代码段。

这肯定不是完美的解决方案,但目前我没有找到任何更好的解决方案。

这就是我的代码的样子:

@Override
public void onMessageReceived(String from, Bundle data) {
    if(!"MY_SENDER_ID".equals(from)) {
        data.putString("from", from);

        Intent intent = new Intent();
        intent.putExtras(data);
        intent.setAction("com.google.android.c2dm.intent.RECEIVE");
        intent.setComponent(new ComponentName(getPackageName(), "my.application.packageId.MyGcmListenerService"));

        GcmReceiver.startWakefulService(getApplicationContext(), intent);
    }

需要确保启动合并清单中定义的所有服务侦听器,并且此侦听器具有最高优先级。我知道有点约束。

编辑:刚刚反编译了com.google.android.gms.gcm.GcmReceiver类,它没有做比以前的GcmBroadcastReceiver更好的事情。只需处理令牌刷新额外。 因此,只有在需要多次回调时才使用GcmBroadcastReceiver会更好。

答案 1 :(得分:1)

最好的解决方案是只有一个GcmListenerService实现,并为此处理消息。

如果你真的想要有两个实现,那么通过增加它的优先级(see here)来使其成为主要实现。然后,您可以让该服务通过创建数据意图,显式设置组件,然后启动其他服务来调用第二个服务。