实现后的效果:
这个广播接收者主要用来在底部菜单上面显示未读的消息数目。
/**
*
* 新消息广播接收者
*
* @author
*
*/
private class NewMessageBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 主页面收到消息后,主要为了提示未读,实际消息内容需要到chat页面查看
// msgid和from是从环信的jar中传过来的
String from = intent.getStringExtra("from");
// 消息id
String msgId = intent.getStringExtra("msgid");
EMMessage message = EMChatManager.getInstance().getMessage(msgId);
// ========================================================================================
Log.i(TAG, "msgid:" + msgId);
Log.i(TAG, "from:" + from);
Log.i(TAG, " message.getFrom():" + message.getFrom());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Log.i(TAG,
" message.getMsgTime():" + sdf.format(message.getMsgTime()));
Log.i(TAG, "message.getTo():" + message.getTo());
/*
* Log.i(TAG, "ChatActivity.activityInstance.getToChatUsername()):"
* + ChatActivity.activityInstance.getToChatUsername());
*
* Log.i(TAG, "ChatActivity.activityInstance.getToChatUsername()):"
* + ChatActivity.activityInstance.getToChatUsername());
*/
// =======================================================================
// BUG修复 在聊天页面对方发送消息过来时不立即显示内容的BUG
if (ChatActivity.activityInstance != null) {
if (message.getChatType() == ChatType.GroupChat) {
if (message.getTo().equals(
ChatActivity.activityInstance.getToChatUsername())) {
return;
}
} else {
if (from.equals(ChatActivity.activityInstance
.getToChatUsername())) {
return;
}
}
}
// 注销广播接收者,否则在ChatActivity中会收到这个广播
// onReceive()方法中调用abortBroadcast,表示将这个广播截断,后面的广播接受者无法再接收这个消息
abortBroadcast();
notifyNewMessage(message);
updateUnreadLabel();
// 下面的代码有点小问题
// 当前页面如果为聊天历史页面,刷新此页面
if (chatHistoryFragment != null) {
chatHistoryFragment.refresh();
}
}
}
创建一个内部类继承自:BroadcastReceiver,内部类实现的广播接收者不需要在清单文件中配置。首先从SDK获取消息来自哪里(from)和消息的id(msgid)。根据msgid得到EMMessage的实例message,这个message可以获取发送时间等等的信息。然后调用abortBroadcast方法,这样后面的广播接收者就不会再收到这个广播了。
通过代码注册:
msgReceiver = new NewMessageBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager
.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver, intentFilter);
必须先调用:
EMChat.getInstance().setAppInited();