Android 在一个应用程序中使用2个或多个GCM Intent服务

Android 在一个应用程序中使用2个或多个GCM Intent服务,android,android-intent,google-cloud-messaging,smooch,Android,Android Intent,Google Cloud Messaging,Smooch,我正在编写一个与和集成的应用程序。这两个库都使用定义GCM意图服务以接收消息的标准方法来接收GCM推送消息 当我只用亲吻时,一切都很好。当我只使用狂欢节时,一切都很好。当我尝试同时使用这两种方法时,问题就出现了。我发现GCM接收器只需启动清单中列出的第一个服务,该清单定义了intentcom.google.android.c2dm.intent.RECEIVE 事实上,我发现库在我的build.gradle中列出的顺序会影响它们的清单合并到应用程序清单中的顺序。所以,如果我把亲吻放在第一位,它会

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

当我只用亲吻时,一切都很好。当我只使用狂欢节时,一切都很好。当我尝试同时使用这两种方法时,问题就出现了。我发现GCM接收器只需启动清单中列出的第一个服务,该清单定义了intent
com.google.android.c2dm.intent.RECEIVE

事实上,我发现库在我的
build.gradle
中列出的顺序会影响它们的清单合并到应用程序清单中的顺序。所以,如果我把亲吻放在第一位,它会起作用(但狂欢节不会收到任何东西)。如果我把狂欢节放在第一位,它就会起作用(但“亲吻”永远不会收到任何东西)


当我不能控制任何一个GCM意图服务时,如何处理多个GCM意图服务?一般来说,应用程序应该如何定义和管理多个GCM意向服务?

您将两者都用作渐变依赖项?您必须下载这两个库并将它们用作模块,它们可能使用相同的服务,如果您下载它们,您可以更改服务名称并解决任何可能将两者关联的问题


我的猜测是,您可能必须使用您的应用程序模块创建GCM广播接收器(即使它调用libs服务)。

您无法在嘉年华和Smooch中获得推送服务的原因是,这两个库都注册了自己的GcmListenerService,在Android中,清单中定义的第一个GcmListenerService将接收所有GCM消息

我为您提供了一个主要基于以下SO文章的解决方案:

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

要指定您自己的GcmListenerService,请按照中的说明进行操作

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

要执行此操作,只需在初始化Smooch时调用
setGoogleCloudMessaginAutoRegistrationEnabled

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

从Smooch 3.2.0版开始,您现在可以通过调用onMessageReceived更轻松地触发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);
    }
}

对不起,我不明白你的答案。服务名称不是问题所在-它们都有唯一的名称。我已经考虑过定义自己的服务来给另外两个打电话,但它似乎充满了问题。谢谢,很高兴看到Smooch提供了这样做的能力。不幸的是,我确信嘉年华不会。但是,我应该能够使用相同的方法,对每个服务调用两次
startWakefulService
,并确保在清单中首先列出我的中继意图服务。将尝试此操作并在此处更新。此操作有效。我实际上不需要禁用GCM注册,而是自己做,因为我对这两个服务使用相同的发送者ID和API密钥。我还可以使用smoochNotification标志将消息发送到正确的位置,而不仅仅是盲目地将消息发送到两者。所以,一切都很好。。。谢谢
@Override
public void onMessageReceived(String from, Bundle data) {
    final String smoochNotification = data.getString("smoochNotification");

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