
IM即时通讯
安全可靠、全球互通

实时音视频
流畅稳定、省钱省力
回答:
4.x 版本SDK 方案
定义 MessageInterceptor,使用 RongIM.setMessageInterceptor 进行注册。
MessageInterceptor 中返回 true 即为消费事件。
需要注意的是如果拦截并消费了信息,后续逻辑需要自己实现,如:通知,页面刷新等。
/** * 设置接收消息时的拦截器 * * @param messageInterceptor 拦截器 */ public void setMessageInterceptor(MessageInterceptor messageInterceptor)
/** * 接收消息的拦截器 */ public interface MessageInterceptor { /** * 收到消息处理的回调 * * @param message * @return true: 拦截, 不显示 false: 不拦截, 显示此消息。 * 此处只处理实时收到消息时,在界面上是否显示此消息。 * 在重新加载会话页面时,不受此处逻辑控制。 * 若要永久不显示此消息,需要从数据库删除该消息,在回调处理中调用 {@link #deleteMessages(int[], RongIMClient.ResultCallback)}, * 否则在重新加载会话时会将此消息重新加载出来。 */ boolean intercept(Message message); }
5.x 版本SDK 方案
实现
RongIM.getInstance().setMessageInterceptor(interceptor);
即可;
/** * 接收实时或者离线消息拦回调。 * <p> * 注意: <br> * 1. 针对接收离线消息时,服务端会将 200 条消息打成一个包发到客户端,客户端对这包数据进行解析。<br> * 2. hasPackage 标识是否还有剩余的消息包,left 标识这包消息解析完逐条抛送给 App 层后,剩余多少条。<br> * 如何判断离线消息收完:<br> * 1. hasPackage 和 left 都为 0;<br> * 2. hasPackage 为 0 标识当前正在接收最后一包(200条)消息,left 为 0 标识最后一包的最后一条消息也已接收完毕。 * </p> * * @param message 接收到的消息对象 * @param left 每个数据包数据逐条上抛后,还剩余的条数 * @param hasPackage 是否在服务端还存在未下发的消息包 * @param offline 消息是否离线消息 * @return true 用户拦截此次消息,sdk不再做任何分发处理,false,交由sdk处理 */ boolean interceptReceivedMessage(Message message, int left, boolean hasPackage, boolean offline);