王玉明,陳鈞
(南京工程學院計算機工程學院,南京 211167)
Android系統占有市場超過80%的份額,占有更大的用戶基數,世界很多智能手機廠家幾乎都加入了An?droid陣營,并推出了一系列的Android智能機。終端越多,其市場潛力就越大。從程序的移植和安裝這一角度來說,Android應用商店最大的優勢是,不對An?droid應用程序的來源或者提供商進行嚴格的把控。在這一點上優于蘋果。從Android系統自身的而更深層面來說,Android平臺是基于Linux內核,具有更佳的可靠和安全,新的Linux內核是未來的發展趨勢,An?droid開發更是未來趨勢[1]。
本項目的主要任務是完成在Android平臺上開發以XMPP協議為通信協議的即時通信應用。在項目的研究開始階段,首先要求的是Android模擬器上模擬客戶端應用程序的運行,搭設Tomcat或者Java程序作為主要通信的服務器。在項目的后期,豐富功能后,添加設計Socket服務器作為輔助進行通信。同時在設計該保證節約成本,優化存儲結構,使用客戶端和服務器一同進行存儲,避免相同數據的冗余和堆積現象。重要的是,對于聊天信息的閱讀狀況的正確及時的反饋。
Android開發四大組件分別是:活動(Activity):用于提供功能模塊的實現以及可視化的表現。服務(Ser?vice):后臺運行服務,對用戶隱藏,不對用戶可見,不會和應用組件進行交互。廣播接收器(Broadcast Re?ceiver):用于接收廣播,異步接受Intent,一類主要是完全異步的接收正常廣播,另外一種是傳播有序廣播。內容提供商(Content Provider):主要功能是存儲和傳遞數據,另一個重要的功能是對外數據共享。
Android平臺兼容多種的媒體格式,并提供相關插件和版本控制。在部分的按鍵和Viewer上,提供全息樣式和3D的立體圖標,并且自帶圖片編輯器利用相關的數值參數控制斜度和紋理等特點。另外,Android的UI設計采用的是單線程的模型,拒絕在子線程中對于UI進行操作,所以另外提供了Handler的機制來進行協調通信。Handler機制中的主要對象是Looper,每一個線程中只會存在一個Looper對象,與ThreadLocal的思路一致,解決多線程的并發問題。
XMPP協議是一個開放源碼的,以XML為基礎的可擴展的即時通信協議,其繼承了XML的靈活的可擴展性,以XML數據流為載體進行數據傳輸。其前身是Jabber協議,在2002年,XMPP工作組開發和改編協議以適應IETF組織的消息和出席技術后有了目前的XMPP協議可以說協議是Jabber協議的核心。XMPP盡管不局限網絡拓撲結構,但是通信時必須采用TCP協議,在協議結構上使用的是結構模型,由支持該協議的服務器轉發到目標用戶,完成此類通訊[3]。
在聊天的過程中,如果消息的接收方在已經查看了信息的情況下,應該對于該條的信息的發送方,給出一個問題的反饋,從而使得發送方得知,這條消息已經被閱讀,從一定程度上,能夠解決問題推諉的問題。
其實現主要是對于消息包的監控。在檢測到包的相關內部檢測標準已經有了改變的話,通過成員方法獲得到消息的相關信息,然后交給服務端,反饋信息給發送者。

