浏览 SDKs · Android
SDKsAndroid

消息概览

了解 Android SDK 的 Message 模型、消息生命周期和消息监听。

复制

Android SDK 使用 Message 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 Message 不会发送消息,发送成功也不代表其他客户端已经完成接收。

消息列表通常以 clientMsgID 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。Message 本身不包含 conversationID,会话 ID 来自当前会话、历史查询参数或消息事件上下文。

消息处理流程

阶段Android API 或回调说明
创建MessageManager.create*Message()创建待发送的 Message 对象,不写入服务端,也不会触发新消息回调。
发送sendMessage()sendMessageNotOss()单聊传入 recvUid,群聊传入 recvGid
接收OnAdvanceMsgListener处理实时、离线、在线消息以及撤回、删除和已读回执等变化。
查询历史消息、按 ID 查找或搜索 API查询返回当次读取到的消息,不代替实时消息监听。
更新撤回、删除、修改、置顶、已读和本地扩展 API分别处理 API 结果、对应事件和必要的列表重新查询。

消息事件由接收消息页面统一说明。应用应在共享消息状态层设置一次 OnAdvanceMsgListener,再把新消息、离线消息、撤回和删除等变化分发给各页面;本概览页不重复设置 listener。

Message 字段

创建、发送、接收和查询返回的消息对象都是 Message。常用字段如下:

字段类型说明
clientMsgIDString客户端消息 ID,用于列表去重、状态更新和定位消息。
serverMsgIDString服务端消息 ID;消息尚未成功发送时可能没有有效值。
sessionTypeint会话类型;结合 recvIDgroupID 判断单聊或群聊。
sendIDString发送者用户 ID。
recvIDString单聊接收方用户 ID。
groupIDString群聊对应的群组 ID。
msgFromint标识消息是用户级别还是系统级别。
contentTypeint消息类型,使用 MessageType 常量判断内容字段。
createTimelong消息对象创建时间,Android SDK 模型注释约定为纳秒。
sendTimelong消息发送时间,Android SDK 模型注释约定为毫秒。
seqint服务端消息序号。
statusint发送状态,使用 MessageStatus 常量判断。
isReadboolean当前客户端保存的已读状态。
platformIDint发送消息的客户端平台。
senderNicknameString消息创建或发送时记录的发送者昵称。
senderFaceUrlString消息创建或发送时记录的发送者头像 URL。
offlinePushOfflinePushInfo离线推送内容。
attachedInfoStringSDK 附加信息。
extObjectAndroid 消息附加字段。
exObject消息附加字段。
localExObject仅保存在当前设备的消息扩展字段。

消息正文位于与 contentType 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型:

消息内容对应字段
文本、富文本textElemadvancedTextElem
图片、音频、视频、文件pictureElemsoundElemvideoElemfileElem
@ 消息、回复消息atTextElemquoteElem
合并转发mergeElem
名片、位置、表情cardElemlocationElemfaceElem
自定义消息customElem
通知、输入状态和附加状态notificationElemtypingElemattachedInfoElem

创建和发送不同内容

发送一条消息分为两个步骤:

  1. 调用对应内容类型的 create*Message() 方法,获得待发送的 Message
  2. 将该 Message 传给发送消息。单聊设置 recvUid,群聊设置 recvGid

下表列出了可创建的消息类型及其对应页面:

内容页面
文本与富文本创建文本消息创建富文本消息
@ 消息创建 @ 消息
图片、音频、视频和文件创建图片消息创建文件消息
名片、位置和表情创建名片消息创建位置消息创建表情消息
回复、转发和合并转发创建回复消息创建转发消息创建合并转发消息
自定义业务内容创建自定义消息

发送本地路径或本地文件创建的媒体消息时,调用 sendMessage(),SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 create*MessageByURL() 方法,再按发送已上传的媒体消息发送,无需再次上传媒体文件。

按任务查找页面

任务页面
发送普通消息或已上传的媒体消息发送消息发送不经 OSS 的消息
接收实时、离线和在线消息接收消息接收自定义业务消息
加载历史消息或反向加载消息加载历史消息反向加载历史消息
按 ID 定位或搜索消息按 ID 查找消息搜索消息
删除、撤回、修改或置顶消息删除消息撤回消息修改消息设置消息置顶
管理会话未读数和群聊已读回执标记会话已读上报群消息已读查询群消息已读成员
上报或查询输入状态更新输入状态查询输入状态
插入、删除或扩展仅当前设备可见的消息插入本地单聊消息删除本地消息设置消息本地扩展

状态同步边界

变化处理位置合并方式
新消息和离线消息接收消息先确定目标会话,再按 clientMsgID 合并。
消息撤回onRecvMessageRevokedV2按撤回信息中的消息 ID 更新原消息状态。
消息删除onMsgDeleted按消息 ID 从当前会话列表移除。
C2C 和群聊已读回执onRecvC2CReadReceiptonRecvGroupMessageReadReceipt更新对应消息或会话的已读状态。
消息扩展变化onRecvMessageExtensionsChanged 等回调按消息 ID 更新扩展字段,不替换整条消息的正文。
输入状态更新输入状态按会话和用户更新临时状态,不写入普通消息列表。

对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 OnAdvanceMsgListener 同步相关回调;必要时重新查询消息列表。