我的应用程序中有一个bacground服务,目前使用C2DM。我想迁移到GCM。
我可以使用2种GCM实现
1:使用gcm.jar并将C2DM电子邮件地址替换为发件人ID
2:使用Google Play服务和GoogleCloudMessaging课程注册GCM
上面的选项1提供了从C2DM到GCM的最简单的迁移路径,但是,不推荐使用gcm.jar。所以我将从一个不推荐的推送机制(C2DM)转移到另一个(使用gcm.jar的GCM)
选项2,要求您在注册GCM之前检查设备上的GooglePlayServices是否是最新的。您可以通过调用GooglePlayServicesUtil.getErrorDialog()api使Google Play服务可供使用。但是,我无法从后台服务中调用此api,因为它可能会导致向用户显示屏幕,这是您不应该从后台服务中执行的操作。
目前,我的Android客户端中有C2DM和GCM(使用Google Play服务)。我希望只有GCM处于活动状态,并放弃C2DM,但如果Google Play服务尚未准备好在设备上使用,那么我就无法使用GCM。现在我的情况可能是我的后台服务没有为GCM注册,如果它继续使用C2DM,它就会被注册。
问题:
1:谷歌推荐的C2DM-> GCM迁移路径是什么用于后台服务。我应该使用gcm.jar方法,即使它被弃用了吗?
2:如果设备上目前没有Google Play服务,您是否应该回归使用C2DM,而不是调用GooglePlayServicesUtil.getErrorDialog()?
3:在我的客户端同时激活C2DM和GCM并不令人满意。当我使用GoogleCloudMessaging.register(senderId)注册GCM时,会播放com.google.android.c2dm.intent.REGISTRATION消息,该消息将被我的C2DM接收器接收。我无法判断该消息是C2DM注册消息还是GCM注册消息。有没有办法区分2个注册消息?我知道GoogleCloudMessaging.register()会返回注册ID,但它也会导致广播com.google.android.c2dm.intent.REGISTRATION消息,这似乎是不必要的,并且会混淆真正的C2DM接收器。
我欢迎您对我的问题提出建议/见解。有关Google Play服务的文档似乎有点轻松,并未解决其在后台服务中的使用问题。
亲切的问候
答案 0 :(得分:0)
不确定推荐的迁移路径是什么,但这里有一个对我有用的路径:Registration confusion Android GCM
答案 1 :(得分:0)
文档中示例的代码应足以检查Play服务:
private boolean checkPlayServices() {
int resultCode = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
GooglePlayServicesUtil.getErrorDialog(resultCode, this,
PLAY_SERVICES_RESOLUTION_REQUEST).show();
} else {
Log.i(GCMTAG, "This device is not supported.");
finish();
}
return false;
}
return true;
}
仅当结果不是ConnectionResult.SUCCESS时才适合调用方法GooglePlayServicesUtil.getErrorDialog()。你不必这样做。如果您有错误,那么可以,例如,从您的服务向主要活动发送一条消息,指示用户尝试更新其版本。