




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Yangtze University College of Arts and Science学生课程设计报告系 部: 机电与信息工程系 专 业: 计算机科学与技术 班 级: 计科5131 姓 名: 来超 学 号: 课程名称: 移动平台数据库综合开发 指导教师: 王 腾 实习时间:2016年6月20日至2016年6月27日android即时通讯软件摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。基于Java网络编程的强大功能,本次课程设计使用Java编写一个运行在android2.2版本以上的即时通讯软件。一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成。Java提供的多线程功能用多线程可完成一点对多点的聊天,数据库管理系统用SQLlite来访问数据库的。本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。系统采用C/S结构,客户端与客户端以及客户端与服务器端之间传送消息。使用JAVA语言编写,开发工具采用AS。在智能手机中,Android平台约占75市场份额。安卓系统的广泛应用,使得Android手机应用程序的数量快速增长,即时通讯APP的应用范围也更加广泛。关键字:多线程;客户机/服务器 ;JAVA;AS ;Android手机应用1.开发背景Android的英文翻译是指“机器人”,而Android这个词语作为操作系统的名称出现,是谷歌在2007年发布了应用在手机平台上的操作系统,自此Android作为手机操作系统出现在人们的视野中。同时由于Android的操作系统的开源性和可开发性使得以Android操作系统的应用软件日益增多。Android操作系统被越来越多的人接受和使用。目前的Android聊天软件基本分为2种架构形式:(1)C/S架构:采取客户端/服务器对等传输的形式,用户方主要使用客户端软件,使用前用户通过网上下载客户端软件,再安装到手机上进行使用,市场上流行的C/S架构的聊天软件有以下几种:QQ、微信、微博、YY、MSN等;(2)B/S架构:浏览器/服务端对等传输的形式,这种形式下的即时通信工具,一般都是依赖于互联网,作为用户无需下载客户端,用户一般在浏览往网上网页时浏览器会提供一个类似于客户端的界面使用户可以发送消息,此架构一般应用在数据流比较大的电商网站,如WebQQ等。2.软件需求分析2.1软件开发的工具和环境1.开发环境:AS2.开发语言:JAVA3.模拟机平台:AVD4.手机运行平台:Android2.1以及上版本开发软件5.所需插件:JDK2.2安装JDK和SDK先从网站上找到JDK1.6(JREaloneisnotsufficient)版本并下载,下载完毕后将它安装在PC机上并在PC机上设置好有关的环境变量,将JAVA_HOME,path等几个设置为适用于Java开发的环境变量,最后将其导入你的JDK文件路径SDK安装:直接从相关网站下载好SDK压缩包,然后打开Eclipse软件,在其中找到对应路径将其导入就可以。3、原理与技术要点分析3.1 登录功能概要 点击button按钮 服务器验证登录账号 跳转进入好友列表界面登录流程图:进入输入账号及密码 失 判断账号密码 服务器验证败 是否正确登录成功 1.1登录功能流程图3.2聊天功能概要 用户点击联系人列表中的一个好友时,进入聊天界面 在输入框输入信息,点击发送按钮,发送信息 好友回复消息是在该聊天页面显示 当有好友发消息过来时,系统会通过Toast提示用户聊天模块总体流程图:1.2用户聊天模块总体流程图3.3技术要点分析3.3.1概念结构设计 3.3.2逻辑结构设计1) 用户信息(用户账号,用户密码,昵称,头像) public class QQMessage extends Protocal public String type = QQMessageType.MSG_TYPE_CHAT_P2P; / 数据类型 public long from = 0; / 发送者 account public String fromNick = ;/ QQ名 public int fromAvatar = 1; / 头像 public long to = 0; / 接收者 account public String content = ; / 消息内容(hi) public String sendTime = MyTime.getTime(); / 发送时间2) 会话信息(好友账号,好友头像,发送/接收消息时间,消息内容)public class QQMessageType public static final String MSG_TYPE_REGISTER = register; / 注册 public static final String MSG_TYPE_LOGIN = login;/ 登录 public static final String MSG_TYPE_LOGINOUT = loginout;/ 登出 public static final String MSG_TYPE_CHAT_P2P = chatp2p;/ 聊天 public static final String MSG_TYPE_CHAT_ROOM = chatroom;/ 群聊 public static final String MSG_TYPE_OFFLINE = offline;/ 下线 public static final String MSG_TYPE_SUCCESS = success;/ 成功 public static final String MSG_TYPE_BUDDYLIST = buddylist;/ 好友列表 public static final String MSG_TYPE_FAILURE = failure;/ 失败4详细设计4.1 用户聊天模块4.1.1 ChatActivity 类public class ChatActivity extends Activity ListView listView; TextView title,send_nick,recv_nick; EditText input; String six_space= ; String two_space= ; private String toNick; private Long account; ImApp app; private ChatMessageAdapter adapter; List list =new ArrayList(); /内容观察者:观察uri中是否出现数据库被修改的信号 private ContentObserver observer=new ContentObserver( new Handler() /观察到发生变化后,所做的动作 /android2.2 Override public void onChange(boolean selfChange) super.onChange(selfChange); requery(); /android4.0以上 Override public void onChange(boolean selfChange, Uri uri) super.onChange(selfChange, uri); requery(); ; private void requery() /System.out.println(数据发生变化,取出数据刷新聊天界面); list.clear(); querySetofChatWithOne(account+,list); if(adapter!=null) adapter.notifyDataSetChanged(); if(list.size()0) listView.setSelection(list.size()-1); Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); listView= (ListView) findViewById(R.id.listview_chat); title= (TextView) findViewById(R.id.tv_title); input= (EditText) findViewById(R.id.edt_input); send_nick=(TextView)findViewById(R.id.tv_send_nick); recv_nick=(TextView)findViewById(R.id.tv_recv_nick); /注册内容观察者 Uri uri=Uri.parse(content:/+ QQContactDBDao.class.getSimpleName(); / getContentResolver().registerContentObserver(地址:信号,子路径是否有效,指定一个观察者); this.getContentResolver().registerContentObserver(uri,true,observer); app= (ImApp) getApplication(); Intent intent = this.getIntent(); Bundle bundle = intent.getExtras(); account=bundle.getLong(account); toNick=bundle.getString(nick); title.setText(与 +toNick +聊天中); querySetofChatWithOne(account+,list); adapter=new ChatMessageAdapter(this,list); listView.setAdapter(adapter); if(list.size()-10) listView.setSelection(list.size()-1); /接收消息 /1.messageType=p2p 2.app.account=msg.to 3.msg,account-toast public void clickSend(View v) String messageBody=input.getText().toString().trim(); if(.equals(messageBody) Toast.makeText(getBaseContext(),发送消息不为空,Toast.LENGTH_SHORT).show(); return; input.setText(); final QQMessage msg=new QQMessage(); msg.type= QQMessageType.MSG_TYPE_CHAT_P2P; msg.content=messageBody; msg.from=app.getAccount(); msg.to=account; msg.fromNick=人族; /发送干两件事情 /1:把消息显示到聊天记录区 list.add(msg); /刷新list if(adapter!=null) adapter.notifyDataSetChanged(); /从最后一条开始显示 if(list.size()0) listView.setSelection(list.size()-1); /2:发送给聊天对象 ThreadUtils.runInThread(new Runnable() Override public void run() try app.getCoreService().sendMessage(msg); catch (Exception e) e.printStackTrace(); ); / 把与当前好友聊天记录查询出来, / 并显示到与当前好友的聊天界面 private void querySetofChatWithOne(String session_id,ListmsgList) List dbmsgList=app.getQqContactDBDao().queryRaw(where SESSION_ID = ? order by SENDTIME ASC,session_id); for(com.example.meiyu.qq_im.dao.QQContactDB item:dbmsgList) QQMessage msg = new QQMessage(); msg.type = QQMessageType.MSG_TYPE_CHAT_P2P; msg.content = item.getContent(); msg.from = item.getFrom(); msg.to = item.getTo(); msg.fromNick = item.getFromNick(); msgList.add(msg); Override protected void onDestroy() super.onDestroy(); getContentResolver().unregisterContentObserver(observer); 4.1.2 SplashActivity 类public class SplashActivity extends Activity Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); ThreadUtils.runInThread(new Runnable() Override public void run() try Thread.sleep(3000); /至少3秒,下限 startActivity(new Intent(getBaseContext(),LoginActivity.class); finish(); catch (InterruptedException e) e.printStackTrace(); ); 4.1.3 activity_login.xml 4.1.4 activity_chat.xml 4.2 客户端模块4.2.1 ContactActivity 类public class ContactActivity extends Activity ListView listView; ContactAdapter adapter; ImApp app; /好友列表 List list =new ArrayList(); /每一个activity必备的监听器 IOnMessageReceiveListener listener=new IOnMessageReceiveListener() Override public void onReceive(final QQMessage msg) ThreadUtils.runUnThread(new Runnable() Override public void run() if(QQMessageType.MSG_TYPE_BUDDYLIST.equals(msg.type) String json=msg.content; Gson gson=new Gson(); /反序列化 QQContactList tempList=gson.fromJson(json,QQContactList.class); /刷新好友列表 /首先设置列表值 list.clear(); list.addAll(tempList.buddyList); /其次再刷新列表 if(adapter!=null) adapter.notifyDataSetChanged(); ); ; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact); listView= (ListView) findViewById(R.id.listview_contact); app= (ImApp) getApplication(); app.getCommunicaCore().addOnMessageReceiveListener(listener); /处理好友列表 /先取出(app) String json=app.getBuddyListJson(); System.out.println(json); /再处理(从json反序列化成对象) Gson gson=new Gson(); QQContactList tempList=gson.fromJson(json,QQContactList.class); /把上面完成的对象加入到list里面去 list.addAll(tempList.buddyList); /绑定适配器 adapter =new ContactAdapter(this,list); listView.setAdapter(adapter); / 添加item的click监听器 listView.setOnItemClickListener(new ListView.OnItemClickListener() Override public void onItemClick(AdapterView parent, View view, int position, long id) / 获取数据 QQContact contact = list.get(position); Intent intent = new Intent(getBaseContext(),ChatActivity.class); intent.putExtra(account,contact.account); intent.putExtra(nick,contact.nick); startActivity(intent); ); protected void onDestroy() super.onDestroy(); app.getCommunicaCore().removeOnMessageReceiveListener(listener); 4.2.2 LoginActivity 类public class LoginActivity extends Activity EditText account,psw; String username,password; QQCommunicationCore communicaCore; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); account= (EditText) findViewById(R.id.account); psw= (EditText) findViewById(R.id.psw); /网络链接 ThreadUtils.runInThread(new Runnable() Override public void run() try communicaCore=new QQCommunicationCore(192.168.1.126,20001); communicaCore.addOnMessageReceiveListener(listener); communicaCore.connection(); catch (Exception e) e.printStackTrace(); ); /被回调 本activity处理消息的核心 IOnMessageReceiveListener listener=new IOnMessageReceiveListener() Override public void onReceive(final QQMessage msg) ThreadUtils.runUnThread(new Runnable() Override public void run() System.out.println(msg.toXML(); if(QQMessageType.MSG_TYPE_BUDDYLIST.equals(msg.type) ImApp app= (ImApp) getApplication(); /保存账号 app.setAccount(Long.pars
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山东钢铁集团有限公司校园招聘模拟试题附带答案详解及答案详解1套
- 2025年建筑节能新视角:被动式超低能耗建筑技术原理与建筑节能效率报告
- 2025年采矿权质押生态修复环境监测服务合同
- 2025年新型城镇化建设配电房设施建设与长期运维合同
- 2025年科研设备租赁权转让及租金递延支付协议
- 2025年社区食堂生鲜食材采购与配送服务协议书
- 2025年医疗康复机构儿科诊疗设备购置及维保合同
- 2025年特色旅游景点植物资源保护与景观优化服务协议
- 2025年职业院校教师技能培训与就业指导服务合同
- 物联网技术在农业精准种植中的智能灌溉设备应用效果研究报告
- 2025江苏省铁路集团融发管理有限公司招聘7人笔试历年参考题库附带答案详解
- 应急疏散培训课件
- 广东省深圳市福田片区2025届数学七上期末质量检测试题含解析
- 数学三年级测量活动方案
- 灵芝孢子油培训
- DB32∕T 5081-2025 建筑防水工程技术规程
- 公司适用法律法规标准清单2025年08月更新
- 山西省2025年中考物理真题试卷真题及答案
- 2025年北京高考语文试卷试题真题及答案详解(精校打印版)
- 窗帘实施方案(3篇)
- 产品试验管理制度
评论
0/150
提交评论