1. 程式人生 > >Android 即時通訊開發小結(一)

Android 即時通訊開發小結(一)

《Android 即時通訊開發小結》基於IM Andriod 開發的各種常見問題,結合網易雲信即時通訊技術的實踐,對 IM 開發做一個全面的總結。

相關推薦閱讀:、

客戶端架構

作為一個 IM 軟體,最重要的一個特性就是保證訊息的達到率和實時性。達到率受伺服器效能和設計協議影響,後面再談。而實時性則主要取決於客戶端程序是否長期存活,連線是否一致保持。

程序切分

在 Android 系統中,App 對於自己應用的生命週期是基本沒有控制力,系統能在任意時候將你的程序殺死,且不會發出任何通知,也會在它認為合適的時候把你叫起來。程序前後臺切換也同樣不會給出任何通知。不過程序的生死控制也還是有一些規矩的,大體上來說就是程序佔的資源越多(記憶體,CPU 時間等等),對於使用者越不重要(前臺程序->可視程序->服務程序->後臺程序->空程序),越容易被幹掉。因此,程序應當儘量小巧,且具有高的優先順序。

如果一個應用本身就很小巧的話,一個程序就完全足夠了,主執行緒負責 UI,另起一個後臺執行緒跑一個服務。而如果應用比較龐大的話,將推送服務獨立出來則是一個更好的選擇。主程序負責使用者互動和主要的業務邏輯,佔用龐大的資源,當退到後臺後,隨時被殺死都無所謂。推送程序則僅僅負責與伺服器互動,保持最小限度的業務邏輯處理。

網路連線和登入狀態是綁在一起的,登入之後,同步資料也是必須的操作。因此,登入和同步資料都需要在推送程序中完成,除此之外,其他的業務都交給 UI 程序處理。推送程序收到自己不屬於自己的協議時,就將資料扔給 UI 程序處理。

兩個程序之間通訊方式沒有別的選擇,只有 AIDL,難點在於介面的設計。IM 業務邏輯複雜,我們不可能為每一個呼叫實現一個 AIDL 介面,因此肯定會把介面呼叫打包成控制命令傳遞。而標識控制命令比較容易想到的方式,是採用類似於 Message 的 what,由我們為每一個控制命令分配一個命令號(或者再加一個子命令號),並指定對應的命令資料格式,接收端根據命令號再將資料反解出來處理。這種方式比較麻煩,且可維護性很差。更優雅的方式是使用遠端過程呼叫,傳送端申明業務的呼叫介面,並在遠端實現這些介面,當傳送端呼叫這些介面時,遠端直接呼叫對應介面的實現。除了使用各種第三方框架外,Java 自身的 Proxy 也能實現這個功能。而從推送程序到 UI 程序還有一點不同,UI 程序隨時可能會被幹掉,AIDL 呼叫可能會返回失敗,此種情況可選擇 Intent 方式傳遞資料,併兼具喚起 UI 程序的功能。

保  活

保活分為三個方面,一是系統API提供了介面,應用自己就能做的,這是”合法“的,二是利用系統的缺陷,躲開系統的審查,這算是”非法“的,或者是”灰色“的,三就是多個 App 結盟,互相喚醒,這是耍流氓,誰的陣營龐大誰就贏。

第一種主要有系統鬧鐘,各種事件的 BroadcastReceiver,任務被移除的回撥通知等。

第二種已知的就是在 4.4 及以前版本上,使用 native 程序,並將該程序從 davilk 父程序中脫離,掛接到 init 程序上,以此避開系統的查殺。然後在這個 native 程序中,定時喚起應用。為了讓這個 native 程序更輕巧,可以使用 exec 的方式啟動一個可執行檔案,以除掉直接 fork 帶入的 Zygote 程序環境。另外,這種方式也被用在監聽自己應用被解除安裝時彈出調查視窗。

第三種方式現在各大網際網路公司都在使用,方式很簡單,互相呼叫指定的 Service,或髮指定得廣播即可。只要你起一個阿里系的 App,其他阿里系的 App 都會被跟著喚起。你啟動一個裝了友盟 SDK 的 App, 其他裝了友盟 SDK 的App,以及阿里系的 App 都會被跟著喚醒。

通常,第一種是必備,第二種和第三種則會結伴出現,流氓到底。

通訊協議選擇

訊息的實時性的另一個保證是長連線。當然,你也可以用短連線輪詢,但這個一般只在網頁端短時聊天使用,在 Android 後臺無限時輪詢沒有人能受的了。長連線型別可以選傳統的 TCP,也可以使用比較新的 WebSocket。 使用後一種的好處主要是伺服器的,他們一套連線就可以服務好 App 端和 Web 端。

IM 的通訊協議選擇性很多,開源的有 XMPP,MQTT等,使用開源協議的優勢在於上手快,資料多。而大部分主流 IM 則一般會設計私有的通訊協議。使用私有協議,可以針對自己的業務邏輯,設計出更省流量,效率更高的協議,同時,還能有效保護自己的生態圈,就像 Android 手機裝不了蘋果系統,易信使用者不能給微信使用者發訊息一樣。

私有協議的協議內容和開源協議差不多,可以包含通用的協議頭,然後加上負載包體。打包時,為了追求可讀性,可以使用文字協議,為了追求省流量,則一般使用二進位制協議。

在設計私有協議時,訊息必達是一個需要側重考量的地方。由於行動網路的複雜性,訊息在客戶端和伺服器之間傳遞是有很大可能被傳丟的。當客戶端傳送訊息給伺服器時,客戶端並不能確保訊息一定就會被伺服器收到,需要伺服器在收到訊息後給客戶端一個回饋,如果客戶端沒有收到回饋,就需要在一定超時後重新發送。這裡存在一個問題就是有可能伺服器已經收到了,但回饋的包被丟掉了,這時就會造成訊息重複,為了去重,我們需要為相同的訊息分配相同的 uuid,供接收方去重。同樣,當伺服器將訊息轉發給接收端時,伺服器也不能保證接收端就一定能收到,需要接收端給伺服器一個回執,告訴伺服器這條訊息我已經收到了,你就不要再給我發了。

Android 即時通訊開發小結(二)將會從“建立安全連線”、“心跳”、“斷線重連”、“多媒體資料管理”、“圖片”、“語音”等問題出發,結合網易雲信即時通訊技術的實踐, 進行詳細的介紹和總結。

相關推薦

Android 即時通訊開發小結

《Android 即時通訊開發小結》基於IM Andriod 開發的各種常見問題,結合網易雲信即時通訊技術的實踐,對 IM 開發做一個全面的總結。相關推薦閱讀:、客戶端架構作為一個 IM 軟體,最重要的一個特性就是保證訊息的達到率和實時性。達到率受伺服器效能和設計協議影響,後

arcgis runtime for android 100.3開發學習點、線、面,圖層的建立

本節我們來學習一下arcgis runtime for android方面的相關內容,一一學習相關方面的api知識。這個案例是摘取github官網上面的。主要建立圖形案例的點、線、面,當然還有圖層的建立。來看一下實現的程式碼。 package com.example.arc

Android外掛化開發教程

1.什麼是外掛化開發首先我們要對外掛化的概念有一個認識:外掛化開發是將整個app拆分成很多模組,這些模組包括一個宿主和多個外掛,每個模組都是一個apk(元件化的每個模組是個lib),最終打包的時候將宿主apk和外掛apk分開或者聯合打包。外掛式開發通俗的講就是把一個很大的app分成n多個

Android藍芽開發教程——搜尋藍芽裝置

Android藍芽功能的開發一直是很多新手頭疼的問題,網上雖然也有很多教程貼,但大多都寫得不全面,不能讓我們真正掌握藍芽開發的基本知識。本教程主要講解搜尋藍芽裝置、藍芽裝置之間的連線和藍芽之間的通訊三個主要模組。掌握了這三個,基本就能進行簡單的藍芽開發了。

XMPP和即時通訊內容學習

一直聽朋友們說xmpp,怎麼好怎麼流行,我也挺感興趣,可是由於最近工作很忙,沒有時間看,今天終於抽出時間研究了一下,首先是XMPP到底是什麼? XMPP是:是一種以XML為基礎的開放式實時通訊協議,是經由網際網路工程工作小組(IETF)通過的網際網路標準。XMPP因為被Go

Android TV開發總結構建一個TV app前要知道的事兒

進入 line 指南 col 遠程 引導 允許 方法 imp 原文:Android TV開發總結(一)構建一個TV app前要知道的事兒 版權聲明:我已委托“維權騎士”(rightknights.com)為我的文章進行維權行動.轉載務必轉載所

Android 開發安卓開發環境搭建與配置 (Windows和Mac )以及目錄結構介紹

(一)、windows版 一. 開發工具: 1.Android Studio:(http://www.androiddevtools.cn/) 2.Genymotion(虛擬機器):(http://www.genymotion.net/) (二)、Mac版 一

圖文詳解如何搭建Windows的Android C++開發環境

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

STM32開發筆記47:STM32F4+DP83848乙太網通訊指南系列:知識儲備

微控制器型號:STM32F407VGT 本章為系列指南第一章,主要是介紹一下專案思路,並且儘可能列出從零開始著手開發這個專案過程中,所需要理解的各類知識點,關於這些知識點,如果需要更詳細的介紹,請列為看官自行百度谷歌。 STM32F407簡介 STM32F407主頻168MHz,主頻

Android開發心得

Android開發心得之MVC 這一個學期在上潘老師的系統設計與分析課程時,我們小組開發了基於安卓平臺的電影購票軟體。在開發過程中收穫了挺多,現在在課程結束前,把其分享出來。 MVC是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控

android中的跨程序通訊的實現——遠端呼叫過程和aidl

android在設計理念上強調元件化,元件之間的依賴性很小。我們往往發一個intent請求就可以啟動另一個應用的activity,或者一個你不知道在哪個程序的service,或者可以註冊一個廣播,只要有這個事件發生你都可以收到,又或者你可以查詢一個contentProvider獲得你想要的資料,這其

android 敏捷開發系列——《啥是敏捷開發

說起敏捷開發,大家或多或少會有些印象。而在android上的敏捷開發可能還並未普及。 博主將與大家共同討論一起交流android上的敏捷開發、框架搭建等知識。 本博將通過 講解敏捷開發概念->敏捷開發架構思想->開發環境搭建->專案原始碼敏捷開發構建、

Android 谷歌 開源 通訊框架 VOLLEY

  HTTP 是應用層協議,TCP 是傳輸層協議(位於應用層之下)。   一般來說,移動應用推薦使用 HTTP 協議,有很多優點:   1. HTTP 發展成熟   HTTP 幾乎已經快成為一種通用的 Web 標準,Web Services、Open AP

Android開發入門——基本語法

參考資料:《Android系統下Java程式設計詳解》 本文摘錄了該書的一些知識點,適合有面向物件程式設計基礎的開發者。 第1章 Android基本概念 1 Android應用程式框架 每個應用程式其實是一組服務和系統,包括以下內容: ① 檢視(Vi

IOS程式設計開發中的問題小結

        做了一段時間的IOS開發,在開發過程中遇到了一些問題,不一定具有代表性,只是作為個人開發學習過程中的一個小結吧。         1.關於蘋果系統對於應用系統啟動時間的限制         我們知道,iOS APP的最長啟動時間不得超過15秒。如果超過了這

床頭筆記之Android開發學習

安卓Android開發環境搭建 流行的有兩種: 一種是下載Eclipse、JDK、Android SDK、ADT外掛搭建。 一種是Android studio環境搭建。 本次用第二種吧,聽說這個才是王道,不管了,道聽途說著用吧。 信奉: 本次信奉簡約,不求完全,

xmpp開發IM即時通訊系列--即時通訊伺服器搭建1資料庫搭建

    這次總結一下即時通訊伺服器的搭建,一般的後臺伺服器至少由兩部分組成,一部分是應用伺服器,另一部分是資料庫伺服器與檔案伺服器,應用伺服器主要用於部署負責業務處理的相關應用,資料庫伺服器主要用於部

Android原生角度看移動html5開發APP原生與html對比

本來一直從事Android原生開發,基於一個專案需要用到html5開發,從而學習了html、html5、css、JavaScript等等知識。下面就個人從Android原生角度淺談一下html5開發移動APP。 1、對應關係:    對於html5和html來說,html5

ROS專案開發實戰——STM32與ROS串列埠通訊

序    本文主要釋出一些作者從零開始開發ROS的專案實戰經驗,包括一些經驗與本文遇到坑時的解決方案,ROS因為版本不同與開發環境不同在實際開發中會遇到各類問題,下面就細細道來。一、環境搭建    本人開發環境 ——上位機:MAC主機+PD虛擬機器+Ubuntu12.04(6

[日更-2019.5.24、25、26] Android系統中的Binder通訊機制分析--servicemanager

宣告 其實對於Android系統Binder通訊的機制早就有分析的想法,記得去年6、7月份Mr.Deng離職期間約定一起對其進行