我正在将 GCM 用于应用程序通知,如此处所示。代码是样板:
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.v(TAG, "Already registered");
}
然后onRegistered()
回调使用返回的注册 ID 更新我的服务器。
但是,GCM 曾多次进入不一致的状态。在一种情况下,即使GCMRegistrar.getRegistrationId()
给了我一个非空的注册 ID 字符串,它也不会转发任何通知。在其他情况下,我最终会收到两条或更多条重复消息。
为了避免这些情况,我目前有一个像这样工作的蛮力解决方案:
if (GCMRegistrar.isRegistered(this))
GCMRegistrar.unregister(this);
else
GCMRegistrar.register(this, GCMConstants.SENDER_ID);
在 onUnregistered() 回调中,我告诉我的服务器删除注册 id,然后调用GCMRegistrar.register()
. 在onRegistered()
回调中,我告诉我的服务器添加注册 ID。
到目前为止,它正在工作,但显然它的效率低于它应该工作的方式,而且我不确定它是否不受不一致问题的影响。如果我能指望getRegistrationId()
总是返回一个有效的 id,即当前/规范的注册 id,那就更好了。
确保我的应用程序、我的服务器和 GCM 之间的一致性的最简单/最干净的方法是什么? 谢谢。