前言

距离上次极光征文不知不觉已经过了将近一年的时间,先感谢上次的征文比赛,通过 《我和 Android 推送的时间简史》 这篇文章获奖,这次又厚着脸皮再次参与,因为项目一直很忙,只得利用周末时间准备 demo 素材和写文章,不好之处,多多见谅。

上一篇文章主要讲述了 我跟 极光推送 的关系,以及简单的描述了其集成和使用,作为三个项目都在使用极光推送的我,对其了解也是相当多的,当然坑也踩了不少,不得不再次感谢大侠(极光技术人员)对我的帮助,虽然这一年没有继续接触推送的业务,但是当我遇到困惑依然有问必答,服务态度不容置疑!

在准备参加征文时就在想应该从哪个角度来写呢,正好之前跟前同事一起写了一个开源项目 WeaponApp, 现在已经有 800+ 的 star 了。

里面涉及的技术我就不一一阐述了,感兴趣的话可以自行看一下,里面有一个模块由我单独负责- IM模块,因为已经集成了极光推送,考虑到成本和使用,最终选择了极光IM,毕竟是以极光推送的大规模、高并发、稳定的推送为技术基础,并继承这些特性。那这篇文章就以我集成的经历和使用做个介绍,快速的实现具有 IM 功能的 APP。

展示

这里只对 IM 模块功能做简单的演示,感兴趣可以点击 链接 进行下载,如下 gif 图:

基本的聊天功能已经实现,其中包括:

  1. 登录、注册、强踢和退登
  2. 个人信息查看和修改
  3. 查找好友并进行聊天
  4. 群聊
  5. 个人中心展示
  6. 删除会话和清空聊天记录

后续会根据需要添加新的功能。

集成

因为前项已经集成了极光推送服务,很多东西已经不需要重复操作,只需要将 JMessage 相关的组件集成到项目中即可,详情的步骤可直接参考官网。

1. 导入jmessage jar 包
2. 在 AndroidManifest 中添加相应的事件

没了。。由此可以看出,由推送到 IM 过渡是多么流畅!

使用

其实在使用的过程,无非是根据自己的业务需求,到 官网 查找 API 来实现自己想要的功能,那我就根据目前项目中有的功能进行介绍。

注册、登录和退登

这其实是用户的信息管理,极光 IM 统一用 UserInfo 进行管理,内部包含了用户的大部分信息:

    protected long userID;protected String userName;protected String nickname = "";protected String avatarMediaID;protected String birthday = "";protected String signature = "";protected String gender = "";protected String region = "";protected String address = "";protected String appkey = null;protected String notename = null;protected String noteText = null;protected int mTime;protected Map<String, String> extras = new ConcurrentHashMap();

1. 注册

一开始打算自己写用户服务器,事实上却是由另一位开发者完成了,但是考虑到 IM 的集成,用户数据的迁移和转存过程繁琐,就干脆直接用极光的用户接口,其实内部的数据也确实很详细,还支持自定义字段,完全满足日常需求。

JMessageClient.register(userName, password, new JMessageCallBack() {@Overridepublic void onSuccess() {registerSuccess(userName);}@Overridepublic void onFailed(int status, String desc) {registerFailed(desc);}
});

注册需要用户名和密码,注册成功后通过 setResult 的方法,将账户和密码传回登录页面。

2. 登录

JMessageClient.login(userName, password, new JMessageCallBack() {@Overridepublic void onSuccess() {loginSuccess(userName);}@Overridepublic void onFailed(int status, String desc) {loginFailed(desc);}
});

同注册一样,登录也需要用户名和密码进行登录,如果格式有误会直接触发 onFailed 回调,弹出相应的提示。成功后本地便会保存一个 UserInfo 对象储存用户的信息。

3. 退登

极光支持主动退出账号的功能,即:

JMessageClient.logout();

直接清除本地保存的用户信息,同样他支持多端同时在线:

如果不打开开关,另一台设备登录,会用 EventBus 发送 LoginStateChangeEvent,告知开发者改账号已在另一台设备登录,并且会携带三种状态:

case user_password_change:forcedExit("账号密码被修改");break;
case user_logout:forcedExit("账号在另一台设备登录");break;
case user_deleted:forcedExit("账号被删除");break;

根据自己的需要进行处理。

信息查看和修改

1. 个人

自己的用户信息其实是保存在本地的数据库中,通过调用:

mUserInfo = JMessageClient.getMyInfo();

获取用户信息,之前提过 UserInfo 里面包含了用户的所有数据。与之对应的:

JMessageClient.updateMyInfo(UserInfo.Field.gender, mUserInfo, new JMessageCallBack() {@Overridepublic void onSuccess() {}@Overridepublic void onFailed(int status, String desc) {}
});

这个就是修改自己信息的方法,通过传入 UserInfo.Field 来区分修改属性值。

2. 他人

如果需要查看好友的信息,可通过 userName 进行请求查询:

JMessageClient.getUserInfo(userName, new GetUserInfoCallback() {@Overridepublic void gotResult(int status, String desc, UserInfo userInfo) {if (status == 0) {getViewModel().setUserInfo(userInfo);} else {getViewModel().setError(desc);}}
});

具体的结果如下:

如果是个人信息,直接可以修改和退登,如果是他人只能查看并与其进行聊天。

聊天

终于到了核心的聊天功能,其实实现起来并不复杂,极光 IM 已经给了丰富的 API 和使用说明,足够完成基本的需求。

1. 发消息

发消息,前提是需要构建 Message 对象,以基础文本为例:

final Message message = mConversation.createSendTextMessage(sendContent);
message.setOnSendCompleteCallback(new BasicCallback() {@Overridepublic void gotResult(int status, String desc) {if (status == 0) {// 消息发送成功MobclickAgent.onEvent(getContext().getApplicationContext(), "send_message", sendContent);addSendMessage(message);++curCount;setSendContent("");getView().scrollToPosition(items.size() - 1);} else {// 消息发送失败Toast.makeText(getContext(), desc, Toast.LENGTH_SHORT).show();}}
});
JMessageClient.sendMessage(message);

最终通过 JmessageClient.sendMessage(message) 将消息发送出去。

2. 接收消息

他这里比较简单粗暴,直接使用 EventBus 进行消息接收的回调。

他 jar 里集成了 EventBus,项目中也有了 EventBus,这一点还是蛮坑的。换想一下,这里也是为了方便接收,不然会有很多相互应用,各种耦合,不过使用过 EventBus 的小伙伴,应该知道,如果维护不好 EventBus 会导致逻辑非常的混乱,维护和拓展异常困难。

 * 接收消息事件* 目前只支持文字消息,后面再进行优化** @param event 消息事件*/
public void onEventMainThread(MessageEvent event) {Message message = event.getMessage();switch (message.getContentType()) {case text:// 处理文字消息String userName = ((UserInfo) message.getTargetInfo()).getUserName();if (TextUtils.equals(userName, mUserName)) {// 当收到的消息是官方消息才进行更新UIgetViewModel().receiveMessage(message);}default:LogUtils.i("office", message.getFromType());break;}
}

根据 contentType 区分消息实体的类型,并做相应的处理。 在需要接收消息的地方进行事件的注册和取消注册。

JMessageClient.registerEventReceiver(this, 200);
JMessageClient.unRegisterEventReceiver(this);

3. 单聊

这里引入一个 Conversation 概念,当你与他人聊天必然会建立会话,那会话的消息和聊天的对象都会存在这个会话中,那单聊则通过传入 userName 进行联系,由此可见 userName 的唯一性和重要性。

因为刚进去需要获取历史信息,所以通过 conversion 获取所有的消息,并展示在界面上。

mConversation = Conversation.createSingleConversation(userName);
JMessageClient.getUserInfo(userName, this);
if (mConversation == null) {getView().finish();
}
// 获取本地所有的消息
msgCount = mConversation.getAllMessage().size();
List<Message> messagesFromNewest = mConversation.getMessagesFromNewest(curCount, LIM_COUNT);
curCount = messagesFromNewest.size();
// 第一条消息是正序的,需要反转一下
Collections.reverse(messagesFromNewest);
for (Message message : messagesFromNewest) {MessageDirect direct = message.getDirect();if (direct == MessageDirect.send) {addSendMessage(message);} else {addReceiverMessage(message);}
}

4. 群聊

群聊与单聊有点类似,不过建立会话的前提参数不是 userName, 而是 groupId 群的唯一标识 ID。

mConversation = Conversation.createGroupConversation(groupId);
if (mConversation == null) {getView().finish();return;
}
List<Message> messagesFromNewest = mConversation.getMessagesFromNewest(curCount, LIM_COUNT);
curCount = messagesFromNewest.size();
Collections.reverse(messagesFromNewest);
for (Message message : messagesFromNewest) {MessageDirect direct = message.getDirect();if (direct == MessageDirect.send) {addSendMessage(message);} else {addReceiverMessage(message);}
}

具体的代码很相似,只是创建的过程不一样,不再赘述。

总结

前段时间王欣、字节跳动等都推出社交软件,不过在微信平台被封杀,这点还是蛮狠的,不过另一方面反映出社交 聊天在各个行业应用的广泛,无论是金融、教育、销售等软件都需要一个 IM 作为用户与用户、用户和平台之间的沟通桥梁,因此作为开发者,还是要多多学习一下 IM 相关的知识。当然自己能独立完成最好,如果没有经历或者暂时能力不够,又或者公司急切需要集成 IM 功能,建议你可以考虑极光 IM 服务,其推送服务做得还是蛮不错的,而且还在不断的维护迭代中,有时间不妨尝试一波吧!

WeaponApp
APK下载

本文为极光征文参赛文章

『技术分享』-- 使用极光 IM 构建聊天功能相关推荐

  1. 『技术分享』—— 我的第一个微信小程序-趣闻

    前言 我去年3月份写了一个小项目 快毕业了,撸一个小项目(趣闻) 作为自己的毕设项目,当时接触 Android 也才半年的时间,所以写的略简单,偏入门级别的,有兴趣的话可以 clone 看一下.趣闻 ...

  2. 『中级篇』Docker Cloud自动构建 Docker image(55)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』Docker Cloud自动构建 Docker image(55) 一步一步的接近下面这个图,来通过时间的方式git ...

  3. 『教程分享』不节食减肥教程,职场教学,U盘制作,吉他教程,文字语音生成,和平精英打野小思路教学

    [阿八个人博客]公众号 2020-06-11 08:54:40 『苹果软件』私家书藏 一款图书管理工具 对于喜欢看书的小伙伴们来说是读书神器 可以扫码标记藏书,也可以知道是否正版书籍,在书店买书的时候 ...

  4. 『教程分享』卡QQ空间小尾巴,全部QQ空间小尾巴代码分享

    全部小尾巴分享:复制代码发到QQ空间即可看到效果! 『教程分享』卡QQ空间小尾巴,全部QQ空间小尾巴代码分享 代码: [em]e10001[/em]guguaiwu.cn [em]e10002[/em ...

  5. 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)

    1.点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量).消息多端同步.消息顺序保证等,是典型的IM技术难点. 就像即时通讯网整理的以下IM开发干货系列一样: <I ...

  6. 微信技术分享:微信的海量IM聊天消息序列号生成实践(容灾方案篇)

    1.引言 在本文的上篇<微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)>中介绍了微信的消息序列号生成器 seqsvr 的算法原理.架构核心思想,以及 seqsvr 随着业 ...

  7. 最新『资源分享』IT视频教程

    各位,这是我整理的免费视频教程,每天都会有更新,还有电子书,也是免费的,谢谢大家关注~ O(∩_∩)O~已经做了相关的分类,大家可以根据自己感兴趣的方向浏览下载哦! Linux: LAMP兄弟连李明老 ...

  8. 创建二级索引_技术分享 | InnoDB 排序索引的构建

    原创: 管长龙 译 爱可生开源社区 3天前 作者:Satya Bodapati 从 MySQL 5.7 开始,开发人员改变了 InnoDB 构建二级索引的方式,采用自下而上的方法,而不是早期版本中自上 ...

  9. 点击ride界面edit空白_『技术锦囊』如何在SOLIDWORKS界面调用宏程序?

    SOLIDWORKS宏程序为广大设计开发者提供了非常便捷的开发环境,合理的使用宏程序除了可以节约时间还可以减少很多不必要的操作,例如一键替换图纸等.此次便与大家讲讲,如何在SOLIDWORKS界面调用 ...

最新文章

  1. code vs 集成tfs_关于编译器和集成开发环境,一文给你讲明白!
  2. 使用Chrome的inspect element注意事项
  3. 执行work count程序报错Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  4. 聚数引智,承德大数据产业对接交流会将于2019中国国际数字经济博览会期间召开...
  5. 数据库笔记01:SQL Server系统概述
  6. 英特尔商用攻略升级:企业如何趟平信息化建设这条路?
  7. 推荐系统系列教程之十:协同过滤中的相似度计算方法有哪些?
  8. 运用高斯核模型进行最小二乘回归_数据科学 | 第8讲:模型选择与正则化
  9. 一块神奇的树莓派电子板竟让我学会了Linux系统
  10. 【王道计组笔记】I/O查询方式
  11. .Net中使用OracleDataAdapter
  12. MATLAB compatloose,麻烦帮忙看下这个视频
  13. pyqt5设置dialog的标题_PyQt5教程——对话框(6)
  14. 带你破解时间管理的谜题
  15. citespace:Your version‘s status cannot be verified due to network issue. Check your network conne
  16. 将某个GitLab上的项目同步到另一个GitLab
  17. 收藏一个字帖生成器,在线生成字帖
  18. java 获取周六周日_JS实现获取当前所在周的周六、周日示例分析
  19. Python使用ffmpy将amr格式的音频转化为mp3格式
  20. 绝妙四道题(C语言)

热门文章

  1. unity3d 模拟电脑实现_基于Unity3D的机器人仿真实验系统
  2. XMind、Axure、Visio这三个软件产品经理需要掌握哪个?要掌握到什么程度?
  3. 区块链系统:点对点交易原理
  4. Android大作业:安卓开发图书管理系统APP
  5. 职业生涯发展理论(精)
  6. 如何搭建用户生命周期模型
  7. 大学毕业4年-回顾和总结(7)-全局观
  8. SQL视图View的总结和使用
  9. 如何制作查分系统-Leo老师
  10. 【文本匹配】ESIM模型