怎么用广播接收离线信息?

问题描述

我用的是EaseUI那个Library,然后仿EaseUISimpleDemo写的,可是这个里面没有广播接收消息,程序在后台的时候不能收到发过来的消息,有没有教程?本人小白,求大神指导下。。。感谢。

解决方案

我是copy过来的代码。帮忙看下,下面的对么     那个msgid不用自己设置么,?       //初始化环信      private void initHuanXin() {          EaseUI.getInstance().init(getApplicationContext());//环信聊天          EMChat.getInstance().setAppInited();                    //注册接收新消息的监听广播          //只有注册了广播才能接收到新消息,目前离线消息,在线消息都是走接收消息的广播(离线消息目前无法监听,在登录以后,接收消息广播会执行一次拿到所有的离线消息)          NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver();          IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());          intentFilter.setPriority(3);          registerReceiver(msgReceiver, intentFilter);                    //注册接收ack回执消息的BroadcastReceiver          EMChatManager.getInstance().getChatOptions().setRequireAck(true);//如果用到已读的回执需要把这个flag设置成true          IntentFilter ackMessageIntentFilter = new IntentFilter(EMChatManager.getInstance().getAckMessageBroadcastAction());          ackMessageIntentFilter.setPriority(3);          registerReceiver(ackMessageReceiver, ackMessageIntentFilter);                     }            //注册接收ack回执消息的BroadcastReceiver      private BroadcastReceiver ackMessageReceiver = new BroadcastReceiver() {                    @Override          public void onReceive(Context context, Intent intent) {              abortBroadcast();              String msgid = intent.getStringExtra("msgid");              String from = intent.getStringExtra(openid);              EMConversation conversation = EMChatManager.getInstance().getConversation(from);              if (conversation != null) {                  // 把message设为已读                  EMMessage msg = conversation.getMessage(msgid);                  if (msg != null) {                      msg.isAcked = true;                  }              }                        }      };    //注册接收新消息的监听广播    private class NewMessageBroadcastReceiver extends BroadcastReceiver {          @Override          public void onReceive(Context context, Intent intent) {              // 注销广播              abortBroadcast();                     // 消息id(每条消息都会生成唯一的一个id,目前是SDK生成)              String msgId = intent.getStringExtra("msgid");              //发送方              String username = intent.getStringExtra(openid);//openid为用户ID              // 收到这个广播的时候,message已经在db和内存里了,可以通过id获取mesage对象              EMMessage message = EMChatManager.getInstance().getMessage(msgId);              EMConversation    conversation = EMChatManager.getInstance().getConversation(username);              // 如果是群聊消息,获取到group id              if (message.getChatType() == ChatType.GroupChat) {                  username = message.getTo();              }              if (!username.equals(username)) {                  // 消息不是发给当前会话,return                  return;              }          }      }
解决方案二:
在applicaiton中注册消息监听: /**     * 全局事件监听     * 因为可能会有UI页面先处理到这个消息,所以一般如果UI页面已经处理,这里就不需要再次处理     * activityList.size() <= 0 意味着所有页面都已经在后台运行,或者已经离开Activity Stack     */    protected void registerEventListener() {        eventListener = new EMEventListener() {            private BroadcastReceiver broadCastReceiver = null;                       @Override            public void onEvent(EMNotifierEvent event) {                EMMessage message = null;                if(event.getData() instanceof EMMessage){                    message = (EMMessage)event.getData();                    EMLog.d(TAG, "receive the event : " + event.getEvent() + ",id : " + message.getMsgId());                }                               switch (event.getEvent()) {                case EventNewMessage:                    //应用在后台,不需要刷新UI,通知栏提示新消息                    if(!easeUI.hasForegroundActivies()){                        getNotifier().onNewMsg(message);                    }                    break;                case EventOfflineMessage:                    if(!easeUI.hasForegroundActivies()){                        EMLog.d(TAG, "received offline messages");                        List<EMMessage> messages = (List<EMMessage>) event.getData();                        getNotifier().onNewMesg(messages);                    }                    break;                // below is just giving a example to show a cmd toast, the app should not follow this                // so be careful of this                case EventNewCMDMessage:                {                                       EMLog.d(TAG, "收到透传消息");                    //获取消息body                    CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody();                    final String action = cmdMsgBody.action;//获取自定义action                                       //获取扩展属性 此处省略                    //message.getStringAttribute("");                    EMLog.d(TAG, String.format("透传消息:action:%s,message:%s", action,message.toString()));                    final String str = appContext.getString(R.string.receive_the_passthrough);                                       final String CMD_TOAST_BROADCAST = "easemob.demo.cmd.toast";                    IntentFilter cmdFilter = new IntentFilter(CMD_TOAST_BROADCAST);                                       if(broadCastReceiver == null){                        broadCastReceiver = new BroadcastReceiver(){                            @Override                            public void onReceive(Context context, Intent intent) {                                // TODO Auto-generated method stub                                Toast.makeText(appContext, intent.getStringExtra("cmd_value"), Toast.LENGTH_SHORT).show();                            }                        };                                             //注册广播接收者                        appContext.registerReceiver(broadCastReceiver,cmdFilter);                    }                    Intent broadcastIntent = new Intent(CMD_TOAST_BROADCAST);                    broadcastIntent.putExtra("cmd_value", str+action);                    appContext.sendBroadcast(broadcastIntent, null);                                       break;                }                case EventDeliveryAck:                    message.setDelivered(true);                    break;                case EventReadAck:                    message.setAcked(true);                    break;                // add other events in case you are interested in                default:                    break;                }                           }        };               EMChatManager.getInstance().registerEventListener(eventListener);    }
解决方案三:
不管用。。

时间: 2025-01-31 02:13:05

怎么用广播接收离线信息?的相关文章

WEBIM中怎么接收离线信息

问题描述 给离线的好友发信息,好友上线后看不到发送的信息 解决方案 消息发送成功了么? 在线接收消息都是可以的么?解决方案二:> forum.php?mod=redirect&goto=findpost&pid=2067&ptid=913消息发送成功了么? 在线接收消息都是可以的么?在线互相都能接收到消息解决方案三:环信的webim试过了么? 你可以试试,看看webim的代码,对比一下解决方案四:> forum.php?mod=redirect&goto=fin

关于接收离线信息:当A未在线的时候 B给A发了信息,待A再登录的时候,收到这些离线消息在哪里可以监听到?

问题描述 当A未在线的时候 B给A发了信息,待A再登录的时候,收到这些离线消息在哪里可以监听到?打印log后发现 DemoHXSDKHelper.initEventListener();中EMNotifierEvent.Event.EventOfflineMessage 并未触发,而且在MainActivity中的onEvent(EMNotifierEvent event) {} 也未监听到触发EventOfflineMessage. 我应该到那里才可以监听到这一条(或多条)信息呢? 解决方案

远程广播的调用-在用远程广播接收消息的过程中有时候收到广播的信息 有时候收不到是什么原因?求大哥们指点

问题描述 在用远程广播接收消息的过程中有时候收到广播的信息 有时候收不到是什么原因?求大哥们指点 在用远程广播接收消息的过程中有时候收到广播的信息 有时候收不到是什么原因?也就是 有时候没有调用OnReceive方法 . 解决方案 看看是不是网络不太稳定造成的. 解决方案二: 没有经过 网络请求 只是在本地,只不过是做系统软件的

环信2.x,参考文档和官网上的视频做的注册广播接收消息,但是接收消息要重进聊天页面,而且还有报错说Are you missing a call to unregisterReceiver.

问题描述 上部分代码,全部代码在附件://只有注册了广播才能接收到新消息,目前离线消息,在线消息都是走接收消息的广播(离线消息目前无法监听,在登录以后,接收消息广播会执行一次拿到所有的离线消息)        NewMessageBroadcastReceiver msgReceiver = new NewMessageBroadcastReceiver();        IntentFilter intentFilter = new IntentFilter(EMChatManager.ge

ASP.net 2.0下应用程序离线信息

asp.net|程序 ASP.net 2.0 有一个新特性,就是支持应用程序离线信息. 什么是离线信息呢?以前我们在更新应用程序,导至asp.net应用程序重启,应用程序的用户通常会显示不友好的错误信息,或者IE一直显示加载状态. ASP.net 2.0支持您在应用程序根目录下放置一个app_offline.htm文件,用户请求时,系统会检查是否有这个文件存在,如果有,系统会将app_offline.htm文件的内容直接返回给用户. app_offline.htm的内容可以更改成任何您需要的内容

Win7系统任务栏没显示QQ图标却可以接收离线文件怎么办

  Win7系统任务栏没显示QQ图标却可以接收离线文件怎么办           1.按"ctrl+alt+z"快捷键调出QQ面板; 2.在QQ面板中点击左下角的"系统设置"按钮; 3.在打开的"系统设置"窗口中,切换到"主面板"标签页中,在"在任务栏通知区域显示QQ图标"选项前面打勾.

client发的请求接收返回信息时用send来接收,其余的由receive来接收,怎么改?求大神帮忙

问题描述 client发的请求接收返回信息时用send来接收,其余的由receive来接收,怎么改?求大神帮忙 sever的请求都友client的receive来接收,client发的请求接收返回信息时用send来接收,怎么改下?求大神帮忙,我只会大概写了下代码,菜鸟急需用! package test; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; impo

ajax-我这段代码本页面可显示出传递的信息,但是在被传递页面中却无法接收到信息呢?谢谢!

问题描述 我这段代码本页面可显示出传递的信息,但是在被传递页面中却无法接收到信息呢?谢谢! <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Untitled Document</title> <script type="text/javascript&quo

python在windows下实现ping操作并接收返回信息的方法_python

本文实例讲述了python在windows下实现ping操作并接收返回信息的方法.分享给大家供大家参考.具体分析如下: 这段python代码调用windows下的ping命令,通过subprocess在其子进程里面实现,由于windows下的ping和linux下的ping返回的消息不太一样,所以这段python代码要想在linux下运行,需要修改一下正则匹配 复制代码 代码如下: import subprocess   import re p = subprocess.Popen(["ping