Android-IM从零开始开发一个即时通讯项目
关于聊天室项目
聊天室项目,也被称为即时通讯(IM)。
其原理是服务器是一直在启动状态的线程,不断的从客户端(App)获取消息,收到消息后,进行类型和发送目标判断,以发送到群组或者单聊的方式,客户端收到消息后进行界面的展示。
如果要自己开发即时通讯类的 App,那么必须得要后台,但是现在很多第三方工具已经给我们集成好了所有需要调用的接口工具。
比如极光IM
因为之前用的比较多的是极光的推送服务,也对极光的一些服务和开发文档比较熟悉,所以该项目就是完全使用极光的sdk。
IM 的应用场景
应用场景一:在线客服、基础文字对话
应用示例:简书私信、支付宝客服
介绍:该场景只需要一些基础的聊天功能,直接继承第三方IM的优点是不需要后台去实现一大堆东西,前端可以直接根据极光IM文档去使用定义好的方法,就可以实现相关功能,开发起来非常快。
应用场景二:App 中的聊天功能
应用示例:脉脉、内涵段子、
介绍:极光 IM SDK 可以满足正常的图片收发、语音消息、表情等基本需求,对此类场景下的即时通讯的开发,也很能加快开发速度。
应用场景三:聊天交友 App
应用示例:陌陌、微信、QQ 等
介绍:这类软件是一个完整的即时通讯项目,功能已经不仅仅局限于简单的消息的收发。可以满足一个即时通讯类的绝大部分功能。极光官方提供的有即时通讯Demo,包括 UI 等都实现了,只需要简单配置就可以用。这个项目已经在GitHub开源。可以参考开发或者在此基础上做另外的功能开发都会比较方便。
极光 Message 整体特性:
消息类型:文字、语音、图片、地理位置、文件、自定义消息等。
聊天方式:单聊、群聊。
平台支持:Android, iOS,Web 多平台互通。
用户维护:注册、登录、头像、用户其他信息。
群组维护:创建群组、加群、退群。
离线消息:可选择是否需要保存离线消息
关系模式:有好友模式和无好友模式
跨应用聊天:不同应用下的用户可相互通信
整体 UI 界面概述
目前已经实现的功能大致就这么多
所有的聊天都基于登录状态操作,也就是说未登录是不能操作的。
1、注册和登陆
两种方式: 注册并登陆或者直接登录。
如果第一次登录过,就会把账号等资料缓存到本地,再次打开就可以自动登录。
用户名和密码规范限制长度限制 Byte(4~128) 用户名:以字母或者数字开头。支持字母、数字、下划线、英文点、减号、 @。 密码:不限
2、添加好友
两种方式:
- 手动输入 id,根据 id 查找,并发送好友请求,当另一方同意后会建立好友关系。
- 或者通过联系人页面>新朋友>推荐好友来添加系统推荐的好友。
这里推荐好友,是由我这里手动设置的三个已经注册完成的号。
好友通知是本地数据库缓存的消息通知,也就是只有在收到好友请求时,才会把发送过来的请求信息存放到本地。当然如果清空了数据,那就查不到申请记录了。
3、联系人建立
这里是根据极光文档建立的好友关系,其实官方提供的说明是 不需要建立好友关系就能会话,但是这里为了项目的一些需要,使用了极光提供的一套联系人接口来操作好友。
4、更新资料
修改个人资料,头像相关操作,对好友的备注、黑名单等功能还未开发。
在第一次注册的时候,在注册成功的情况下会默认自动登陆,并且默认设置个人资料的一些参数。比如头像,昵称等。防止在更新资料的时候部分字段提示空的错误。
5、设置
设置会在安装的时候初始化,默认只开启漫游的开关。其他开关需要手动,修改密码也是。
技术开发路线
除了对朋友圈的功能,其他都可以借助极光 IM 的 sdk 实现,这一块会放到最后,具体实现方法还未确定。
- 第一阶段:(已完成)
注册登录>退出登录>找回密码>聊天窗口
包括基本的注册登录功能,可以开始正常会话。
账号是基础,所有的会话都是建立在两个账号之间的通讯,而服务端(JMessage)只是作为两端之间消息传播的桥梁和媒介。
所以账号是建立两个点的基石。
- 第二阶段:(已完成)
个人资料(头像,昵称,性别等):在原来的基础上给用户添加昵称,头像等属性。
当这个基础建立起来之后,为了区分各自的不同,如过单靠 id,相信没人知道对方是谁。为了区分需要我们对这个 id 进行 特征设置,这些特征包括头像、昵称、年龄、性别、地域等。
- 第三阶段:(已完成)
好友功能:根据用户名id,添加好友,更新好友列表。以及其他删除等操作。
当用户角色属性建立起来之后,就是建立关系,在极光中默认是不需要建立好友关系就可以会话。但是我们前台需要展现给使用方,作为一个标识来区分好友。
所以这里是要做手动关联好友,既然做了好友系统,那么必不可少的就是申请好友和通过申请。
- 第四阶段:(已完成)
消息操会话操作:消息的发送、接收、展示、删除等
好友系统建立起来之后,需要开始进行会话,只有创建了会话之后,才会出来聊天窗口。
注意这里会话和聊天是两个概念。有会话不一定有聊天记录。同样删除了所有的聊天记录,会话窗口还是存在。
所以还要对消息操作的时候,选择清空消息记录,或者清空并删除会话。
一个产品的开端一定是一个最主要的基础功能,而这个最基础的功能就是聊天
- 第五阶段:
好友关系的高级操作:好友的删除,备注,黑名单;消息类型。
在前四个阶段已经可以完成正常的会话,后面的就属于拓展阶段。
消息多样化是拓展的首选,现在不仅仅满足于文字表情的对话,在此基础上还需要进一步的开发图片、语音、短视频等。
如果进度比较快的话,还可以把好友添加备注等。
- 第六阶段:
群组、群聊:创建群,加群,搜索群,审核,踢人,拉人等
群组作为另一个大的功能,作为之前版本稳定,并且大部分功能能完善之后开发的版本。
而且群组涉及的技术,代码操作,并不比单聊少。所以从时间上来看,放在后面开发也是应该的。
- 第七阶段:
空间、朋友圈的开发
目前也只有这块需要单独的去开发相应的功能。或者技术上有问题,也可以开发一个类似咨询的界面。
在这里需要用到分享、加载、刷新等。
技术框架选择
由于是个人快速开发,为了提高开发速度和效率,所以在很多地方都是用了第三方框架。
其中用的最多的是极光,不仅仅是依赖于极光即时通讯服务,后期还会引入统计、分享等相关的 sdk 。
即时通讯IM
也是主要的功能,所有的聊天包括好友的对话实现,都是基于极光-JMessage 这个第三方 SDK 。
这也是整个项目的核心功能。
推送
同样是使用极光的产品,当然极光最出名的也就是 JPush,是很多开发者的首选推送方案
不过后面才知道,集成了 JMessage 之后,就不需要集成推送了,但是两者之前并没有什么冲突,如果后面有新需求的话,需要推送再说吧。
存储
主要使用了两种方式:
一种是本地SharedPreferences存储,为了存储一些基本的用户数据,和账号设置等。
另外一种是数据库,这里使用GreenDao框架,该项目在GitHub已经8000+的star,目前也是个人开发者的首选数据库框架。
用来存储一些数据多的,在项目中主要应用的地方是好友请求的存储,和搜索历史的存储。
为了方便数据库的升级,还顺便使用了一个数据库升级的辅助类
网络相关
使用图片加载
由于第三方已经封装过了网络加载,所以这里仅仅需要一个加载图片的方法,当然用 Glide 也是一样的。
Picasso 在加载图片的时候需要的参数可以是 File、String、Uri、int。而在图片请求返回的结果也无非是这几种,所以完全可以满足图片加载的需要。
工具
快速实例化控件的工具,一键生成并绑定控件,顺便还可以初始化监听方法。
UI库
如果说前面的第三方库是为了减少数据的操作,那么UI则是减少界面的复杂性,增加扩展性。增强视觉效果。
替代ListView的列表控件,用来展示会话列表、联系人列表、推荐列表、请求列表。
给RecyclerView添加头部的控件
用于设置个人资料选择地区、性别、生日的控件
圆形头像控件,在上传头像的时候是方形的,但是加载是圆形的,这里就要用到这个控件了。
一款开关控件,用于设置免打扰、消息漫游、消息通知。
首页切换的控件,又细分为SlidingTabLayout(多标签)、CommonTabLayout(首页、底部切换)、SegmentTabLayout(分类切换)。
在该项目中首页使用CommonTabLayout,可以添加消息小红点,或者数量。
在添加好友或者群的页面使用SegmentTabLayout切换。
该框架是极光开发的一款聊天 UI 视图,分两个部分,一个是聊天的对话列表,另一个是输入的消息类型,现在支持语音、图片、文字、视频。
目前对话列表的布局已经支持自定义的 ViewHolder
一款动画库,在自动登陆的页面可以看到效果。
后期需要增加的库
可能不仅限于这几种库,目前能想到的这几种是需要加的
极光分享。资讯分享、动态分享、图文分享、链接分享等
极光统计,渠道统计,获取用户数据,分析用户画像的工具。
- Refresh下拉刷新:
用于动态的刷新和加载。
- Retrofit:
用于做网络请求,请求加载资讯,或者动态。
总结
由于个人也是第一次开发即时通讯类的项目,所以部分逻辑还不够严谨,在使用中可能会多多少少遇到一些问题,如果某些地方有bug,还望能指正。
项目在GitHub已经开源,并且可以直接下载安装包。
但部分功能还未完善,后期还需要增加群组聊天,资讯等功能。如果有需要的话可以点个star持续关注本项目。也可以直接在GitHub提issue
需要优化细节的地方还有很多,在有时间的情况下会一一完善。
部分页面截图
如果想测试聊天效果的话也可以添加 1006 机器人。
通过联系人-新朋友-好友推荐找到该联系人。如果该账号在线的话可以默认通过好友,并且默认自动回复。
目前在线的状态是我这边手动需要登录在线。所以在通过时间上暂且无法保证。
最后要感谢极光提供的 SDK,包括一些参考 Demo 和相关技术文档支持。
项目中用的 icon 基本上都来自阿里巴巴矢量图,感谢相关作者的贡献
相关文章推荐: