Android-IM從零開始開發一個即時通訊項目


關於聊天室項目

聊天室項目,也被稱為即時通訊(IM)。

其原理是服務器是一直在啟動狀態的線程,不斷的從客戶端(App)獲取消息,收到消息后,進行類型和發送目標判斷,以發送到群組或者單聊的方式,客戶端收到消息后進行界面的展示。

如果要自己開發即時通訊類的 App,那么必須得要后台,但是現在很多第三方工具已經給我們集成好了所有需要調用的接口工具。

比如極光IM

因為之前用的比較多的是極光的推送服務,也對極光的一些服務和開發文檔比較熟悉,所以該項目就是完全使用極光的sdk。

IM 的應用場景

 
image.png
  • 應用場景一:在線客服、基礎文字對話
    應用示例:簡書私信、支付寶客服
    介紹:該場景只需要一些基礎的聊天功能,直接繼承第三方IM的優點是不需要后台去實現一大堆東西,前端可以直接根據極光IM文檔去使用定義好的方法,就可以實現相關功能,開發起來非常快。
  • 應用場景二:App 中的聊天功能
    應用示例:脈脈、內涵段子、
    介紹:極光 IM SDK 可以滿足正常的圖片收發、語音消息、表情等基本需求,對此類場景下的即時通訊的開發,也很能加快開發速度。
  • 應用場景三:聊天交友 App
    應用示例:陌陌、微信、QQ 等
    介紹:這類軟件是一個完整的即時通訊項目,功能已經不僅僅局限於簡單的消息的收發。可以滿足一個即時通訊類的絕大部分功能。極光官方提供的有即時通訊Demo,包括 UI 等都實現了,只需要簡單配置就可以用。這個項目已經在GitHub開源。可以參考開發或者在此基礎上做另外的功能開發都會比較方便。
 
 

極光 Message 整體特性:

消息類型:文字、語音、圖片、地理位置、文件、自定義消息等。
聊天方式:單聊、群聊。

平台支持:Android, iOS,Web 多平台互通。
用戶維護:注冊、登錄、頭像、用戶其他信息。
群組維護:創建群組、加群、退群。

離線消息:可選擇是否需要保存離線消息
關系模式:有好友模式和無好友模式

跨應用聊天:不同應用下的用戶可相互通信

整體 UI 界面概述

 
image.png

目前已經實現的功能大致就這么多

所有的聊天都基於登錄狀態操作,也就是說未登錄是不能操作的。

1、注冊和登陸

兩種方式: 注冊並登陸或者直接登錄。

如果第一次登錄過,就會把賬號等資料緩存到本地,再次打開就可以自動登錄。

用戶名和密碼規范限制長度限制 Byte(4~128)
用戶名:以字母或者數字開頭。支持字母、數字、下划線、英文點、減號、 @。
密碼:不限

2、添加好友

兩種方式

  • 手動輸入 id,根據 id 查找,並發送好友請求,當另一方同意后會建立好友關系。
  • 或者通過聯系人頁面>新朋友>推薦好友來添加系統推薦的好友。

這里推薦好友,是由我這里手動設置的三個已經注冊完成的號。

好友通知是本地數據庫緩存的消息通知,也就是只有在收到好友請求時,才會把發送過來的請求信息存放到本地。當然如果清空了數據,那就查不到申請記錄了。

3、聯系人建立

這里是根據極光文檔建立的好友關系,其實官方提供的說明是 不需要建立好友關系就能會話,但是這里為了項目的一些需要,使用了極光提供的一套聯系人接口來操作好友。

4、更新資料

修改個人資料,頭像相關操作,對好友的備注、黑名單等功能還未開發。

在第一次注冊的時候,在注冊成功的情況下會默認自動登陸,並且默認設置個人資料的一些參數。比如頭像,昵稱等。防止在更新資料的時候部分字段提示空的錯誤。

5、設置

設置會在安裝的時候初始化,默認只開啟漫游的開關。其他開關需要手動,修改密碼也是。

技術開發路線

除了對朋友圈的功能,其他都可以借助極光 IM 的 sdk 實現,這一塊會放到最后,具體實現方法還未確定。

 
 
  • 第一階段:(已完成)

注冊登錄>退出登錄>找回密碼>聊天窗口

包括基本的注冊登錄功能,可以開始正常會話。

賬號是基礎,所有的會話都是建立在兩個賬號之間的通訊,而服務端(JMessage)只是作為兩端之間消息傳播的橋梁和媒介。

所以賬號是建立兩個點的基石。

  • 第二階段:(已完成)

個人資料(頭像,昵稱,性別等):在原來的基礎上給用戶添加昵稱,頭像等屬性。

當這個基礎建立起來之后,為了區分各自的不同,如過單靠 id,相信沒人知道對方是誰。為了區分需要我們對這個 id 進行 特征設置,這些特征包括頭像、昵稱、年齡、性別、地域等。

  • 第三階段:(已完成)

好友功能:根據用戶名id,添加好友,更新好友列表。以及其他刪除等操作。

當用戶角色屬性建立起來之后,就是建立關系,在極光中默認是不需要建立好友關系就可以會話。但是我們前台需要展現給使用方,作為一個標識來區分好友。

所以這里是要做手動關聯好友,既然做了好友系統,那么必不可少的就是申請好友和通過申請。

  • 第四階段:(已完成)

消息操會話操作:消息的發送、接收、展示、刪除等

好友系統建立起來之后,需要開始進行會話,只有創建了會話之后,才會出來聊天窗口。

注意這里會話和聊天是兩個概念。有會話不一定有聊天記錄。同樣刪除了所有的聊天記錄,會話窗口還是存在。

所以還要對消息操作的時候,選擇清空消息記錄,或者清空並刪除會話。

