2012-07-16 40 views
156

Google如何實現其推送通知功能?它是通過在後臺運行的服務進行輪詢還是以不同的方式運行?推送通知技術如何在Android上運行?

+13

聽起來像是一個真正的問題給我。我想知道它的答案,Google把我帶到了這裏。又一個質量問題關閉了。 – 2013-12-10 13:05:27

+1

我也想知道這一點,並計劃寫一個問題,但有這個問題,所以這絕對是一個很好的問題。 – PSIXO 2014-05-06 10:07:36

回答

126

從以色列的Android開發會議期間我聽到什麼:

有一個簡單的TCP套接字雲谷歌服務器上accept mode等待。 TCP連接已由Google Play應用程序啓動。這就是爲什麼必須在設備上安裝Google Play才能使Google Cloud Messaging (GCM)(以前的Android Cloud到設備消息傳遞服務 - C2DM)能夠正常工作的原因。

當這個TCP客戶端套接字收到一些消息時,該消息包含諸如它應該發往的應用程序的包名稱等信息 - 數據本身。這些數據將被解析並打包到廣播並最終由應用程序接收的intent中。

即使設備的無線電狀態變爲「空閒」模式,TCP套接字也保持打開狀態。應用程序不必跑來接收意圖。在http://developer.android.com/google/gcm/gcm.html

+1

但我認爲它也適用於仿真器。 我想到的事情是設備使用當前路徑(IP)更新服務器。當谷歌服務器需要發送通知時,它會將當前路徑和轉發消息發送到該路徑。我在某種程度上是否正確? – 2012-07-16 17:02:22

+2

@Khawar Raza:當設備的IP由於某種原因而改變時,設備將從服務器斷開連接。當它發生時 - 新的連接取而代之,取決於設備的新IP。 – 2012-07-16 17:06:37

+1

@Khawar Raza:即使沒有谷歌遊戲,模擬器也能正常工作。我想它啓動內置的內置套接字,而不是谷歌播放 – 2012-07-16 17:11:29

0

是的,你是對的。谷歌有一項服務(GTalk服務),這項服務在一段時間內詢問Google服務器。

+0

gtalkservice服務是否仍然存在並正在運行? – 2012-07-16 17:03:07

+0

我不知道。我剛剛閱讀了C2DM如何工作。現在可以改變。 – Yury 2012-07-16 18:39:33

7

更多信息,您可以實現與長輪詢tcp連接自己的android推送通知。 但是,這將涉及維持一個額外的插座=>電池耗盡。 或者您可以使用Alarm Manager定期打開連接。

Google可能會爲所有C2DM推送通知打開一個套接字,因此其電池使用效率更高。

120

Android保持與Google服務器的一個活動連接,但不會消耗太多的電量或數據,因爲只有在某些內容向您的手機上的應用發送GCM消息之前,纔會發送流量。手機上只有一個連接,由所有應用程序使用:安裝使用GCM的新應用程序不會增加任何額外負載。

GCM的第一步是第三方服務器(例如電子郵件服務器)向Google的GCM服務器發送請求。然後,該服務器通過該打開的連接將消息發送到您的設備。 Android系統會查看該消息以確定該應用的用途,然後啓動該應用。該應用程序必須向Android註冊才能使用GCM,並且必須具有相關權限。當應用程序啓動時,它可能會立即使用消息中的數據創建通知。 GCM消息的大小非常有限,因此該應用可能會打開與第三方服務器的正常連接以獲取更多信息(例如,下載新電子郵件的標頭)。

使用推送通知的優勢在於,應用程序不必定期運行以檢查新數據,同時節省電力和數據。擁有像GCM這樣的集中式機制的好處是設備只需要一個開放的網絡連接,而Android GCM系統是唯一需要繼續運行的事情,而不是每個應用都必須在後臺保持運行以保持自己的網絡連接到它自己的服務器。

接收來自:Source 另請參閱here

+1

只是關於GCM連接的評論。該單一連接是輪詢連接。 – wmac 2015-08-13 02:09:10

+1

對我來說,至關重要的是第三方服務器,例如電子郵件服務器確實會向Google GCM服務器發送通知消息。這是Google免費提供的服務,任何此類第三方必須使用其GCN協議與Google服務器實施溝通渠道。順便說一句,該協議幾乎只是一個JSON格式的HTTP響應。有關詳細信息,請參閱https://developers.google.com/cloud-messaging/。 – 2016-08-01 14:41:15