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

时间:2016-04-11 00:38:57

标签: android android-intent google-cloud-messaging smooch

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

当我只使用Smooch时,一切都很棒。当我只使用嘉年华时,一切都很棒。当我尝试使用两者时,问题就出现了。我发现GCM接收器只是启动定义了intent com.google.android.c2dm.intent.RECEIVE的清单中列出的第一个服务。

事实上,我发现我的build.gradle中列出的库的顺序会影响它们的清单合并到应用程序清单中的顺序。所以,如果我把smooch放在第一位,那就有效(但狂欢节没有收到任何东西)。如果我把嘉年华放在第一位,那就有效(但是Smooch从来没有收到任何东西)。

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

1 个答案:

答案 0 :(得分:6)

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

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

  

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

要指定您自己的GcmListenerService,请按照Google's Cloud Messaging Documentation中的说明操作。

Smooch提供了在您拥有自己的GCM注册时禁用其内部GCM所需的工具。

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

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

在您自己的GcmRegistrationIntentService中,使用您的令牌致电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);
    }
}