用戶所在客戶端需要不斷地從網絡上獲取信息,那么就需要解決兩個問題,一個是判斷當前是否鏈接到網絡,另一則就是是否有新的信息需要接受。那么就需要一個長鏈接模塊。
長鏈接線程會先檢查網絡連接的狀態,由內部的循環判斷是否建立過連接,是否來連接網絡,連接是否超時,一次來確定是否連接到網絡/。建立長鏈接的過程,其實質是客戶端向服務器發送連接請求,請求服務器通過此鏈接向客戶端發送消息,客戶端維持一個消息分發線程,消息調用不同的處理過程
另外,如果想保持websocket連接的穩定性,建議加上心跳包??梢悦扛粢欢螘r間就發個簡單的字符串給后臺,讓后臺知道用戶在線,可以調用timetask以及CountDownTimer來完成。
參照MVC(Model View Controller,模型—視圖—控制器)的架構設計模式,可以達到將業務邏輯、數據、界面顯示分離的結構形式??梢园堰@個系統分為如下的幾個功能層次:數據庫層(Model層),表現層(View層),業務處理層(Controller層),網絡通信層(網絡業務的處理層)。根據不同的業務要求,每一個層次同樣具有不同的模塊,每個模塊都具備各自的功能。
注意點主要集中在,需要固定層與層之間的通信接口,能夠清楚明白的描述層次和功能。有專業的要求盡量做到“高內聚,低耦合”,在層次的內部應該模塊化,盡可能的降低模塊與模塊之間的聯系。同時要保證,接口的調用清晰明了。
針對此次對于通訊軟件的設計要求,盡量將軟件的使用的模塊簡化,大致包括以下的模塊:登錄注冊模塊、主界面顯示模塊、好友管理模塊、群組管理模塊、聊天模塊、個性化設置模塊等。每個模塊負責具體的不同的功能。
(1)用戶注冊界面:在新用戶要求注冊時,提供界面要求用戶對于昵稱、密碼、email信息進行填寫,并且在提交之前進行檢驗,滿足全部要求的才能注冊到服務器中保存。保存剛注冊的賬號和密碼,方便及時登錄。
(2)用戶登錄界面:在用戶登錄時,檢測賬號、密碼是否正確進行匹配,判斷賬號是否的格式、內容輸入有誤,判斷該賬號有沒有存在共同登錄或者異地登錄的情況。
(3)好友管理模塊:進行好友的管理,功能要求要能夠進行添加好友、刪除好友、修改好友備注和分組等的操作,在這些操作之后,需要將修改的內容存儲到本地或者是遠程的數據庫。
(4)群組管理模塊:進行群組的管理,功能要求要能夠進行創建群組、刪除群組、邀請好友、修改群組信息等。同時這些信息要注意管理員與普通用戶之間的權限的不同。
(5)主界面模塊:負責多個功能之間的切換。通過左劃、右劃以及對提供的工具欄的操作方式實現。以此來完成多個不同的模塊的功能的集合。同時要能夠顯示用戶的頭像,個性簽名,呈現狀態以及最近的聊天界面等狀態。但是同樣這些功能有的是平行的功能,有的是作為承載在主界面是上面的應用。如聊天管理界面圖1。
由此也是所有的activity中布局最為復雜的一種,通過添加TextView,Button,ProgressBar等常用控件來編寫程序界面。主界面下需要防止多個聊天的窗口。主要的監控就要交給后臺功能。Service不能自己運行,只能后臺運行,并且可以和其他組件進行交互。但是主界面一定存在相當的耗時操作,像需要發送網絡請求的時候,服務器未必會立刻的給出回復,如果不交給子線程,會導致主線程被阻塞,從而程序和用戶體驗。
聊天模塊:負責對于聊天的支持,對聊天的內容進行處理。能群聊、單聊,能添加表情等。聊天記錄一樣能夠在本地端進行存儲,并且全部都以聊天窗口的形式顯示出來。主要的個人聊天界面,如圖2。

圖1 聊天管理界面

圖2 個人聊天界面
功能設置模塊:主要對應用進行功能性設置,包括個人設置和系統設置。此類的系統配置屬于用戶對于Android的個性化配置,可以使用Android的Shared?Preferences功能,它是一個輕量級的存儲類,所以很適合用于保存軟件配置參數。通過XML文件存放數據,文件存放在本地安裝目錄下的/data/data/

依據上面一個模塊對于功能模塊的分析結果,下面給出相關的用例圖,圖3。
從圖中可以看出,用戶需要先行注冊成為用戶,將其注冊的相關信息包括密碼賬號等,保存在數據庫,其次登錄客戶端,在這樣的情況下,用戶就可以查詢聊天記錄。查看發送的圖片或者文件等的操作,但是想進行單人聊天,群聊天需要先連接到服務器。

圖3 功能模塊的用例分析圖
在設計本課題系統時,需要考慮到數據的保存和可重復多次讀取的相關措施。Android本身有提供5中數據的存儲方式。第一種是SharedPreferences主要是用于存儲一些簡單的系統配置的信息,優點在于簡單快捷的讀取和寫入方式。第二種是通過文件存儲數據,利用和Java一致的文件輸入輸出流實現。第三種是網絡存儲方式,主要是解決Android網絡數據包的問題。第四種就是組件之一的ContentProvider。第四種是利用開發的數據庫SQLite。
本課題系統的設計架構是C/S架構,為了降低數據的大量冗余,和堆積在服務器影響性能的問題,需要在服務器和客戶端上面同事的存儲數據。服務器主要利用輕型的mysql數據庫進行處理。客戶端將少量的系統配置信息,例如用戶名和密碼,用戶的私人配置等信息保存在SharedPreferences中,主要還是通過SQLite進行保存。
本項目主要的數據庫表有User用戶信息表、Con?tacts:聯系人列表、Single_session單人會話列表、Sin?gle_message單人聊天信息表、Group_session多人會話列表、Group_message多人聊天信息表。
以下是聊天系統的ER圖:

圖4 聊天系統ER圖
本系統主要使用Java語言開發,通過原型設計,數據庫設計,已完成基本的閱讀回執功能,即時反饋已讀動態以及對重要的信息做出提醒,有一定的實用性。根據我們對于國內外研究現狀、發展水平的分析了解,本系統開發成本低廉,效率高,擴展性好。
[1]呂留記.基于Android的即時通訊系統的研究與實現[D].電子科技大學,2016.
[2]王少蕾.安全通信軟件“密迅”的Android手機客戶端的設計與實現[D].北京交通大學,2014.
[3]高明鵬.基于XMPP協議的Android手機即時通信應用研究與實現[D].南昌大學,2012.
[4]郝秋影.基于Android的消息應用的設計與實現[D].北京郵電大學,2013.