Android 如果应用程序从不更新且InstanceID提供程序从不启动刷新,GCM注册令牌是否保持不变

Android 如果应用程序从不更新且InstanceID提供程序从不启动刷新,GCM注册令牌是否保持不变,android,google-cloud-messaging,Android,Google Cloud Messaging,我正在我的应用程序中使用服务。我试过这个方法,效果很好。但是有一件事让我很困惑 函数onHandleIntent(Intent-Intent)中的示例代码有几行代码来获取令牌,然后使用is订阅主题 InstanceID instanceID = InstanceID.getInstance(this); String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), Googl

我正在我的应用程序中使用服务。我试过这个方法,效果很好。但是有一件事让我很困惑

函数
onHandleIntent(Intent-Intent)
中的示例代码有几行代码来获取令牌,然后使用is订阅主题

InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
我知道系统可能会通过读取示例代码来启动令牌刷新,然后我必须通过回调函数
onTokenRefresh()
通知服务器

我发现当我点击通知打开应用程序时,总是调用函数
onHandleIntent(Intent)
,因此,注册令牌将再次生成。我的问题是,我可以在
onTokenRefresh()
确定是否需要更新服务器并重新订阅主题时将其设置为平面。但是,我可以安全地假设令牌永远不会从应用程序启动时更改吗?

“如果应用程序从不更新,InstanceID提供程序从不启动刷新,GCM注册令牌是否保持不变?”

简而言之,答案是肯定的。它永远不会改变。如果它在令牌上执行,则将调用刷新。至于谷歌的示例代码,它少了一些你必须自己填写的重要部分。第一个问题是,
registrationtentservice
不会检查设备是否已注册。您应该将此信息保存在共享首选项中

如果设备已注册,则不需要此位代码:

InstanceID instanceID = InstanceID.getInstance(this);
String token =     instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

现在的问题是,如果您反复调用并执行此代码,会发生什么?我对此进行了实验,发现有些设备一次又一次地提供相同的令牌,但其他设备返回不同的令牌。

这就是我的问题所在,每次我点击通知打开应用程序时,都会执行引用的代码。在我的实验中,代币似乎保持不变。但如果情况不同,那么我必须通知服务器并重新订阅。正如您所提到的,令牌在某些设备上是不同的。在这种情况下,每次执行时,我都必须将当前标记保存到某个位置,并与新标记进行比较。您的意图肯定有问题吗?此代码在每个应用程序生命周期中只能执行一次。无论如何,在您已经注册的共享首选项中保存一个标志应该可以避免问题。我还没有看到问题,因为令牌在我的设备上保持不变。但你说它在其他一些设备上会有不同的价值,这让我在发布后感到担心。如果我从主页点击图标打开应用程序,是的,代码将不会执行。它发生在从通知打开它时。我可以在函数中设置标志,但我也想知道如果更改是从
getToken()
启动的,是否有更好的方法。我想问的是,为什么不添加4行代码来检查是否已注册并跳过注册?当然,这很容易做到。让我更清楚地说,当1)
onTokenRrfresh()
被调用时,可能会发生不同的令牌;2)
getToken()
被执行时。场景1是肯定的,因为它是由Android系统启动的,我可以在这里设置标志。场景2是随机发生的(我到目前为止的理解),所以我必须在某个地方记住当前值,并在每次执行时进行比较。在您的实验中,您是否看到当场景2发生时总是调用
onTokenRrfresh()
(这意味着只有场景1存在)?如果是这样的话,我可以简单地依靠
onTokenRrfresh()
来设置标志。您好,我们真的需要在触发onTokenRefresh()后重新订阅所有主题吗,或者GCM服务器会自动这么做?