《移动软件开发课程设计.doc》由会员分享,可在线阅读,更多相关《移动软件开发课程设计.doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date移动软件开发课程设计移动软件开发课程设计Yangtze University College of Arts and Science学生课程设计报告系 部: 机电与信息工程系 专 业: 计算机科学与技术 班 级: 计科5131 姓 名: 来超 学 号: 201241136 课程名称: 移动平台数据库综合开发 指导教师: 王 腾 实习时间:2016年6月20日至2016
2、年6月27日-android即时通讯软件摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。基于Java网络编程的强大功能,本次课程设计使用Java编写一个运行在android2.2版本以上的即时通讯软件。一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成。Java提供的多线程功能用多线程可完成一点对多点的聊天,数据库管理系统用SQLlite来访问数据库的。本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。系统采用C/S结构,客户端
3、与客户端以及客户端与服务器端之间传送消息。使用JAVA语言编写,开发工具采用AS。在智能手机中,Android平台约占75市场份额。安卓系统的广泛应用,使得Android手机应用程序的数量快速增长,即时通讯APP的应用范围也更加广泛。关键字:多线程;客户机/服务器 ;JAVA;AS ;Android手机应用1.开发背景Android的英文翻译是指“机器人”,而Android这个词语作为操作系统的名称出现,是谷歌在2007年发布了应用在手机平台上的操作系统,自此Android作为手机操作系统出现在人们的视野中。同时由于Android的操作系统的开源性和可开发性使得以Android操作系统的应用软
4、件日益增多。Android操作系统被越来越多的人接受和使用。目前的Android聊天软件基本分为2种架构形式:(1)C/S架构:采取客户端/服务器对等传输的形式,用户方主要使用客户端软件,使用前用户通过网上下载客户端软件,再安装到手机上进行使用,市场上流行的C/S架构的聊天软件有以下几种:QQ、微信、微博、YY、MSN等;(2)B/S架构:浏览器/服务端对等传输的形式,这种形式下的即时通信工具,一般都是依赖于互联网,作为用户无需下载客户端,用户一般在浏览往网上网页时浏览器会提供一个类似于客户端的界面使用户可以发送消息,此架构一般应用在数据流比较大的电商网站,如WebQQ等。2.软件需求分析2.
5、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 登录功能概要 点击butt
6、on按钮 服务器验证登录账号 跳转进入好友列表界面登录流程图:进入输入账号及密码 失 判断账号密码 服务器验证败 是否正确登录成功 1.1登录功能流程图3.2聊天功能概要 用户点击联系人列表中的一个好友时,进入聊天界面 在输入框输入信息,点击发送按钮,发送信息 好友回复消息是在该聊天页面显示 当有好友发消息过来时,系统会通过Toast提示用户聊天模块总体流程图:1.2用户聊天模块总体流程图3.3技术要点分析3.3.1概念结构设计 3.3.2逻辑结构设计1) 用户信息(用户账号,用户密码,昵称,头像) public class QQMessage extends Protocal public
7、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) 会话信息(好友账号,好友头像,发送/接收消息时
8、间,消息内容)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 M
9、SG_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 Chat
10、Activity 类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中是否出
11、现数据库被修改的信号 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)
12、; 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
13、.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)findVi
14、ewById(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.getI
15、ntent(); 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.siz
16、e()-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 Q
17、QMessage(); 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
18、); /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.getQqContactD
19、BDao().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.from
20、Nick = 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(
21、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 act
22、ivity_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
23、 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); /刷新好友列表 /首先设置列表值 lis
24、t.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_conta
25、ct); 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里
26、面去 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);