使用 GcmListenerService 的多个 GCM 侦听器

Multiple GCM listeners using GcmListenerService

Google 建议使用 GcmListenerService 代替 GcmBroadcastReceiver。

正在制作一个使用 GCM 的库项目(com.android.library 插件)。当应用程序项目(com.android.application 插件)不使用 GCM 时,它运行良好。

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

库模块已在其清单中定义了 GCM 权限以及接收方和服务条目。应用程序模块已在其自己的清单中定义其服务条目。

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

有什么方法可以实现吗?

编辑: 将调用哪个服务取决于它在合并清单中定义的顺序 xml。如果我颠倒顺序,就会调用另一个服务!有什么方法可以调用这两种服务吗?

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

如果您真的想要两个实现,请通过提高其优先级使其中一个成为主要实现 (see here)。然后,您可以通过使用数据创建意图、显式设置组件,然后启动另一个服务,让该服务调用第二个服务。

@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 class,它并没有比以前的 GcmBroadcastReceiver 做得更好。只是额外处理令牌刷新。 所以GcmBroadcastReceiver最好只在需要多个回调的时候使用