我正在使用GCM進行應用程序通知,如圖所示here。該代碼是樣板:如何讓GCM與應用和服務器保持同步?
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.v(TAG, "Already registered");
}
然後onRegistered()
回調更新我的服務器返回的註冊ID。
但是,有幾次GCM進入了不一致的狀態。在一種情況下,即使GCMRegistrar.getRegistrationId()
給我一個非空的註冊ID字符串,它也不會轉發任何通知。在其他情況下,我最終得到兩個或更多重複的消息。
在試圖避免這些情況,我現在有一個蠻力解決方案,它的工作原理是這樣的:
if (GCMRegistrar.isRegistered(this))
GCMRegistrar.unregister(this);
else
GCMRegistrar.register(this, GCMConstants.SENDER_ID);
在onUnregistered()回調,我告訴我的服務器上刪除的註冊ID,然後調用GCMRegistrar.register()
。在onRegistered()
回調中,我告訴我的服務器添加註冊標識。
到目前爲止,它工作正常,但效率明顯低於應用程序的效率,而且我不確定它是否不受不一致問題的影響。如果我可以指望getRegistrationId()
總是返回一個有效的id,即當前/規範的註冊id,會更好。
確保我的應用程序,我的服務器和GCM之間一致性的最簡單/最乾淨的方法是什麼?謝謝。
感謝您的回覆 - 快速跟進。 getRegistrationId()函數的用途/有效性是什麼?我不清楚它從哪裏獲得註冊ID;它似乎是一個同步調用,所以我想它不是直接來自GCM。我的一個問題是它偶爾會返回一個陳舊的標記(?)。我說得對,你的解決方案沒有必要嗎? – gcl1 2013-03-21 16:52:03
還有一個問題。是否可以多次調用GCM的'register()'?如果它返回一個不同的reg ID,那麼舊的會發生什麼? – gcl1 2013-03-21 17:03:23
我從不使用'getRegistrationId()',所以我不能說。在「註冊」和「取消註冊」後嘗試調用該方法會很有趣。我想知道它是否仍然會返回舊的ID。也許它只在第一次註冊之前返回null。我認爲多次調用'register'應該是安全的。如果它返回一個不同的註冊ID,那麼舊註冊ID仍然可以工作,但是當你使用舊註冊ID發送一個通知時,你會得到新的註冊ID作爲規範註冊ID的響應。但是,一旦你得到一個新的,你應該從你的數據庫中刪除舊的。 – Eran 2013-03-21 17:11:52