我正在编写一个与SmoochCarnival集成的应用程序。这两个库都使用定义GCM Intent 服务以接收消息的标准方法来接收GCM推送消息。

当我仅使用Smooch时,一切都很好。当我仅使用狂欢节时,一切都很好。当我尝试同时使用两者时,问题就来了。我发现,GCM接收器将仅启动 list 中定义意向com.google.android.c2dm.intent.RECEIVE的第一个服务。

实际上,我发现在build.gradle中列出库的顺序会影响其 list 合并到应用程序 list 中的顺序。因此,如果我先使用smooch,它会起作用(但Carnival不会收到任何东西)。如果我把嘉年华放在首位,它就可以工作(但是Smooch从来没有收到任何东西)。

当我不控制任何一个时,如何处理多个GCM意向服务?通常,应用程序应如何定义和管理多个GCM Intent 服务?

最佳答案

您无法同时在Carnival和Smooch上工作的原因是这两个库都注册了自己的GcmListenerService,而在Android中, list 中定义的第一个GcmListenerService将接收所有GCM消息。

我主要基于以下SO文章为您提供解决方案:
Multiple GCM listeners using GcmListenerService



为了指定您自己的GcmListenerService,请遵循Google's Cloud Messaging Documentation的指示。

Smooch提供了必要的工具,您可以在拥有自己的工具时禁用其内部GCM注册。

为此,只需在初始化Smooch时调用setGoogleCloudMessagingAutoRegistrationEnabled即可:

Settings settings = new Settings("<your_app_token>");
settings.setGoogleCloudMessagingAutoRegistrationEnabled(false);
Smooch.init(this, settings);

然后在自己的GcmRegistrationIntentService中,使用 token 调用Smooch.setGoogleCloudMessagingToken(token);

完成此操作后,您便可以将GCM消息传递到所需的任何GCM接收器。
@Override
public void onMessageReceived(String from, Bundle data) {
    final String smoochNotification = data.getString("smoochNotification");

    if (smoochNotification != null && smoochNotification.equals("true")) {
        data.putString("from", from);

        Intent intent = new Intent();
        intent.putExtras(data);
        intent.setAction("com.google.android.c2dm.intent.RECEIVE");
        intent.setComponent(new ComponentName(getPackageName(), "io.smooch.core.GcmService"));

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

编辑

从Smooch 3.2.0版开始,您现在可以通过在onMessageReceived中调用 GcmService.triggerSmoochGcm 来更轻松地触发Smooch的通知。
@Override
public void onMessageReceived(String from, Bundle data) {
    final String smoochNotification = data.getString("smoochNotification");

    if (smoochNotification != null && smoochNotification.equals("true")) {
        GcmService.triggerSmoochGcm(data, this);
    }
}

10-04 19:06