在聊天应用程序中,会话是单聊、群聊或者聊天室所有消息的集合。除了发送和接收消息外,即时通讯 IM SDK 还支持以会话为单位对本地的消息数据进行管理,如获取与管理未读消息、删除历史消息和搜索历史消息等。
本页介绍如何使用即时通讯 IM SDK 实现这些功能。
即时通讯 IM SDK 通过 ChatManager
类管理用户设备上存储的消息会话数据。SDK 内部使用 SQLCipher 保存本地消息,方便消息处理。
以下是主要功能:
开始前,请确保满足以下条件:
本节介绍如何实现管理消息。
调用 getAllConversations
方法获取本地所有会话:
Map<String, Conversation> conversations = ChatClient.getInstance().chatManager().getAllConversations();
如果出现偶尔返回的 conversations
的 size
为 0
,很有可能是未调用 ChatClient.getInstance().chatManager().loadAllConversations()
。
参考如下代码,从本地数据库中获取指定会话中的消息:
// `conversationId` 为会话 ID,在单聊时为对端用户 ID、群聊时为群组 ID,聊天室时为聊天室 ID。
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(conversationId);
// 获取指定会话中的所有消息
List<ChatMessage> messages = conversation.getAllMessages();
// SDK 初始化时,为每个会话加载 1 条聊天记录。如需更多消息,请到数据库中获取。该方法获取 `startMsgId` 之前的 `pagesize` 条消息,SDK 会将这些消息自动存入此会话,app 无需添加到会话中。
List<ChatMessage> messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize);
参考如下代码,获取指定会话的未读消息数量:
// `conversationId` 为会话 ID,在单聊时为对端用户 ID、群聊时为群组 ID,聊天室时为聊天室 ID。
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(conversationId);
conversation.getUnreadMsgCount();
参考如下代码,获取应用中所有会话的未读消息数量:
ChatClient.getInstance().chatManager().getUnreadMessageCount();
参考如下代码,清零指定的会话或所有会话的未读消息:
// `conversationId` 为会话 ID,在单聊时为对端用户 ID、群聊时为群组 ID,聊天室时为聊天室 ID。
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(conversationId);
// 指定会话消息未读数清零。
conversation.markAllMessagesAsRead();
// 将一条消息置为已读。
conversation.markMessageAsRead(messageId);
// 将所有未读消息数清零。
ChatClient.getInstance().chatManager().markAllConversationsAsRead();
SDK 提供两个接口,分别可以删除本地会话和聊天记录或者删除当前用户在服务器端的会话和聊天记录。
要同时在本地设备上删除会话和消息,请调用 deleteConversation
和 removeMessage
:
// `conversationId` 为会话 ID,在单聊时为对端用户 ID、群聊时为群组 ID,聊天室时为聊天室 ID;`deleteMessages` 为是否删除会话的本地消息,删除传 `true`。
ChatClient.getInstance().chatManager().deleteConversation(conversationId, deleteMessages);
// 删除当前会话的指定历史消息。
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(conversationId);
conversation.removeMessage(deleteMsg.msgId);
// 删除指定会话,如果需要保留聊天记录,`isDeleteServerMessages` 传 `false`。
ChatClient.getInstance().chatManager().deleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new CallBack() {
@Override
public void onSuccess() {
}
@Override
public void onError(int code, String error) {
}
});
调用 searchMsgFromDB
按关键字、时间戳和消息发送方搜索消息:
List<ChatMessage> messages = conversation.searchMsgFromDB(keywords, timeStamp, maxCount, from, Conversation.SearchDirection.UP);
调用 importMessages
以将多条消息导入指定对话。这适用于聊天用户想要将历史消息导入到本地数据库中的场景。
ChatClient.getInstance().chatManager().importMessages(msgs);
如果你需要在本地会话中加入一条消息,比如收到某些通知消息时,可以构造一条消息写入会话。
例如插入一条无需发送但有需要显示给用户看的内容,类似 “XXX 撤回一条消息”、“XXX 入群”、“对方正在输入” 等。
示例代码如下:
// 将消息插入到指定会话中。
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(conversationId);
// 插入指定消息
conversation.insertMessage(message);
// 或者,直接插入消息。
// ChatClient.getInstance().chatManager().saveMessage(message);
如果需要更新消息可以选用以下方法的任意一种:
// 直接通过 `ChatManager` 更新 SDK 本地数据库消息
ChatClient.getInstance().chatManager().updateMessage(message);
// 先获取会话,再更新 SDK 本地数据库会话中的消息
Conversation conversation = ChatClient.getInstance().chatManager().getConversation(conversationId);
conversation.updateMessage(message);