2011-05-19 46 views
22

以Gmail應用程序爲例。無論手機是否開機,它都會每10分鐘輪詢一次以下載自上次檢查以來可能已到達的新電子郵件。定期在後臺進行Android應用程序輪詢的最佳方式

我知道如何創建一個新的服務並綁定到它。但我可以看到一些方法來做到這一點:一旦

  • 綁定,並在一個無限循環的服務運行,當它這樣做睡了每個循環
  • 綁定和取消綁定右側10分鐘之間,調度不知何故下次綁定在10分鐘內
  • 使用AlarmManager類安排未來選舉

哪些權衡? Gmail應用程序如何完成它?

謝謝!

+0

Gmail不使用Android Cloud To Device?我想是這樣......但這是一個瘋狂的猜測,沒有任何具體的知識。 http://android-developers.blogspot.com/2010/05/android-cloud-to-device-messaging.html – neteinstein 2011-05-19 00:14:01

+0

@NeTeInStEiN看起來像它一樣,我被誤認爲 – 2011-05-19 00:58:56

回答

18

Gmail應用程序使用推送而不是輪詢。我建議使用這種技術,輪詢是移動設備中的電池殺手。

要實施推送,請看C2DM

如果您仍想輪詢,推薦的方法是在AlarmManager中設置週期性警報。

UPDATE:谷歌已經過時C2DM與Google Cloud Messaging (GCM)

UPDATE取代了它:谷歌已經過時GCM和替換它與 Firebase Cloud Messaging (FCM)

+2

或者,考慮將Urban Airship或Xtify視爲商業服務產品類似C2DM的解決方案。 – CommonsWare 2011-05-19 00:16:50

+0

@CommonsWare有一點要注意的是,如果每個人都實現自己的推送服務,那麼整個點就會丟失。我認爲我們應該堅持C2DM,不管我們喜歡與否。 – aromero 2011-05-19 00:23:01

+1

「有一點需要注意的是,如果每個人都實現自己的推送服務,那麼整個點就會丟失。」 - 歡迎您提出意見。 C2DM是Google Labs的一個測試版項目,因此可能缺乏一些公司希望的支持和服務級別保證。 – CommonsWare 2011-05-19 00:27:51

5
  • 對於一個連續的,但不密集的調查一樣你在評論的人(在輪詢之間的分鐘範圍內),我會用AlarmManager來實現它。這樣你就可以確保手機在不需要喚醒電話的情況下被喚醒,這會破壞你的電池。正如CommonsWare所指出的那樣,在代碼執行的時候,你仍然需要實現一個喚醒鎖,但是隻要代碼完成,你就可以釋放它,避免在等待的時候保持電話打開。有關如何實施它的示例,請參閱他的評論。

  • 如果在較短的時間段內(每次輪詢之間的秒數)需要更快的輪詢,我會使用服務,因爲設置警報對於這樣短的時間段沒有意義,並且電池無論如何都會流失。

+3

如果您要完成的工作需要大量的時間,您仍然需要一個'WakeLock',因爲警報調用的'BroadcastReceiver'在'onReceive()'中做的不多。請參閱'WakefulIntentService'以獲得'WakeLock'工作的一個包裝:https://github.com/commonsguy/cwac-wakeful – CommonsWare 2011-05-19 00:17:10

+0

@CommonsWare你是對的,但我想說的是,你不需要在做*無*時請保持電話開啓。順便說一句,這是一個很棒的演示。我會詳細研究它。 – Aleadam 2011-05-19 00:25:19

+0

哦,我完全同意 - 只是觀看時鐘刻度的永久服務是一種反模式。我只是對「無需喚醒」部分進行了一些調整,就是這樣。 – CommonsWare 2011-05-19 00:28:31

相關問題