首先,贴上官方文档地址:
API 介绍
除了内建消息类型以外,SDK 还支持收发自定义消息类型。SDK 不负责定义和解析自定义消息的具体内容,解释工作由开发者完成。SDK 会将自定义消息存入消息数据库,会和内建消息一并展现在消息记录中。
为了使用更加方便,自定义消息采用附件的方式展示给开发者。体现在 IMMessage 类中,自定义消息的内容会被解析为 MsgAttachment 对象,由于 SDK 并不知道自定义消息的格式,第三方 App 需要注册一个自定义消息解析器。当第三方 App 调用查询查询消息历史的接口,或者是 SDK 收到消息通知第三方 App 时,就能将自定义消息内容转换为一个 MsgAttachment 对象,然后就可以同操作图片消息等带附件消息一样,操作自定义消息了。
与 IMMessage 一致,为了增加自定义消息的灵活性,SDK 还提供了对其生命周期和推送参数的一些配置选项,开发者可以自主设定一条自定义消息是否要保存云端消息记录,是否要漫游,发送时是否要多端同步等的配置选项 CustomMessageConfig。
下面说说具体做法:
1.定义CustomAttachmentType
public interface CustomAttachmentType {
// 多端统一
int Guess = 1;
int SnapChat = 2;
int Sticker = 3;
int RTS = 4;
int RedPacket = 5;
int OpenedRedPacket = 6;
int MyOrderCustomMsg = 10002;
//这里需要注意。需要与后台设置统一。后台设置的时候。不是100的那个自定义消息类型,而是消息body中的type
}
2.定义CustomAttachParser
3.定义MyOrderAttachment
package com.netease.nim.demo.session.extension;
import android.util.Log;
import com.alibaba.fastjson.JSONObject;
public class MyOrderAttachment extends CustomAttachment{
public String title;
public String content;
public MyOrderAttachment() {
super(CustomAttachmentType.MyOrderCustomMsg);
}
@Override
protected void parseData(JSONObject data) {
// Log.d("flag","MyOrderAttachment==="+data.toString());
title=data.getString("title");
content=data.getString("content");
}
@Override
protected JSONObject packData() {
JSONObject data = new JSONObject();
data.put("title",title);
data.put("content",content);
return data;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
4.定义MsgViewHolderMyOrder
package com.netease.nim.demo.session.viewholder;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.iliexiang.dianjing.R;
import com.iliexiang.dianjing.dialog.RobOrderDialog;
import com.iliexiang.dianjing.ui.order.public_order.PublicOrderDetailActivity;
import com.iliexiang.dianjing.ui.order.rob.RobCenterActivity;
import com.iliexiang.dianjing.utils.StringUtil;
import com.iliexiang.dianjing.utils.ToastUtils;
import com.netease.nim.demo.session.SessionHelper;
import com.netease.nim.demo.session.extension.MyOrderAttachment;
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase;
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;
public class MsgViewHolderMyOrder extends MsgViewHolderBase {
private MyOrderAttachment attachment;
private TextView tv_order_title;
private TextView tv_order_content;
private LinearLayout ll_msg_order;
public MsgViewHolderMyOrder(BaseMultiItemFetchLoadAdapter adapter) {
super(adapter);
}
@Override
protected int getContentResId() {
//自己定义的布局
return R.layout.im_msg_order;
}
@Override
protected void inflateContentView() {
ll_msg_order = findViewById(R.id.ll_msg_order);
tv_order_title = findViewById(R.id.tv_order_title);
tv_order_content = findViewById(R.id.tv_order_content);
}
@Override
protected void bindContentView() {
attachment = (MyOrderAttachment) message.getAttachment();
tv_order_title.setText(attachment.getTitle());
if (StringUtil.isNull(attachment.getContent())) {
tv_order_content.setVisibility(View.GONE);
} else {
tv_order_content.setVisibility(View.VISIBLE);
tv_order_content.setText(attachment.getContent());
}
ll_msg_order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//点击事件
}
});
}
//若是要自己修改气泡背景
// 当是发送出去的消息时,内容区域背景的drawable id
// @Override
protected int rightBackground() {
return R.drawable.shape_border_gray3_r5;
}
@Override
protected int leftBackground() {
return R.drawable.shape_border_gray3_r5;
}
}
5.在SessionHelper,注册
大功告成