即时聊天APP(六) - 消息的接收以及EventBus使用

通常我们在接收消息的时候会有声音和震动的提示,因此我也加了代码达到这样的效果,这就要用到EventBus了,当然这里我也用到了自定义的广播,所以首先在Mainfests文件中加入以下代码:

<receiver
android:name=".MylocalMessage"
android:process=":bmobpush" >
<intent-filter>
    <!-- 接收自定义广播的action -->
    <action android:name="cn.edu.sau.action.MESSAGE" />
</intent-filter>
</receiver>  

然后再写一个MessageEvent的Bean类对事件进行封装(这里只用到一个String类型的变量):

public class MessageEvent {
public final String message;
public MessageEvent(String message) {
    this.message = message;
}
}  

接下来我们在ImMessageHandler中接收到消息,并调用EventBus的post方法发送事件:

public class ImMessageHandler extends BmobIMMessageHandler{
/**
 * 接收在线消息
 * @param messageEvent
 */
@Override
public void onMessageReceive(MessageEvent messageEvent) {
    super.onMessageReceive(messageEvent);
    final Msg msg = new Msg(messageEvent.getMessage().getContent(), Msg.TYPE_RECEIVED);
    msg.setSender(MyUser.getUni());
    msg.setReceiver(messageEvent.getFromUserInfo().getUserId());
    int len = msg.getContent().length();
    // 过滤字符串
    String str="=[cn.bmob.newim.event.Message [email protected]";
    String str1="=[[email protected]";
    String str2 = msg.getContent().trim();
    int bl = str2.indexOf(str);
    int bo = str2.indexOf(str1);
    if(bl!=-1 || bo!=-1){
    }else{
        if(!msg.getReceiver().equals(Tips.Receiver))
            if(len > 10){
                String show = msg.getContent().substring(0,8);
                //使用EventBus发送通知,主Activity中处理事件
                EventBus.getDefault().post(new cn.edu.sau.joker.MessageEvent(msg.getReceiver()+":"+show+"......"));
            }else {
                EventBus.getDefault().post(new cn.edu.sau.joker.MessageEvent(msg.getReceiver()+":"+msg.getContent()));
            }
            //聊天界面添加消息
            Main.add(msg);
    }
}
/**
 * 接收离线消息,本程序不做处理
 * @param offlineMessageEvent
 */
@Override
public void onOfflineReceive(OfflineMessageEvent offlineMessageEvent) {
    super.onOfflineReceive(offlineMessageEvent);
}
}  

之前我在MainActivity中写了onMessageEvent方法(方法名字随便写,但是在方法前面要加@Subscribe注解,并且指定线程模型),用来接收事件并进行处理(发送广播):

//发送广播
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(cn.edu.sau.joker.MessageEvent event) {
    Intent intent = new Intent("cn.edu.sau.action.MESSAGE");
    intent.putExtra("msg",event.message);
    sendBroadcast(intent);
}  

然后我们在MylocalMessage(为什么我要起这么个类名,请参考Mainfests中的代码)中接收广播,并发送一个通知,指定铃声和震动事件:

public class MylocalMessage extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    // 收到广播时,发送一个通知
    String content = intent.getStringExtra("msg");
    NotificationManager manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
    Notification notify = new Notification.Builder(context)
            .setSmallIcon(R.drawable.icon)
            .setContentTitle("您收到一条消息")
            .setContentText(content)
            .build();
    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    notify.sound = uri;
    long[] vibrates = { 0, 200, 200, 200 };
    notify.vibrate = vibrates;
    manager.notify(1, notify);
}
}  

整个项目大致就是这样,欢迎大家的评论和指正(虽然我也听不进去),最后放源码APK .

原文地址:https://www.cnblogs.com/zqm-sau/p/10331978.html

时间: 2024-10-03 00:54:20

即时聊天APP(六) - 消息的接收以及EventBus使用的相关文章

即时聊天APP(五) - 聊天界面

