移动软件开发课程设计.docx
《移动软件开发课程设计.docx》由会员分享,可在线阅读,更多相关《移动软件开发课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
移动软件开发课程设计
YangtzeUniversityCollegeofArtsandScience
学生课程设计报告
系部:
机电与信息工程系
专业:
计算机科学与技术
班级:
计科5131
姓名:
来超
学号:
201241136
课程名称:
移动平台数据库综合开发
指导教师:
王腾
实习时间:
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.开发环境:
AS
2.开发语言:
JAVA
3.模拟机平台:
AVD
4.手机运行平台:
Android2.1以及上版本开发软件
5.所需插件:
JDK
2.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)用户信息(用户账号,用户密码,昵称,头像)
publicclassQQMessageextendsProtocal{
publicStringtype=QQMessageType.MSG_TYPE_CHAT_P2P;//数据类型
publiclongfrom=0;//发送者account
publicStringfromNick="";//QQ名
publicintfromAvatar=1;//头像
publiclongto=0;//接收者account
publicStringcontent="";//消息内容(hi)
publicStringsendTime=MyTime.getTime();//发送时间
2)}会话信息(好友账号,好友头像,发送/接收消息时间,消息内容)
publicclassQQMessageType{
publicstaticfinalStringMSG_TYPE_REGISTER="register";//注册
publicstaticfinalStringMSG_TYPE_LOGIN="login";//登录
publicstaticfinalStringMSG_TYPE_LOGINOUT="loginout";//登出
publicstaticfinalStringMSG_TYPE_CHAT_P2P="chatp2p";//聊天
publicstaticfinalStringMSG_TYPE_CHAT_ROOM="chatroom";//群聊
publicstaticfinalStringMSG_TYPE_OFFLINE="offline";//下线
publicstaticfinalStringMSG_TYPE_SUCCESS="success";//成功
publicstaticfinalStringMSG_TYPE_BUDDYLIST="buddylist";//好友列表
publicstaticfinalStringMSG_TYPE_FAILURE="failure";//失败
}
4.详细设计
4.1用户聊天模块
4.1.1ChatActivity类
publicclassChatActivityextendsActivity{
ListViewlistView;
TextViewtitle,send_nick,recv_nick;
EditTextinput;
Stringsix_space="";
Stringtwo_space="";
privateStringtoNick;
privateLongaccount;
ImAppapp;
privateChatMessageAdapteradapter;
Listlist=newArrayList<>();
//内容观察者:
观察uri中是否出现数据库被修改的信号
privateContentObserverobserver=newContentObserver(newHandler()){
//观察到发生变化后,所做的动作
//android2.2
@Override
publicvoidonChange(booleanselfChange){
super.onChange(selfChange);
requery();
}
//android4.0以上
@Override
publicvoidonChange(booleanselfChange,Uriuri){
super.onChange(selfChange,uri);
requery();
}
};
privatevoidrequery(){
//System.out.println("数据发生变化,取出数据刷新聊天界面");
list.clear();
querySetofChatWithOne(account+"",list);
if(adapter!
=null){
adapter.notifyDataSetChanged();
}
if(list.size()>0){
listView.setSelection(list.size()-1);
}
}
@Override
protectedvoidonCreate(BundlesavedInstanceState){
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);
//注册内容观察者
Uriuri=Uri.parse("content:
//"+QQContactDBDao.class.getSimpleName());
//getContentResolver().registerContentObserver(地址:
信号,子路径是否有效,指定一个观察者);
this.getContentResolver().registerContentObserver(uri,true,observer);
app=(ImApp)getApplication();
Intentintent=this.getIntent();
Bundlebundle=intent.getExtras();
account=bundle.getLong("account");
toNick=bundle.getString("nick");
title.setText("与["+toNick+"]聊天中");
querySetofChatWithOne(account+"",list);
adapter=newChatMessageAdapter(this,list);
listView.setAdapter(adapter);
if(list.size()-1>0){
listView.setSelection(list.size()-1);
}
}
//接收消息
//1.messageType==p2p2.app.account==msg.to3.msg,account->toast
publicvoidclickSend(Viewv){
StringmessageBody=input.getText().toString().trim();
if("".equals(messageBody)){
Toast.makeText(getBaseContext(),"发送消息不为空",Toast.LENGTH_SHORT).show();
return;
}
input.setText("");
finalQQMessagemsg=newQQMessage();
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(newRunnable(){
@Override
publicvoidrun(){
try{
app.getCoreService().sendMessage(msg);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
//把与当前好友聊天记录查询出来,
//并显示到与当前好友的聊天界面
privatevoidquerySetofChatWithOne(Stringsession_id,ListmsgList){
ListdbmsgList=app.getQqContactDBDao().queryRaw("whereSESSION_ID=?
orderbySENDTIMEASC",session_id);
for(com.example.meiyu.qq_im.dao.QQContactDBitem:
dbmsgList){
QQMessagemsg=newQQMessage();
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
protectedvoidonDestroy(){
super.onDestroy();
getContentResolver().unregisterContentObserver(observer);
}
}
4.1.2SplashActivity类
publicclassSplashActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
ThreadUtils.runInThread(newRunnable(){
@Override
publicvoidrun(){
try{
Thread.sleep(3000);//至少3秒,下限
startActivity(newIntent(getBaseContext(),LoginActivity.class));
finish();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
}
}
4.1.3activity_login.xml
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
layout_width="match_parent"
android:
layout_height="match_parent">
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_centerInParent="true">
--图标-->
android:
layout_width="80dp"
android:
layout_height="80dp"
android:
src="@drawable/ic_launcher_qq"/>
--账号-->
android:
layout_width="match_parent"
android:
layout_height="wrap_content"
android:
layout_marginTop="20dp">
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="QQ账号"
android:
textSize="25sp"/>
android:
layout_width="200dp"
android:
layout_height="wrap_content"
android:
singleLine="true"
android:
id="@+id/account"
android:
text="159"/>
--密码-->
android:
layout_width="match_parent"
android:
layout_height="wrap_content"
android:
layout_marginTop="20dp">
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="密码"
android:
textSize="25sp"/>
android:
layout_width="200dp"
android:
layout_height="wrap_content"
android:
singleLine="true"
android:
id="@+id/psw"
android:
inputType="textPassword"
android:
text="test"/>
--按钮-->
4.1.4activity_chat.xml
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
layout_width="match_parent"
android:
layout_height="match_parent"
android:
orientation="vertical"
android:
weightSum="1">
--好友标签-->
android:
id="@+id/tv_title"
android:
layout_width="match_parent"
android:
layout_height="wrap_content"
android:
textSize="18sp"
android:
textColor="#FFFFFF"
android:
background="#0099ff"
android:
gravity="center"/>
--聊天记录-->
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="1"
android:
id="@+id/listview_chat"
android:
cacheColorHint="@android:
color/transparent"
android:
listSelector="@android:
color/transparent"
android:
divider="@android:
color/transparent"
android:
dividerHeight="1dp">
--输入聊天-->
android:
orientation="horizontal"
android:
layout_width="match_parent"
android:
layout_height="40dp">
android:
id="@+id/edt_input"
android:
layout_weight="6"
android:
layout_width="0dp"
android:
layout_height="wrap_content"/>
4.2客户端模块
4.2.1ContactActivity类
publicclassContactActivityextends