弯路:之前用的不是单聊和群聊的消息,都用的是消息发送Txt格式,里面价格setAttribute来判断是什么动作,但是在MainActivity里面获取会话的时候,这些动作数都加上了,所以使用透传加以区分
IM消息透传
透传消息能做什么:头像,昵称的更新等,可以把透传消息理解为一条指令,通过发送这条指令给对方,告诉对方要做的action,收到消息可以自定义处理的一种消息。(透传消息不会存入本地数据库中,所以在UI上是不会显示的)
发送方:
EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);
//支持单聊和群聊,默认单聊,如果是群聊添加下面这行
cmdMsg.setChatType(ChatType.Chat);
String action="Posting";//action可以自定义,在广播接收时可以收到
CmdMessageBody cmdBody=new CmdMessageBody(action);
cmdMsg.setReceipt(frist_floor_dd_id);//发送给某个人
cmdMsg.setAttribute("Posting", js_info);//将动态信息发送给对方
cmdMsg.setAttribute("PostingMsg", "PostingMsg");//将动态信息发送给对方
cmdMsg.addBody(cmdBody);
EMChatManager.getInstance().sendMessage(cmdMsg, new EMCallBack(){
@Override
public void onError(int arg0, String arg1) {
}
@Override
public void onProgress(int arg0, String arg1) {
}
@Override
public void onSuccess() {
}
});
接收方:
在MainActivity里面的onResum()注册监听:
//-----------------------------CMD消息广播监听------------------------------
IntentFilter cmdIntentFilter = new IntentFilter(EMChatManager.getInstance().getCmdMessageBroadcastAction());
registerReceiver(cmdMessageReceiver, cmdIntentFilter);
在onStop()的时候,取消监听:
//-----------------------------CMD消息广播监听停止------------------------
unregisterReceiver(cmdMessageReceiver);
在方法里面的监听,判断antion的值,来判定是什么动作:(收到的信息,在数据库里面设置这个信息为未读,然后更新MainActivity和会话页面)
/**
* cmd消息BroadcastReceiver
*/
private BroadcastReceiver cmdMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
//获取cmd message对象
String msgId = intent.getStringExtra("msgid");
EMMessage message = intent.getParcelableExtra("message");
System.out.println("-------cmdMessageReceiver:"+"cmdMessageReceiver"+","+msgId+","+message.getBody().toString());
// -------cmdMessageReceiver:cmdMessageReceiver,183722420031455808,cmd:"Posting"
//获取消息body
CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody();
String aciton = cmdMsgBody.action;//获取自定义action
System.out.println("-------------aciton:"+aciton);
// -------------aciton:Posting
if(aciton.trim().equals("Posting")){
//获取扩展属性
if(message.getStringAttribute("PostingMsg","").trim().equals("PostingMsg")){
if(!message.getStringAttribute("Posting","").trim().equals("")){//贴子消息
System.out.println("-------------------re:"+"re0");
JSONObject post_js=message.getJSONObjectAttribute("Posting");
String unReadStatus="8";//8 未读,9已读
Boolean issuccess=SqlLiteDBManager.getManager().InsertPostingMessage(post_js,unReadStatus);
if(issuccess){
System.out.println("-------------------re:"+"re1");
if (MobileApplication.recentChatFlag) {// 聊天界面的消息
android.os.Message msg1 = RecentChatActivity.rhandler.obtainMessage();
msg1.what = 10;
msg1.sendToTarget();
}
if(MobileApplication.mainacflag){//未读消息提示
updateUnreadLabel();
new UpdateUnreadMsg().execute("");
}
}
}
}
}
} catch (EaseMobException e) {
System.out.println("-------cmd:"+e.toString());
e.printStackTrace();
}
}
};
adapter的判断:(设置已读,如果点击该动作,那么这个消息全部设置为已读,更新会话页面还有MainActivity)
viewHolder.chat_layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// SqlLiteDBManager.getManager().UpdatePostingRead(entity.getSqlite_id());//将贴子消息设为已读
SqlLiteDBManager.getManager().UpdatePostingAllRead();//将贴子消息设为已读
entity.setPosting_read_status("0");
entity.setPosting_unread_count("0");
RecentChatActivity.rca.recentChatAdapter.notifyDataSetChanged();
MainActivity.mainA.refreshUnreadMsg();
Intent i=new Intent(ctx,PostingMessageActivity.class);
ctx.startActivity(i);
}
});
设置全部已读:
/**
* 改变消息的读取状态
*/
public void UpdatePostingAllRead(){
ContentValues Values_update=new ContentValues();
Values_update.put("posting_read_status",0);
Values_update.put("unReadStatus",9);
<span style="background-color: rgb(204, 102, 204);">String whereClause="1==1";
String[] whereArgs={};</span>
UpdateValue(posting_replyTablename, Values_update, whereClause, whereArgs);
}