我正在编写一个与Smooch和Carnival集成的应用程序。这两个库都使用定义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);
}
}