2012-12-12 26 views
2

我有GCM完全工作。我的問題是,當我用android BACK鍵退出我的應用程序時,我看到了onDestroy()調用並避免泄漏,我未註冊gcm的接收器,因此調用了onUnregister()。但是我希望能夠在開機後註冊gcm(啓動完成?),然後隨時可以收到通知。我知道當谷歌可能刷新註冊意圖時,我仍然需要處理。但我不清楚我是否需​​要在onCreate()中註冊gcm的新服務?現在我在主活動的onCreate()中註冊gcm。GCM生命週期混亂,想要永遠註冊

感謝您的任何幫助!

賈斯汀

回答

2

不看你的代碼,這是一個有點難以啓齒,但你不應該從GCM註銷每次你離開應用程序。一個典型的GCM應用程序生命週期(如果你使用的是GCM JAR)將以下內容:

  1. 應用程序啓動並檢查它是否有GCM registrationID(這意味着它與GCM註冊),然後檢查看看它是否已經註冊到你的服務器上。
  2. 如果它有一個註冊ID,但尚未註冊您的服務器,它會嘗試這樣做。
  3. 如果沒有它試圖與GCM註冊一個registrationID,然後當它獲得的registrationID它會嘗試與你的服務器

4號很可能會從GCM當他們關閉註銷登記從接收通知中取消註冊的首選項。

看看谷歌的客戶樣品DemoActivity:http://code.google.com/p/gcm/source/browse/samples/gcm-demo-client/src/com/google/android/gcm/demo/app/DemoActivity.java

注意,他們不從GCM註銷。如果你遵循他們的樣本,你將在設備啓動後收到通知,而無需自己做任何事情。

+0

好的,謝謝。我開始重新評估演示客戶端代碼。我將更新我的代碼以使用GCMRegistrar()。在我可以使用之前,我已經完成了這一切?因此,基於這些代碼,如果你的應用程序被完全摧毀,然後的onCreate()再次調用,調用函數GCMRegistrar.getRegistrationId()將有希望告訴你,如果它已經太長,GCM不知道您的手機註冊了。 – Eradicatore

+0

因此,我重構了我的應用程序以快速使用GCMRegistrar,並且在我的第一個出口上抱怨了一次GCM廣播接收器泄漏。但之後,它再也沒有抱怨過。它絕對保持註冊。所以我想這很好,但我仍然需要玩一下,以確保我不會錯過任何東西。我看到這兒的另線程(http://stackoverflow.com/questions/11299312/leaked-intentreceiver-in-google-cloud-messaging),所以我加入GCMRegistrar.onDestroy()從我的主要活動的調用的onDestroy()和它仍然沒有調用註銷。 – Eradicatore

+0

是的,就是這樣做的。如果您獲得空白的註冊ID,則需要再次註冊GCM。確定您是否仍在服務器上註冊也是如此。至於泄漏,我認爲我轉而使用應用上下文來避免這種情況。 – selsine