设置界面没什么好说的,无非也就是加了个对话框来二次提醒用户,现在来讲讲聊天界面. 聊天界面初始化时会得到一个参数,就是对方的id,并设置在标题栏的位置,此界面也是使用RecyclerView来展示聊天消息. 首先为RecyclerView添加布局管理器(线性布局),并且为其添加适配器,写适配器之前先写类,消息类展示: public class Msg extends LitePalSupport { public static final int TYPE_RECEIVED = 0; // 接收

即时聊天APP(四) - 联系人和会话

联系人和会话界面使用的是RecyclerView进行滑动显示,并将好友列表存储至数据库,以供下次登录时使用,RecyclerView在后面我会详细介绍,这里略过. 联系人初始化时读取数据库并展示: //读取数据库中的好友列表 private void read__db() { ListlLi = LitePal.findAll(LList.class); for (int i=0 ; i<lLi.size(); i++){ //加个异常 try{ LList lLis = new LList(l

即时聊天APP(三) - 注册和登陆

注册和登陆大多都是一些用户名和密码的验证,所以放在一起写,注册代码: String account = accountEdit.getText().toString().trim(); String password = passwordEdit.getText().toString().trim(); String yanzheng = yanzhengma.getText().toString().trim(); if(account.equals("")||password.eq

即时聊天APP(二) - MainActivity

主活动包含三个Fragment,分别是会话.联系人和设置,初始布局隐藏所有碎片,然后把应该显示的显示出来: //隐藏所有Fragment private void hideAll(){ FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.hide(first) .hide(second) .hide(third) .commit(); } //初始化布局 pri

如何解决群聊(MUC)聊天室重复存储、接收自己发送的消息的问题

CHENYILONG Blog 如何#解决方案#群聊(MUC)聊天室重复存储.接收自己发送的消息 编号 项目 描述 1 问题描述 单聊没问题,群聊会出现自动回复的问题 数据库中存储的数据出现的问题 界面上出现的问题:类似自动回复.回音壁一样一模一样地回答.  2 问题产生的原因 3 群聊基本的原理示意图 聊天内容的显示是经由从数据库进行的读取排序, 4 #解决方案# 拦截阻挡红色区域的执行  5 失败的尝试:尝试但是没有效果的方法 // AppDelegate.m中#pragma 接收消息代理监

Node.js + Web Socket 打造即时聊天程序嗨聊

前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为'前后端'. 图片来自G+ 本文将使用Node.js加web socket协议打造一个网页即时聊天程序,取名为HiChat,中文翻过来就是'嗨聊',听中文名有点像是专为寂寞单身男女打造的~ 其中将会使用到express和socket.io两个包模块,下面会有介绍

带后台的IM即时通讯App 全程MVP手把手打造

第1章 课程项目整体概述简单介绍课程适应人群以及主要的实现方案和课程的分节说明:除此之外展示APP使用效果同时了解IM相关协议并对比现有的IM实现方案.当然现如今IM已经不是一个APP而是一个SDK,趋近于嵌入到任何APP中使用:这也是IM推送聊天技术的主要使用场景....1-1 课程概述1-2 入门须知1-3 IM四大协议1-4 实现方案与选型 第2章 推送和存储平台准备这一章是推送方案的基础,在本章中选取了第三方平台以及文件存储平台.推送平台负责消息的送达,而OSS存储服务负责资源文件的存储

php+ajax长轮询实现web即时聊天

web im的实现方式有很多种: 1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示. 2.长轮询,ajax请求服务端,服务端有数据会立即返回,服务端无数据时,会一直等待,直到有数据了才立即范围. 3.socket长连接. 特征分析: 方法1:实现起来最容易,定时重复请求服务端会产生无意义的http连接,消耗服务端资源,实时性较差. 方法2:实现起来较容易,会减少无效的ajax请求产生的http连接,能即时返回数据,但服务端会一直挂着,会消耗一定的资源,处理并发能力不强,比

nodejs即时聊天

一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错,自己略加修改,感觉挺不错的.官网上给的例子很简单,下面改进了一点,实现了历史消息的推送. demo地址:chat.androiddevelop.cn 其中服务器端代码: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var history = new Ar