在 Android 设备上注册/注销 GCM 消息时,我注意到一些奇怪的行为。从客户端设备的角度观察以下用例:
- 注册 GCM -分配的 ID A
- 注销
- 注册 GCM -分配ID B
如果在第 2 步之后,服务器尝试向 ID A发送消息,它将收到一个NotRegistered
错误,正如文档中所记录的和预期的那样。
但现在奇怪的是:在第 3 步之后,ID A和B都是有效 ID!这两个 ID 都会触发设备上的 Intent 接收器,从而向应用程序发送两条消息。
这种行为是预期的还是我做错了什么?
这是我的注册和注销代码,从onCreate()
我的应用程序上启动的第一个活动触发:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
unregister(getApplicationContext());
register(getApplicationContext());
}
/** Registers this device for GCM messages */
public static void register(Context context) {
GCMRegistrar.checkDevice(context);
GCMRegistrar.checkManifest(context);
String regId = GCMRegistrar.getRegistrationId(context);
if (regId.equals("")) {
GCMRegistrar.register(context, SENDER_ID);
} else {
storeRegId(regId); // Also notifies back-end
}
}
public void unregister(Context context) {
GCMRegistrar.unregister(context);
}
注意 1:我只包含了 unregister()-call 用于调试目的。我的应用程序通常保持“终身”注册状态(我也想在暂停和终止时接收 GCM 消息),但我仍然想找出这种行为的原因,因为我不确定取消注册是否是唯一的情况ID 被重新生成。如果用户卸载并重新安装应用程序怎么办?我想要一个防弹系统——我的用户永远不会收到两次相同的 GCM 消息。
注意 2:问题与此非常相似,只是我确实getApplicationContext()
按照答案建议进行了注册。