Android GCM生命周期混乱,希望始终注册

Android GCM生命周期混乱,希望始终注册,android,google-cloud-messaging,Android,Google Cloud Messaging,我让GCM完全正常工作。我的问题是,当我使用android BACK键退出我的应用程序时,我看到调用了onDestroy(),为了避免泄漏,我为gcm注销了接收器,因此调用了onUnregister()。但我希望能够在通电时注册一次gcm(启动完成?),然后能够随时收到通知。我知道我仍然需要处理谷歌可能刷新注册表的时间。但我不清楚是否需要创建一个新服务来在其onCreate()中注册gcm?现在,我在主活动的onCreate()中注册gcm 谢谢你的帮助 贾斯汀(Justin)不看你的代码,这有

我让GCM完全正常工作。我的问题是,当我使用android BACK键退出我的应用程序时,我看到调用了onDestroy(),为了避免泄漏,我为gcm注销了接收器,因此调用了onUnregister()。但我希望能够在通电时注册一次gcm(启动完成?),然后能够随时收到通知。我知道我仍然需要处理谷歌可能刷新注册表的时间。但我不清楚是否需要创建一个新服务来在其onCreate()中注册gcm?现在,我在主活动的onCreate()中注册gcm

谢谢你的帮助


贾斯汀(Justin)

不看你的代码,这有点难说,但你不应该每次离开应用程序时都从GCM注销。典型的GCM应用程序生命周期(如果您使用的是GCM jar)如下所示:

  • 应用程序启动并检查它是否具有GCM注册ID(这意味着它已向GCM注册),然后检查它是否已向您的服务器注册
  • 如果它有一个registrationID,但没有向您的服务器注册,它会尝试这样做
  • 如果它没有注册ID,它将尝试向GCM注册,然后当它获得注册ID时,它将尝试向您的服务器注册
  • 当GCM关闭取消接收通知的首选项时,第4个可能会从GCM中取消注册

    看看谷歌的客户示例演示活动:


    请注意,它们不会从GCM注销。如果您按照他们的示例操作,则在设备通电后,您将收到通知,而无需自己执行任何其他操作。

    好的,谢谢。我再次开始查看演示客户端代码。我将努力更新代码以使用gcmregistar()。我已经做了所有我认为在那之前是可行的?因此,根据这些代码,如果你的应用程序被完全销毁,然后再次调用onCreate(),调用函数gcmregistar.getRegistrationId()将有希望告诉你它是否太长了,GCM不再知道你手机的注册情况。因此,我重构了我的应用程序以快速使用gcmregistar,它还抱怨了我第一次出口的GCM广播接收器漏水。但此后,它再也没有抱怨过。而且它肯定是注册的。所以我想这一切都很好,但我仍然需要玩一玩,以确保我没有错过什么。我在这里()看到了另一个线程,因此我从我的主要活动的onDestroy()中添加了gcmregistar.onDestroy()调用,但它仍然没有调用unregister。是的,这就是方法。如果您得到一个空白注册ID,那么ti是时候再次向GCM注册了。这同样适用于确定您是否仍在服务器上注册。就泄漏而言,我相信我已切换到使用应用程序上下文来避免泄漏。关于出口上广播接收器泄漏的警告是因为您的活动已注册为接收广播(这是广播,而不是GCM消息!)一旦活动被破坏,它将无法再接收广播,因此从广播中取消注册是正确的。服务的职责是接收来自GCM服务器的消息,即使在应用程序退出后,GCM服务器仍然存在并运行。收到消息后,它会显示通知并发送广播(如果活动正在运行,它将接收广播并执行某些操作)。好的一点是,如果您使用广播接收器在GCM服务和您的活动之间进行通信,那么您需要在活动被销毁之前取消注册。希望我没有增加混乱,谢谢你的评论。