Android之訊息推送原理

lvxiangan發表於2018-10-22

本文配套視訊

訊息推送原理

a) 傳統獲取伺服器資料使用的是pull模式,是客戶端向伺服器請求資料。從客戶端發起連線請求,獲取到伺服器資料後就關閉連線。當連線斷開後,伺服器就會失去客戶端的地址,因此無法主動向客戶端傳送訊息。

b) 推送(push)是服務主動向客戶端傳送資料。

它的原理是保持一個長連線,當客戶端和伺服器建立連線後不再斷開,這樣伺服器隨時有新訊息都可以傳送給客戶端。

長連線和短連線。所謂長連線,指在一個TCP連線上可以連續傳送多個資料包,在TCP連線保持期間,如果沒有資料包傳送,需要雙方發檢測包以維持此連線。

while(true) {
   request(timeout);
   request(timeout);
}

短連線是指通訊雙方有資料互動時,就建立一個TCP連線,資料傳送完成後,則斷開此TCP連線,即每次TCP連線只完成一對

c) 至於如何獲取推送訊息。由於服務端傳來推送訊息的時間是不確定的,這裡只能等待推送SDK的回撥,比如通過註冊監聽或者廣播接收者。不同的廠商的推送SDK可能會有不同的處理方案,以百度推送SDK來說,是通過廣播接收者獲取推送資料。


簡要說明一下openfire、smack、spark

openfire是基於XMPP協議的即時通訊的伺服器端的一個實現,你不需要編寫一行服務端的程式碼,實現一個簡單的點對點通訊或是簡單的群聊.

smack 是XMPP傳輸協議的Java實現,提供了一套API介面 可以連線服務端。一般用於快速開發手機客戶端。

spark是基於smack實現的一個XMPP即時通訊客戶端(PC端的)。
 

幾種常見的解決訊息即時獲取方案

  1. 輪詢(Pull)方式:客戶端定時向伺服器傳送詢問訊息,一旦伺服器有變化則立即同步訊息。

  2. SMS(簡訊訊息)(Push)方式:通過攔截SMS訊息並且解析訊息內容來了解伺服器的命令,但這種方式一般使用者在經濟上很難承受。

  3. 持久連線(Push)方式:客戶端和伺服器之間建立長久連線,這樣就可以實現訊息的及時行和實時性。

 

Timer比AlarmManager實現心跳時更耗電原因

一. Timer

Android 的 Timer 類可以用來計劃需要迴圈執行的任務。
Timer 的問題是它需要用 WakeLock 讓 CPU 保持喚醒狀態,這樣會大量消耗手機電量,
大大減短手機待機時間。這種方式不能滿足我們的需求。

二. AlarmManager

AlarmManager 是 Android 系統封裝的用於管理 RTC 的模組,RTC (Real Time Clock) 是一個獨立的硬體時鐘,可以在 CPU 休眠時正常執行,在預設的時間到達時,通過中斷喚醒 CPU。這意味著,如果我們用 AlarmManager 來定時執行任務,CPU 可以正常的休眠,只有在需要執行任務時醒來一段很短的時間。




轉自:https://www.jianshu.com/p/d88dc66908cf

相關文章