我在我的应用中使用Google's GCM服务。我尝试了sample code,它对我来说很好。但是注册令牌有一件事让我感到困惑。
RegistrationIntentService.java中函数onHandleIntent(Intent intent)
内的示例代码包含获取令牌的行,然后用于订阅主题
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
据我所知,系统可以通过读取示例代码MyInstanceIDListenerService.java来启动令牌刷新,然后我必须通过回调函数onTokenRefresh()
通知服务器。
当我点击通知打开应用程序时,我发现总是调用函数onHandleIntent(Intent intent)
,因此,将再次生成注册令牌。我的问题是,我可以在onTokenRefresh()
时确定是否需要更新服务器并重新订阅主题。但是我可以安全地假设令牌永远不会从应用程序启动中更改吗?
答案 0 :(得分:3)
“如果应用程序永不更新且InstanceID提供商永远不会启动刷新,GCM注册令牌是否保持不变”
简短的回答是肯定的。它永远不会改变。如果它在令牌上刷新将被调用。至于谷歌示例代码,它中缺少一些重要的部分,你必须自己填写。第一个是RegistrationIntentService
不检查设备是否已经注册。您应该将此信息保存在共享首选项中。
如果设备已经注册,则不需要这段代码:
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
现在问题出现了如果你一次又一次调用执行这段代码会发生什么?我做了实验,发现有些设备一遍又一遍地给出相同的令牌,但其他设备返回了不同的令牌。