Android 开发网站上 GCM 示例中的客户端代码默认为gcm.register(SENDER_ID);
每 7 天后调用一次,方法是使用以下函数检查注册是否过期:
public static final long REGISTRATION_EXPIRY_TIME_MS = 1000 * 3600 * 24 * 7;
/**
* Checks if the registration has expired.
*
* To avoid the scenario where the device sends the registration to the
* server but the server loses it, the app developer may choose to re-register
* after REGISTRATION_EXPIRY_TIME_MS.
*
* @return true if the registration has expired.
*/
private boolean isRegistrationExpired() {
final SharedPreferences prefs = getGCMPreferences(context);
// checks if the information is not stale
long expirationTime =
prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);
return System.currentTimeMillis() > expirationTime;
}
该函数上面的注释暗示这是为了“避免设备向服务器发送注册但服务器丢失它的情况。这是否暗示我们的服务器(不是GCM服务器)可能会丢失注册id?或者是这是因为注册 ID 在 GCM 方面可能会变得无效吗?根据GCM 高级主题页面中的以下段落,这似乎是可能的:
同样,备份应用程序时不应保存注册 ID。这是因为注册 ID 可能在应用程序恢复时失效,这会使应用程序处于无效状态(即应用程序认为它已注册,但服务器和 CM 不再存储该注册 ID —因此应用程序不会收到更多消息)。
先感谢您!