由於手機平臺自己、電量、網絡流量的限制,移動互聯網應用在設計上跟傳統 PC 上的應用很大不同,須要根據手機自己的特色,儘可能的節省電量和流量,同時又要儘量的保證數據能及時到達客戶端。 服務器
爲了解決數據同步的問題,在手機平臺上,經常使用的方法有2種。一種是定時去服務器上查詢數據,也叫Polling,還有一種手機跟服務器之間維護一個 TCP 長鏈接,當服務器有數據時,實時推送到客戶端,也就是咱們說的 Push。 網絡
從耗費的電量、流量和數據送達的及時性來講,Push 都會有明顯的優點,但 Push 的實現和維護成本相對較高。在移動無線網絡下維護長鏈接,相對也有一些技術上的難度。本文試圖給你們介紹一下咱們極光推送在 Android 平臺上是如何維護長鏈接。 spa
由於 IP v4 的 IP 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要鏈接 Internet,就須要經過運營商的網關作一個網絡地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關須要維護一個外網 IP、端口到內網 IP、端口的對應關係,以確保內網的手機能夠跟 Internet 的服務器通信。 設計
圖片源自 cisco.com. 圖片
NAT 功能由圖中的 GGSN 模塊實現。 ci
大部分移動無線網絡運營商都在鏈路一段時間沒有數據通信時,會淘汰 NAT 表中的對應項,形成鏈路中斷。 get
爲了避免讓 NAT 表失效,咱們須要定時的發心跳,以刷新 NAT 表項,避免被淘汰。 同步
Android 上定時運行任務經常使用的方法有2種,一種方法用 Timer,另外一種是AlarmManager。 io
Android 的 Timer 類能夠用來計劃須要循環執行的任務,Timer 的問題是它須要用 WakeLock 讓 CPU 保持喚醒狀態,這樣會大量消耗手機電量,大大減短手機待機時間。這種方式不能知足咱們的需求。 互聯網
AlarmManager 是 Android 系統封裝的用於管理 RTC 的模塊,RTC (Real Time Clock) 是一個獨立的硬件時鐘,能夠在 CPU 休眠時正常運行,在預設的時間到達時,經過中斷喚醒 CPU。
這意味着,若是咱們用 AlarmManager 來定時執行任務,CPU 能夠正常的休眠,只有在須要運行任務時醒來一段很短的時間。