最近一个项目在接入融云1v1聊天,然后各种更换界面~先说下自定义消息,先上图,运行效果如下:
1、需要自定义message,继承 MessageContent
如:@MessageTag(value = "RCDTestMessage", flag = MessageTag.ISPERSISTED | MessageTag.ISCOUNTED) public class RCDTestMessage extends MessageContent {
注意:@MessageTag里面的value,如果需要收到服务端推送过来的自定义消息去展示或者和ios推送过来的自定义消息互通,value里面的值,一定要和后台还有ios端约定好,一模一样才可以。
flag 是 MessageTag.ISCOUNTED | MessageTag.ISPERSISTED 表示消息计数且存库。
下面是自定义message:
/** * 自定义消息的实体类 */ @MessageTag(value = "RCDTestMessage", flag = MessageTag.ISPERSISTED | MessageTag.ISCOUNTED) public class RCDTestMessage extends MessageContent { private String content; private String extra; /** * 实现 encode() 方法,该方法的功能是将消息属性封装成 json 串,再将 json 串转成 byte 数组,该方法会在发消息时调用 */ @Override public byte[] encode() { JSONObject object = new JSONObject(); object.put("content", content); object.put("extra", extra); try { return object.toString().getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } public RCDTestMessage() { } /** *覆盖父类的 MessageContent(byte[] data) 构造方法,该方法将对收到的消息进行解析, * 先由 byte 转成 json 字符串,再将 json 中内容取出赋值给消息属性。 */ public RCDTestMessage(byte[] data) { super(data); String jsonStr = null; try { jsonStr = new String(data, "UTF-8"); JSONObject object = JSON.parseObject(jsonStr);//注意,这里一定要用setContent和setExtra this.setContent(object.getString("content")); this.setExtra(object.getString("extra")); } catch (Exception e) { e.printStackTrace(); } } @Override public void writeToParcel(Parcel dest, int flags) { ParcelUtils.writeToParcel(dest, this.getContent());//注意,这里一定要用getContent和getExtra ParcelUtils.writeToParcel(dest, this.getExtra()); } public static final Creator<RCDTestMessage> CREATOR = new Creator<RCDTestMessage>() { @Override public RCDTestMessage createFromParcel(Parcel source) { return new RCDTestMessage(source); } @Override public RCDTestMessage[] newArray(int size) { return new RCDTestMessage[size]; } }; public RCDTestMessage(Parcel parcel) {//注意,这里一定要用setContent和setExtra this.setExtra(ParcelUtils.readFromParcel(parcel)); this.setContent(ParcelUtils.readFromParcel(parcel)); } @Override public int describeContents() { return 0; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getExtra() { return extra; }