Google建议使用GcmListenerService代替GcmBroadcastReceiver。
正在制作使用GCM的图书馆项目(com.android.library插件)。当应用程序项目(com.android.application插件)不使用GCM时它很适用。
当应用程序项目使用GCM时,库项目接收器不会被调用!
库模块定义了GCM权限和接收器&其中的服务条目清单。应用模块已在其自己的清单中定义了它的服务条目。
使用GcmBroadcastReceiver,这可能是可能的,因为它是广播。在这里看到了很多相同的问题。由于弃用,不想使用GcmBroadcastReceiver。
有没有办法让这项工作?
编辑:将调用哪个服务取决于它在合并清单xml中定义的顺序。如果我撤销订单,则会调用其他服务!有没有办法打电话给两个服务?
答案 0 :(得分:4)
@morepork已经正确回答了这个问题。我只是回答这个问题来添加代码段。
这肯定不是完美的解决方案,但目前我没有找到任何更好的解决方案。
这就是我的代码的样子:
@Override
public void onMessageReceived(String from, Bundle data) {
if(!"MY_SENDER_ID".equals(from)) {
data.putString("from", from);
Intent intent = new Intent();
intent.putExtras(data);
intent.setAction("com.google.android.c2dm.intent.RECEIVE");
intent.setComponent(new ComponentName(getPackageName(), "my.application.packageId.MyGcmListenerService"));
GcmReceiver.startWakefulService(getApplicationContext(), intent);
}
需要确保启动合并清单中定义的所有服务侦听器,并且此侦听器具有最高优先级。我知道有点约束。
编辑:刚刚反编译了com.google.android.gms.gcm.GcmReceiver类,它没有做比以前的GcmBroadcastReceiver更好的事情。只需处理令牌刷新额外。 因此,只有在需要多次回调时才使用GcmBroadcastReceiver会更好。
答案 1 :(得分:1)
最好的解决方案是只有一个GcmListenerService实现,并为此处理消息。
如果你真的想要有两个实现,那么通过增加它的优先级(see here)来使其成为主要实现。然后,您可以让该服务通过创建数据意图,显式设置组件,然后启动其他服务来调用第二个服务。