使用 GcmListenerService 的多个 GCM 侦听器
Multiple GCM listeners using GcmListenerService
Google 建议使用 GcmListenerService 代替 GcmBroadcastReceiver。
正在制作一个使用 GCM 的库项目(com.android.library 插件)。当应用程序项目(com.android.application 插件)不使用 GCM 时,它运行良好。
当应用程序项目自己使用 GCM 时,不会调用库项目接收器!
库模块已在其清单中定义了 GCM 权限以及接收方和服务条目。应用程序模块已在其自己的清单中定义其服务条目。
有了 GcmBroadcastReceiver,这是可能的,因为它是一个广播。在这里看到了很多相同的问题。由于弃用,不想使用 GcmBroadcastReceiver。
有什么方法可以实现吗?
编辑: 将调用哪个服务取决于它在合并清单中定义的顺序 xml。如果我颠倒顺序,就会调用另一个服务!有什么方法可以调用这两种服务吗?
最好的解决方案是只有一个 GcmListenerService 实现,并让它为两者处理消息。
如果您真的想要两个实现,请通过提高其优先级使其中一个成为主要实现 (see here)。然后,您可以通过使用数据创建意图、显式设置组件,然后启动另一个服务,让该服务调用第二个服务。
@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 class,它并没有比以前的 GcmBroadcastReceiver 做得更好。只是额外处理令牌刷新。 所以GcmBroadcastReceiver最好只在需要多个回调的时候使用
Google 建议使用 GcmListenerService 代替 GcmBroadcastReceiver。
正在制作一个使用 GCM 的库项目(com.android.library 插件)。当应用程序项目(com.android.application 插件)不使用 GCM 时,它运行良好。
当应用程序项目自己使用 GCM 时,不会调用库项目接收器!
库模块已在其清单中定义了 GCM 权限以及接收方和服务条目。应用程序模块已在其自己的清单中定义其服务条目。
有了 GcmBroadcastReceiver,这是可能的,因为它是一个广播。在这里看到了很多相同的问题。由于弃用,不想使用 GcmBroadcastReceiver。
有什么方法可以实现吗?
编辑: 将调用哪个服务取决于它在合并清单中定义的顺序 xml。如果我颠倒顺序,就会调用另一个服务!有什么方法可以调用这两种服务吗?
最好的解决方案是只有一个 GcmListenerService 实现,并让它为两者处理消息。
如果您真的想要两个实现,请通过提高其优先级使其中一个成为主要实现 (see here)。然后,您可以通过使用数据创建意图、显式设置组件,然后启动另一个服务,让该服务调用第二个服务。
@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 class,它并没有比以前的 GcmBroadcastReceiver 做得更好。只是额外处理令牌刷新。 所以GcmBroadcastReceiver最好只在需要多个回调的时候使用