源码下载:http://download.csdn.net/detail/weidi1989/4619686
转载请注明出处,谢谢!
最新修改版已上传。优化下拉刷新、主界面改成ViewPager,实现左右滑动、新增群组、最近会话显示。
国庆这几天,闲着无聊,仿照QQ2012,做了一个基于socket的聊天工具,由于代码比较多,今天就不在文章中贴出代码,需要的朋友可以点击上面下载,谢谢,后续会详细贴出各模块代码,并解释,敬请期待,O(∩_∩)O,有什么问题或者bug,欢迎给我留言。
首先说一下我的整体思路:整个聊天是通过服务器转发的,这样处理起来比较简单,但是服务器压力会特别大。建议在真正做项目的时候,服务器只处理用户注册、登录以及判断用户是否掉线等,至于聊天、传文件以及视频等就在用户之间单独建立连接,这样可以大大减少服务器的压力,我这里就没考虑这么多了。
第一:我们定义一个超级消息对象(记得要序列化),它包含:消息类型、具体的消息对象、发送给谁以及来自谁。服务器和客户端就是通过发送这个超级消息对象来进行通讯的。
第二:服务器,在接受用户连接之后,马上把socket丢入线程池中,这样可以支持多用户并发访问,然后根据用户的socket对象,分别建立一条读消息线程和写消息线程(在这里,写消息线程要先建立,我们需要传递给读消息线程,因为我们在读完消息之后会给用户回复消息)。在读消息线程里面根据消息类型处理超级消息对象,分别是:注册、登录、下线、转发消息、文件、刷新好友列表等。后台数据库处理的话,我们通过dao模式,这样很方便,而且会使代码显得简洁、明了、有条理,总之是各种好,哈哈。最后要注意一点:因为我们是转发消息,所以在用户登录成功后,我们需要把该用户的写消息线程根据用户的ID存入一个Map中,以便在转发消息的时候,可以根据用户ID取出对应的写消息线程,从而实现转发消息。
第三:客户端,跟服务器类似,只是没有线程池,在用户连接上服务器之后,也是根据连接后的socket对象,分别建立一条读消息线程和写消息线程。然后在代码中哪里需要发消息,就通过get方法获取写消息线程,哪里需要读消息,就通过get方法获取读消息线程。
第四:关于写消息线程处理,因为服务器或者客户端,不可能时时需要写消息,因此我们如果用一个死循环去处理写线程,明显的是不明智的,因此我做了一个简单的处理,在写消息的死循环中先wait(),当我们调用写消息线程的setMessage方法后,就notify唤醒写线程,发送完消息之后,继续wait(),这里我贴出核心代码:
public void setMsg(TranObject msg) {
this.msg = msg;
synchronized (this) {
notify();
}
}
@Override
public void run() {
try {
while (isStart) {
if (msg != null) {
oos.writeObject(msg);
oos.flush();
if (msg.getType() == TranObjectType.LOGOUT) {// 如果是发送下线的消息,就直接跳出循环
break;
}
synchronized (this) {
wait();// 发送完消息后,线程进入等待状态
}
}
}
oos.close();// 循环结束后,关闭输出流和socket
if (socket != null)
socket.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
第五:具体手机客户端的处理,因为android有自己的特点,也有自己的优势,所以我们要充分利用它的优势,避开他的缺点来处理消息,我说一下我在这个小项目中处理消息的思路:我在用户启动程序的时候,开启一个获取消息的service,在该service中建立连接,然后通过一个接口去监听读消息线程收到的消息,在收到消息的同时,把该超级消息对象通过广播发送出去,然后自定义一个抽象的MyActivity继承Activity,在MyActivity里面通过一个广播接收者接收service中发送过来的消息,并通过一个抽象方法传递给子Activity,我们的其他activity如果要处理收消息,就可以继承我们自定义的MyActivity,然后实现那个抽象方法,就可以了,这样很好的处理了不同的activity接收消息的缺点,而且后台处理也很方便,我不知道腾讯QQ在这个方面是怎么处理的,这是我个人的想法而已。下面贴出MyActivity的代码:
/**
* 自定义一个抽象的MyActivity类,每个Activity都继承他,实现消息的接收(优化性能,减少代码重复)
*
* @author way
*
*/
public abstract class MyActivity extends Activity {
/**
* 广播接收者,接收GetMsgService发送过来的消息
*/
private BroadcastReceiver MsgReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TranObject msg = (TranObject) intent
.getSerializableExtra(Constants.MSGKEY);
if (msg != null) {//如果不是空,说明是消息广播
// System.out.println("MyActivity:" + msg);
getMessage(msg);// 把收到的消息传递给子类
} else {//如果是空消息,说明是关闭应用的广播
close();
}
}
};
/**
* 抽象方法,用于子类处理消息,
*
* @param msg
* 传递给子类的消息对象
*/
public abstract void getMessage(TranObject msg);
/**
* 子类直接调用这个方法关闭应用
*/
public void close() {
Intent i = new Intent();
i.setAction(Constants.ACTION);
sendBroadcast(i);
finish();
}
@Override
public void onStart() {// 在start方法中注册广播接收者
super.onStart();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Constants.ACTION);
registerReceiver(MsgReceiver, intentFilter);// 注册接受消息广播
}
@Override
protected void onStop() {// 在stop方法中注销广播接收者
super.onStop();
unregisterReceiver(MsgReceiver);// 注销接受消息广播
}
}
好了,大概思路就是这样的,下面根据具体的测试截图,说说我的思路:
1.桌面快捷方式 2.欢迎界面
3.正在登陆 4.登陆成功后的好友列表,通过ViewPager实现
5.好友列表是自定义的ExpandableListView,可以下拉刷新6.群组聊天功能暂未实现
7.聊天主界面,8.ViewPager实现左右滑动
9.最近会话显示10.未进入聊天界面时,来消息提醒,并保存数据库
11.后台运行来消息时提醒,有声音有振动,左图为收到新消息,右图为无新消息时状态,
12.后台数据库,密码通过MD5方式加密了,用户注册成功后,即生成一个以用户id命名的表,用来保存好友。
13.服务器运行提示
14.注册状态已经成功后的提示
最后来几张聊天截图,好了今天就到这里,后续会继续跟大家分享其他各个小模块的具体实现,先休息一下,玩两天,马上要上班了,吼吼....
分享到:
相关推荐
android4.2.2 高仿QQ聊天界面 包含前台后台,mysql数据库脚本。
在Android平台上,高仿QQ聊天应用的开发是一项挑战性的工作,涉及到多个技术栈的整合,包括客户端开发、服务器端开发以及数据库设计。本项目旨在通过Android SDK构建一个类似QQ的即时通讯应用,实现用户间的实时聊天...
【安卓版本高仿QQ聊天系统】是一个针对Android平台开发的即时通讯应用,旨在模拟QQ的聊天功能,提供用户间快速、便捷的信息交流。这个项目不仅涵盖了客户端的开发,还涉及到了后端数据库的支持,其中使用了MySQL作为...
在Android平台上,高仿QQ是一种常见的实践项目,用于帮助开发者深入理解Android开发的基本原理和技巧。这个最新的版本可能包含了各种先进的特性和优化,使得模仿QQ的用户体验更加接近原生应用。接下来,我们将深入...
【标题】"高仿QQ聊天界面"涉及到的知识点主要集中在移动应用开发领域,尤其是Android或iOS平台上的用户界面设计和实现。在这个项目中,开发者通过编程技术重现了QQ聊天应用的外观和功能,以供学习者参考和研究。以下...
【安卓版高仿QQ聊天软件源代码】是一个用于学习和研究的项目,它涵盖了客户端和服务器端的开发,旨在模仿腾讯QQ的聊天功能。这个项目对于Android开发者,尤其是那些对即时通讯应用开发感兴趣的开发者来说,是一个...
【Android高仿QQ源码】项目是对腾讯QQ移动应用的一种模仿实现,旨在帮助开发者学习和理解Android应用开发中的各种技术和设计模式。这个项目通常包含了QQ的主要功能模块,如登录、消息推送、联系人管理、聊天界面等,...
通过深入研究这个Android高仿QQ源代码,开发者不仅可以掌握上述技术点,还能了解到大型应用的设计模式和架构思想,这对于提升个人开发能力非常有帮助。同时,也可以根据自己的需求对源码进行修改和扩展,实现自己...
以上就是实现“Android高仿QQ聊天界面,发送表情,添加本地图库照片,可拍照”所需的主要知识点。这些功能的实现涉及到Android的基础组件使用、图片处理技术、网络通信以及用户体验优化等多个层面,对于一个Android...
1. **QQ聊天界面**: - 聊天界面是用户与应用的主要交互点,通常包含消息列表、输入框和发送按钮。消息列表展示历史记录,可以通过RecyclerView或ListView实现,使用Adapter来绑定数据。 - 消息泡泡是聊天界面的核心...
总的来说,这个"高仿qq界面源码"是一个有价值的教育资源,对于想要提升Android UI设计技能或者希望创建类似社交应用界面的开发者来说,是一份宝贵的参考资料。通过深入研究这个项目,开发者可以学习到如何用代码构建...
在这个高仿QQ项目中,很可能使用了这两种语言之一,因为它们是Android开发的标准选择。 在实现过程中,开发者需要关注以下几个关键技术点: 1. 用户界面(UI)设计:QQ的用户界面非常直观且富有吸引力,因此高仿...
【Android项目源码高仿QQ最新版本界面】这个项目是一个专为Android平台设计的应用程序,旨在复制QQ的最新用户界面。这个项目展示了如何利用Android SDK和自定义控件来实现与QQ类似的交互体验和视觉效果。对于开发者...
在Android开发领域,"高仿QQ"是一种常见的学习项目,旨在模仿腾讯QQ应用程序的设计和功能,从而提升开发者对于UI设计、交互实现以及性能优化的理解。这个项目涵盖了多个关键知识点,让我们逐一深入探讨。 1. **图片...
3. **自定义视图**: 高仿QQ界面可能会有一些特殊的按钮或图形元素,这需要我们自定义View或ViewGroup。例如,`translucentButton`可能是对原生Button的透明度或形状进行了定制,以实现更独特的视觉效果。 4. **图片...
【Android高仿QQ源码详解】 在Android应用开发领域,学习和分析已有的成熟应用源码是提升技术能力的有效途径。本篇文章将深入探讨“android 高仿QQ源码”这一主题,帮助开发者理解QQ应用的核心功能实现以及背后的...
本项目“高仿QQ界面”就是这样一个实例,它提供了Android Studio项目源码,供学习者研究和实践。QQ作为中国乃至全球范围内广泛使用的即时通讯应用,其界面设计简洁且用户体验优秀,因此,对QQ界面进行高仿可以让我们...
Android网络聊天(高仿QQ,包含服务端)软件,易于搭建,适合学习
【标题】"Android应用源码之FlipDemo(高仿QQ左右滑动菜单)_高仿.zip"揭示了这个项目是关于Android开发的一个实例,它模仿了QQ应用中的左右滑动菜单功能。这种菜单在用户界面上提供了平滑的交互体验,通过左右滑动...