我正在使用 GCM 进行应用通知,如图所示 here .代码是样板文件:
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 之间的一致性的最简单/最干净的方法是什么?谢谢。
最佳答案
如果您解析从 Google 获得的响应,并确定您在响应中收到规范注册 ID 的情况,则可以解决获取重复消息的问题。在这种情况下,您可以删除旧的注册 ID,并保留规范的 ID。
我认为比暴力解决方案更好的解决方案是在应用启动时始终调用 register
。您可能会在 onRegistered()
中收到与上次调用时相同的注册 ID,但如果您在设备中保留该注册 ID,则可以将保留的 ID 与接收到的 ID 进行比较,避免重新注册如果注册 ID 未更改,则将其发送到您的服务器。
关于android - 如何使 GCM 与应用程序和服务器保持同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552316/