我认为每当我的应用程序的主要“意图”启动时,我应该请求一个注册ID。我一直在这样做,但似乎每个请求都会产生一个新的字符串,所以我最终在我的数据库中积累了许多相同设备的注册ID。我想只有其中一个有效。然而,我不想删除旧的注册ID,因为如果用户拥有多个设备,我希望他们能在多个设备上收到通知。
我该如何处理这个问题?
在您的应用程序安装在设备上之前,永远不要刷新ID
我已经实现了C2DM。如果您有一个设备的多个注册ID,则只有最新的ID才能用于发送通知。
当您将设备注册到Google服务器时,它会生成与该设备ID对应的字符串(正如您已经知道的那样)。但是,如果您再次使用同一设备进行注册,则先前的设备ID将无用。
因此,我建议最好保留设备是否已经注册的信息。如果已注册,则无需重新注册。由于您将在旧的R_ID基础上收到通知,因此只需将此R_ID发送到您的服务器以进行通知,并在数据库中保存标志以跟踪注册。
如果您在云端注册,返回的注册ID将有效,直到您收到带有“未注册”字符串额外信息的意图(仅在您的应用程序有意注销服务时才会发生),或者Google发送另一个带有新注册ID的Registration意图,此时您设置的系统应该正常工作。
如果您的服务器收到带有数据“Error=NotRegistered”的200响应,则说明注册ID已过期。在这种情况下,您应该从数据库中删除该条目。
我正在将registration_id与device_id保存在数据库中。这样,每个设备只有一个条目。此外,reg id作为共享首选项保存在设备上,以便我不必每次请求新的reg id...
但是我想知道是否有办法找出用户设备上的reg id是否过期。
有什么想法吗?是否有意图可以实现它?
设备的注册ID应该只在安装后第一次运行应用程序时从C2DM服务器请求,然后保存在数据库中(最好与设备ID一起保存,以使其唯一)。
只要C2DM不向设备发送新的注册ID或用户卸载应用程序,注册ID就有效。我假设您知道如何处理后者的情况。
回到第一个情况。在设备上应用程序的生命周期内,C2DM服务器可能会向设备发送新的注册ID[它会自行执行,您无需再次请求]。因此,您应该为此设置监听器,并可以更新数据库中该设备的注册ID。
希望对您有所帮助。