一個產品的開端一定是一個最主要的基礎功能,而這個最基礎的功能就是聊天

  • 第五階段:

好友關系的高級操作:好友的刪除,備注,黑名單;消息類型。

在前四個階段已經可以完成正常的會話,后面的就屬於拓展階段。

消息多樣化是拓展的首選,現在不僅僅滿足於文字表情的對話,在此基礎上還需要進一步的開發圖片、語音、短視頻等。

如果進度比較快的話,還可以把好友添加備注等。

  • 第六階段:

群組、群聊:創建群,加群,搜索群,審核,踢人,拉人等

群組作為另一個大的功能,作為之前版本穩定,並且大部分功能能完善之后開發的版本。

而且群組涉及的技術,代碼操作,並不比單聊少。所以從時間上來看,放在后面開發也是應該的。

  • 第七階段:

空間、朋友圈的開發

目前也只有這塊需要單獨的去開發相應的功能。或者技術上有問題,也可以開發一個類似咨詢的界面。

在這里需要用到分享、加載、刷新等。

技術框架選擇

由於是個人快速開發,為了提高開發速度和效率,所以在很多地方都是用了第三方框架。

其中用的最多的是極光,不僅僅是依賴於極光即時通訊服務,后期還會引入統計、分享等相關的 sdk 。

即時通訊IM

  • 極光-JMessage
    也是主要的功能,所有的聊天包括好友的對話實現,都是基於極光-JMessage 這個第三方 SDK 。
    這也是整個項目的核心功能。

推送

  • JPush
    同樣是使用極光的產品,當然極光最出名的也就是 JPush,是很多開發者的首選推送方案
    不過后面才知道,集成了 JMessage 之后,就不需要集成推送了,但是兩者之前並沒有什么沖突,如果后面有新需求的話,需要推送再說吧。

存儲

主要使用了兩種方式:

  • SharedPreferences
    一種是本地SharedPreferences存儲,為了存儲一些基本的用戶數據,和賬號設置等。

  • GreenDao
    另外一種是數據庫,這里使用GreenDao框架,該項目在GitHub已經8000+的star,目前也是個人開發者的首選數據庫框架。
    用來存儲一些數據多的,在項目中主要應用的地方是好友請求的存儲,和搜索歷史的存儲。

  • GreenDaoUpgradeHelper
    為了方便數據庫的升級,還順便使用了一個數據庫升級的輔助類

網絡相關

  • Picasso
    使用圖片加載
    由於第三方已經封裝過了網絡加載,所以這里僅僅需要一個加載圖片的方法,當然用 Glide 也是一樣的。
    Picasso 在加載圖片的時候需要的參數可以是 File、String、Uri、int。而在圖片請求返回的結果也無非是這幾種,所以完全可以滿足圖片加載的需要。

工具

  • butterknife
    快速實例化控件的工具,一鍵生成並綁定控件,順便還可以初始化監聽方法。

UI庫

如果說前面的第三方庫是為了減少數據的操作,那么UI則是減少界面的復雜性,增加擴展性。增強視覺效果。

  • Recyclerview
    替代ListView的列表控件,用來展示會話列表、聯系人列表、推薦列表、請求列表。

  • RecyclerViewHeader
    給RecyclerView添加頭部的控件

  • PickerView
    用於設置個人資料選擇地區、性別、生日的控件

  • CircleImageView
    圓形頭像控件,在上傳頭像的時候是方形的,但是加載是圓形的,這里就要用到這個控件了。

  • SwitchButton
    一款開關控件,用於設置免打擾、消息漫游、消息通知。

  • FlycoTabLayout
    首頁切換的控件,又細分為SlidingTabLayout(多標簽)、CommonTabLayout(首頁、底部切換)、SegmentTabLayout(分類切換)。
    在該項目中首頁使用CommonTabLayout,可以添加消息小紅點,或者數量。
    在添加好友或者群的頁面使用SegmentTabLayout切換。

  • aurora-imui
    該框架是極光開發的一款聊天 UI 視圖,分兩個部分,一個是聊天的對話列表,另一個是輸入的消息類型,現在支持語音、圖片、文字、視頻。
    目前對話列表的布局已經支持自定義的 ViewHolder

  • lottie-android
    一款動畫庫,在自動登陸的頁面可以看到效果。

后期需要增加的庫
可能不僅限於這幾種庫,目前能想到的這幾種是需要加的

  • JShare
    極光分享。資訊分享、動態分享、圖文分享、鏈接分享等

  • JAnalytics
    極光統計,渠道統計,獲取用戶數據,分析用戶畫像的工具。

  • Refresh下拉刷新
    用於動態的刷新和加載。

  • Retrofit
    用於做網絡請求,請求加載資訊,或者動態。

總結

由於個人也是第一次開發即時通訊類的項目,所以部分邏輯還不夠嚴謹,在使用中可能會多多少少遇到一些問題,如果某些地方有bug,還望能指正。

項目在GitHub已經開源,並且可以直接下載安裝包。
但部分功能還未完善,后期還需要增加群組聊天,資訊等功能。如果有需要的話可以點個star持續關注本項目。也可以直接在GitHub提issue

wapchief/Android-IM

需要優化細節的地方還有很多,在有時間的情況下會一一完善。

 
部分頁面截圖

如果想測試聊天效果的話也可以添加 1006 機器人。
通過聯系人-新朋友-好友推薦找到該聯系人。如果該賬號在線的話可以默認通過好友,並且默認自動回復。
目前在線的狀態是我這邊手動需要登錄在線。所以在通過時間上暫且無法保證。


最后要感謝極光提供的 SDK,包括一些參考 Demo 和相關技術文檔支持。
項目中用的 icon 基本上都來自阿里巴巴矢量圖,感謝相關作者的貢獻

相關文章推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM