Android 为后台服务从C2DM迁移到GCM

Android 为后台服务从C2DM迁移到GCM,android,google-cloud-messaging,android-c2dm,Android,Google Cloud Messaging,Android C2dm,我的应用程序中有一个bacground服务,目前使用的是C2DM。我想迁移到GCM 我可以使用2种GCM实现 1:使用gcm.jar并用发件人ID替换C2DM电子邮件地址 2:使用Google Play服务和Google CloudMessaging类注册GCM 上面的选项1提供了从C2DM到GCM的最简单迁移路径,但是,GCM.jar已被弃用。因此,我将使用GCM.jar从一个不推荐的推送机制C2DM转移到另一个GCM 选项2要求您在注册GCM之前检查设备上的GooglePlayService

我的应用程序中有一个bacground服务,目前使用的是C2DM。我想迁移到GCM

我可以使用2种GCM实现

1:使用gcm.jar并用发件人ID替换C2DM电子邮件地址

2:使用Google Play服务和Google CloudMessaging类注册GCM

上面的选项1提供了从C2DM到GCM的最简单迁移路径,但是,GCM.jar已被弃用。因此,我将使用GCM.jar从一个不推荐的推送机制C2DM转移到另一个GCM

选项2要求您在注册GCM之前检查设备上的GooglePlayServices是否最新。您可以通过调用GooglePlayServicesUtil.getErrorDialog api使Google Play服务准备好使用。但是,我不能从后台服务调用此api,因为它可能会导致向用户显示屏幕,这是您不应该从后台服务执行的操作

目前,我的Android客户端中有使用Google Play服务的C2DM和GCM。我更愿意让GCM处于活动状态,并放弃C2DM,但是如果Google Play服务还没有准备好在设备上使用,那么我就不能使用GCM。现在我可能会遇到这样一种情况:我的后台服务没有注册GCM,如果它继续使用C2DM,它就会注册GCM

问题:

1:谷歌推荐的后台服务C2DM->GCM的迁移路径是什么。我是否应该使用gcm.jar方法,即使它已被弃用

2:如果设备上目前没有Google Play服务,您是否应该退回到使用C2DM,而不是调用GooglePlayServicesUtil.getErrorDialog

3:让C2DM和GCM在我的客户中都处于活动状态是不令人满意的。当我使用GoogleCloudMessaging.registersenderId注册GCM时,会广播一条com.google.android.c2dm.intent.REGISTRATION消息,该消息会从我的c2dm接收器中拾取。我无法判断该消息是C2DM注册消息还是GCM注册消息。有没有办法区分这两条注册信息?我知道GoogleCloudMessaging.register返回注册Id,但它也会导致com.google.android.c2dm.intent.registration消息被广播,这似乎是不必要的,并且会混淆真正的c2dm接收器

我欢迎你对我的问题提出建议/见解。关于Google 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。你不必这么做。例如,如果您有错误,则可以从您的服务向主活动发送一条消息,指示用户尝试更新其版本。

谢谢您的回复。这个迁移示例是使用GCM.jar而不是Google Play服务迁移到GCM的。我知道我可以在我的后台服务中使用这种形式的GCM,但它已被弃用。我想知道如何转到Google Play服务。也许我不能100%从后台服务使用Google Play服务,因为我不能通过调用getErrorDialog引导用户启用它。我没有在服务器上使用gcm.jar。我在PHP中使用带有Curl的原始HTTP请求。HTTP协议非常简单。