从C2DM迁移到GCM以获取后台服务

时间:2013-11-21 15:50:43

标签: android google-cloud-messaging android-c2dm

我的应用程序中有一个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服务的文档似乎有点轻松,并未解决其在后台服务中的使用问题。

亲切的问候

2 个答案:

答案 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()。你不必这样做。如果您有错误,那么可以,例如,从您的服务向主要活动发送一条消息,指示用户尝试更新其版本。