事件概览
集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。
OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。
连接 listener 是例外:OnConnListener 在 initSDK() 时传入,其完整处理见认证与管理登录会话。
集中设置 listener
下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。
public final class OpenIMEventCenter {
private final OpenIMClient client = OpenIMClient.getInstance();
private final OnUserListener userListener = buildUserListener();
private final OnFriendshipListener friendshipListener = buildFriendshipListener();
private final OnConversationListener conversationListener = buildConversationListener();
private final OnGroupListener groupListener = buildGroupListener();
private final OnAdvanceMsgListener messageListener = buildMessageListener();
private final OnCustomBusinessListener businessListener = buildBusinessListener();
private final OnSignalingListener signalingListener = buildSignalingListener();
public void registerBeforeLogin() {
client.userInfoManager.setOnUserListener(userListener);
client.friendshipManager.setOnFriendshipListener(friendshipListener);
client.conversationManager.setOnConversationListener(conversationListener);
client.groupManager.setOnGroupListener(groupListener);
client.messageManager.setAdvancedMsgListener(messageListener);
client.messageManager.setCustomBusinessListener(businessListener);
client.signalingManager.setSignalingListener(signalingListener);
}
}Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。
事件归属
| 事件范围 | 合并标识 | 完整处理页面 |
|---|---|---|
| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | 认证与管理登录会话 |
| 当前用户资料 | userID | 更新当前用户资料 |
| 在线状态 | userID | 订阅用户在线状态 |
| 好友关系与资料 | userID | 分页获取好友列表 |
| 好友申请 | fromUserID:toUserID | 获取收到的好友申请 |
| 黑名单 | userID | 拉黑用户、移出黑名单 |
| 会话列表 | conversationID | 获取会话列表 |
| 总未读数 | 当前登录用户 | 获取消息总未读数 |
| 输入状态 | conversationID:userID | 更新输入状态 |
| 群资料、成员和群申请 | groupID 或 groupID:userID | 群组概览 |
| 新消息、离线消息和在线消息 | clientMsgID,必要时结合 conversationID | 接收消息 |
| 消息撤回、删除、修改和置顶 | clientMsgID,必要时结合 conversationID | 消息概览 |
| 单聊已读回执 | conversationID:clientMsgID | 标记会话已读 |
| 自定义业务消息 | 业务协议中的幂等 ID | 接收自定义业务消息 |
| 通话 | roomID,参与者结合用户 ID | 处理通话事件 |
| 通话自定义信令 | roomID:eventID | 发送自定义信令 |
| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” |
查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。
监听初始化同步
同步生命周期属于应用级 OnConversationListener。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:
private OnConversationListener buildConversationListener() {
return new OnConversationListener() {
@Override
public void onNewConversation(List<ConversationInfo> conversations) {
mergeNewConversations(conversations);
}
@Override
public void onConversationChanged(List<ConversationInfo> conversations) {
mergeChangedConversations(conversations);
}
@Override
public void onTotalUnreadMessageCountChanged(int total) {
updateTotalUnreadCount(total);
}
@Override
public void onConversationUserInputStatusChanged(String payload) {
handleInputStatus(payload);
}
@Override
public void onSyncServerStart(boolean reinstall) {
setSyncState("syncing", 0, reinstall);
}
@Override
public void onSyncServerProgress(long progress) {
setSyncProgress(progress);
}
@Override
public void onSyncServerFinish(boolean reinstall) {
setSyncState("ready", 100, reinstall);
reloadVisibleSnapshots();
}
@Override
public void onSyncServerFailed(boolean reinstall) {
setSyncState("failed", 0, reinstall);
}
};
}reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。
本页是 onSyncServerStart、onSyncServerProgress、onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。
这个页面有帮助吗?