2013-03-06 128 views
35

我一直在對使用持久套接字的Android設備的自定義推送通知解決方案進行一些測試。我想分享我的發現並驗證結果。Android持久套接字連接規則

簡單說明
的應用程序運行的前景服務並建立與服務器的連接,並認爲通過積極的爆震連接(@ 10秒間隔)。如果連接被檢測爲死亡,應用會一直嘗試無限期地重新連接。服務器通過雙工通道發送通知。

測試1:

Pinging is done using a timer at 10 second intervals. 
Server sends notification every minute. 
Applications acquires wifi and wake locks. 
Duration : 8 hours 
Battery loss : ~14% 

試驗2:

Pinging is done using AlarmManager at 10 second intervals. 
Server sends notification every minute. 
Application acquires only a wifilock 
Duration : 8 hours 
Battery loss : ~7% 

假設:傳入的網絡分組自動喚醒CPU,因此,不需要喚醒鎖。使用AlarmManager來ping(而不是定時器)意味着我們不需要喚醒鎖。

刪除那個喚醒鎖確實有助於電池。令人驚訝的是,任何一種解決方案的攻擊性ping都不會像我預期的那樣影響電池壽命。 (我們進行了許多其他測試,其中包括應用程序剛剛安裝了wifilock,並且在同一時間段內沒有任何操作導致電池損耗大約爲4%至5%)

由於應用程序能夠成功發送所有ping請求,接收所有傳入的消息,我相信我的假設是正確的。但我很想得到任何專家的確認。

還有一個問題: 如果應用程序是要監聽傳入連接。在這種情況下,我需要保持一個喚醒鎖,對嗎?傳入的連接不會喚醒CPU?我們不會走這條路,但只是想確認一下。

另外,請不要推薦GCM,它已被公司政策排除。

謝謝。

+0

爲什麼你讓移動平安,如果你有套接字連接?爲什麼不僅讓服務器發送信息,實際上有什麼話要說,有時候還可能有心跳來保存它。 – 2013-10-03 07:40:13

+1

在我們的例子中,連接可以在幾個開關之間。我們需要儘快確定無效連接。因此,對於移動客戶端的每次ping,服務器都必須作出響應。它保護我們免受無聲斷線。 – Alex 2013-10-07 14:43:09

+0

我確定在這裏有一個很好的問題,但我無法找到它目前的形式如果你仍然在尋找答案,你可以考慮編輯一個更具針對性的問題。 JMHO :-) – Chilledrat 2013-10-16 08:42:16

回答

12

既然對這個問題有一些興趣並且沒有確認,我現在就回復。測試完成已經有一段時間了,生產級解決方案已經創建並經過嚴格測試。刪除喚醒鎖仍然有助於電池,並且沒有發現其他問題,例如缺少ping請求或傳入通知,因此這是我在上述假設下收到的唯一驗證。

其他注意事項:

  • 在廣播接收器爲爆震報警的onReceive方法,如果你不是直接在插座上調用(產生一個新的線程或意圖),你會需要保持喚醒鎖,直到ping請求完成。 Android僅保留一個喚醒鎖,直到OnReceive返回,之後纔有可能(但很少)CPU在ping完成之前休眠。

  • 如果通知是敏感的,則使用High Performance Wifi Lock

  • 還有一個其他設備特定問題影響解決方案,它涵蓋了here

更新

跑進了以下問題與Android 5.1:2

Android Issue

更新需要圍繞打盹模式代碼爲Android 6.0:Doze Mode

+0

我知道這是一個老問題,不過:您是否獲得了傳入數據包的WakeLock來處理這些數據?或者換句話說,設備在從網絡中喚醒後有多長時間活動? – JavaJens 2014-04-30 15:04:32

+1

是的,雖然您將收到傳入數據包而無需持有喚醒鎖,但您仍應在收到傳入數據時創建喚醒鎖。否則,您可能無法在設備進入睡眠狀態之前完成數據處理。多長時間的部分,根據設備不同而不同。喜歡這種碎片。 – Alex 2014-04-30 18:02:19