我正在编写一个与Smooch和Carnival集成的应用程序。这两个库都使用定义GCM Intent Service来接收消息的标准方法接收GCM推送消息。
当我只使用Smooch时,一切都很棒。当我只使用嘉年华时,一切都很棒。当我尝试使用两者时,问题就出现了。我发现GCM接收器只是启动定义了intent com.google.android.c2dm.intent.RECEIVE
的清单中列出的第一个服务。
事实上,我发现我的build.gradle
中列出的库的顺序会影响它们的清单合并到应用程序清单中的顺序。所以,如果我把smooch放在第一位,那就有效(但狂欢节没有收到任何东西)。如果我把嘉年华放在第一位,那就有效(但是Smooch从来没有收到任何东西)。
当我不控制任何一个时,如何处理多个GCM意图服务?通常,应用程序应如何定义和管理多个GCM意图服务?
答案 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);
}
}