Android应用案例课设报告文档格式.docx
- 文档编号:19483795
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:43
- 大小:396.93KB
Android应用案例课设报告文档格式.docx
《Android应用案例课设报告文档格式.docx》由会员分享,可在线阅读,更多相关《Android应用案例课设报告文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
各功能开发表
序号
功能
子功能
开发人员
1
主界面
控制层(事件等)
2
显示层
3
账信息添加
数据层(Dao层)
4
界面控制层
5
6
服务端
7
账信息查询统计
8
9
10
11
账类型查看及修改
12
13
14
15
账信息删除
16
17
18
19
关于
魏燕、马子璇
一、前言
记账软件记录着各种数据,如果软件一不小心删掉,所有数据就没有,就会觉得很可惜。
现在云盘普遍都支持接入应用。
本系统主要用于账信息的存储,主要通过移动数据网络或者WIFI,实现客户与服务端的云存储。
客户可以通过登录查询自己的账户信息。
二、系统分析
2.1系统开发遵循的标准或规范
2.1.1统一的开发平台
移动端开发使用Eclipse4.3.2+AndroidSDK;
服务端开发采用Eclipse4.3.2;
移动端数据库开发采用SQLsever。
2.1.2统一技术规范
总体上采用Java语言进行客户端及服务端的开发,移动客户端开发端采用Android开发技术规范,系统静态及动态建模原则上要求使用UML技术规范。
2.2“云备忘录”功能设计
2.2.1本地备忘信息管理模块
通过该模块的,用户可以完成对备忘信息的管理,主要功能包括:
1.备忘信息添加,用户使用该功能可以完成对备忘信息的添加;
2.备忘信息查询及统计,用户通过该功能完成对特定条件下的备忘信息的查询及统计工作,
3.备忘信息查看及修改,用户通过该功能可以查看特定账信息的明细并可对其进行修改;
4.备忘信息信息删除,用户可以删除特定账信息内容(只做逻辑删除,不做数据库层的物理删除,修改对应记录的status列数据,0表示不可用,1表示可用)
5.备忘信息提醒,用户添加完信息设置是否提醒,使用这个功能,用户可以在通知栏上看到提醒的信息。
6.备忘信息更新,点击更新按钮,用户可以更新状态,进行联网,使信息同步到数据库中。
2.2.1.1系统顶层用例图如图2.1:
图2.1系统用例图
2.2.1.2消费信息模型类类图如图2.2:
图2.2账信息类图
2.2.2.信息的云存储的静态模型图
智能手机通过WIFI或者移动数据访问服务器,完成服务器与客户端的数据传输。
通过联网登录系统,添加信息,修改、删除信息,把信息发送到服务端,进行信息传输。
如图5—1网络拓扑图。
图5-1网络拓扑图
联网以后,用户可以添加、查询、修改、删除、更新备忘信息,即使本地信息删除了,服务端还存有以前的信息,此功能可以防止信息的误删方便用户的使用,详细图解参照下图图2-2系统用例图。
图2.2系统活动图
三、系统设计
3.1系统采用的异步通信框架
在Android2.3.3版本以后,所有联网操作不能在UI线程中进行。
必须在新建线程里进行网络连接,否则将会抛出“NetworkOnMainThreadException”异常。
而在Android系统中只能在主线程(UI线程)中对UI组件进行控制,如果通过子线程启动网络连接并对UI控件进行修改,这就需要与UI线程进行通信。
可以使用Handler类实现子线程与主线程的通信,为提高程序的健壮性,降低代码的耦合度,设计SocketProcessor类(见附件1-6)处理异步通信请求。
3.2系统初始化
系统采用mysql数据库记录备忘信息,在移动端启动前需要进行数据库及数据表等的初始化。
3.1系统初始化的动态模型
启动程序后,获取备忘信息,生成备忘信息对象,存储在本地。
如果联网后,把信息序列化之后发送给服务端,服务端接收后,反序列化存储到云端,通过客户端解析响应判断有没有存储成功。
相关活动图如图3.1系统活动图:
图3.1系统活动图
3.2数据库设计
系统采用SQLite关系型数据库进行数据库设计,由系统对象关系分析可知,系统数据存储结构如表一所示。
表1备忘信息表
表名
note_info
列名
数据类型
非空
描述
主键
外键
id
int
主键,自增
Y
name
varchar(50)
默认备忘名称
date
日期
work
内容
ischeck
integer
True成功false失败
status
0标识不可用,1标识可用
3.3主界面设计
由于采用移动手持终端作为应用程序载体,为提高人机交互效果,主界面宜采用扁平化设计。
可以更加简单直接的将信息和事物的工作方式展示出来,减少认知障碍的产生。
主界面设计如图3.4所示。
图3.4主界面设计
3.5云同步设计
由于用户在未联网状态时,账信息保存在本地数据库中,服务器是收不到任何数据,所以我们设计云同步功能,该功能主要是把本地数据与服务端同步,以便用户后期管理。
3.5.1采用的协议
采用网络通信协议,运用第三方辅助工具JSON包,对数据序列化反序列化进行传输。
利用MyData类控制各种数据传输。
MyData类见图3.5.
图3.5MyData类图
3.5.2云同步动态模型
获取本地数据库数据,对每条数据进行序列化,将序列化字符串发送到服务器,服务器接收字符串,进行反序列化解析,并且与服务器中数据进行对比,如果此条数据在服务器中没有体现,则保存在数据库中,整个数据遍历完毕,响应本次操作,客户端接收响应,同步完成。
动态图如下图3.5.2。
图3.5.2云同步动态模型
3.5.3序列化反序列化关键代码
序列化:
MyData<
nodeInfo>
response=newMyData<
();
response.type=CommonData.ResponseType.ADD_notepad;
response.data=ni;
response.status="
ok"
;
returnJSON.toJSON(response).toString();
反序列化:
Object>
md=JSON.parseObject(data,newTypeReference<
>
(){});
Stringtype=md.type;
System.out.println("
接收请求:
"
+data);
//由于不知道何种请求,首选将JSON字符串反序列化为MyData<
对象
//判断请求类型,根据不同的请求类型,重新反序列化JSON字符串
四、系统实现
4.1数据库存储系统的实现
本存储系统利用Andorid的SQLSever关系型数据库存储系统实现。
其数据表字段及数据表创建等核心代码如下所示:
数据存储代码:
客户端:
//账信息数据表相关字段
publicfinalStringTNAME_1="
account_info"
publicfinalStringCOLUMN1_1="
account_type"
publicfinalStringCOLUMN2_1="
account"
publicfinalStringCOLUMN3_1="
account_remark"
publicfinalStringCOLUMN4_1="
account_date"
publicfinalStringCOLUMN5_1="
account_record_time"
publicfinalStringCOLUMN6_1="
type"
//账信息类型,1表示入账,-1表示出账
publicfinalStringCOLUMN7_1="
status"
//记录状态,1表示可用,0表示不可用
publicfinalStringTNAME_2="
account_type_info"
publicfinalStringCOLUMN1_2="
account_type_name"
publicfinalStringCOLUMN2_2="
account_type_remark"
publicfinalStringCOLUMN3_2="
account_type_time"
//录入到数据库中的时间
publicfinalStringCOLUMN4_2="
//账类型信息对应的类型,-1表示消费(出账),1表示收入(入账)
publicfinalStringCOLUMN5_2="
//记录状态
mSQLiteDB.execSQL("
createtableifnotexists"
+TNAME_1+"
("
+_ID+"
integerprimarykeyAUTOINCREMENT,"
+COLUMN1_1+"
integer,"
+COLUMN2_1+"
text,"
+COLUMN3_1+"
text,"
+COLUMN4_1+"
date,"
+COLUMN5_1+"
time,"
+COLUMN6_1+"
+COLUMN7_1+"
integer)"
);
mSQLiteDB.execSQL("
+TNAME_2+"
+COLUMN1_2+"
+COLUMN2_2+"
+COLUMN3_2+"
time,"
+COLUMN4_2+"
integer,"
+COLUMN5_2+"
mSQLiteDB.close();
服务端:
publicstaticbooleanaddAccountInfo(AccountInfoai){
newSMADao_up().upData("
insertintoaccount_type_infovalues(?
?
)"
newObject[]{
null,
ai.getAccountType().getId(),
ai.getAccount(),
ai.getAccountRemark()+"
ai.getAccountDate(),
ai.getUserInfo().getId(),
ai.getNativeId(),
ai.getDeviceId(),
ai.getStatus()});
returntrue;
}
4.2系统功能实现
4.2.1本地账类型管理
用户登陆后可进行在已有的账类型基础下可以添加账信息。
点击主界面的查询按钮弹出对话框,可以按查询条件查询账类型对应的账项目信息,选择查看可以查看具体信息,并对他进行修改。
点击删除可进行删除。
点击添加按钮可以添加账项目。
4.2.1.1账类型管理显示效果
用户登录后可以添加信息如4.1添加显示效果,可以点击主页面的查询按钮弹出对话框,在对话框里进行查询和修改如4.1查询显示效果和4.1修改显示效果。
4.1添加显示效果4.1查询显示效果4.1修改显示效果
4.2.1.2相关核心代码
chaxun.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
Stringzhanglx=zhang_leixing.getSelectedItem().toString().trim();
if(zhanglx.startsWith("
出账"
)){
queryAccountType_=(Vector<
AccountType>
)newAccountDao(context)
.findAccountTypeByType(-1);
ala.notifyDataSetInvalidated();
}elseif(zhanglx.startsWith("
入账"
.findAccountTypeByType
(1);
ala.notifyDataSetChanged();
}
}
});
//添加按钮事件
add.setOnClickListener(newOnClickListener(){
newSetAddDialog(context).showDialog();
set_List.setOnItemLongClickListener(newOnItemLongClickListener(){
publicbooleanonItemLongClick(AdapterView<
?
arg0,Viewarg1,
intpos,longarg3){
finalintposi=pos;
newModifyChoosenDialog(context){
publicvoiditemEvent(DialogInterfacearg0,intpos){
//TODOAuto-generatedmethodstub
super.itemEvent(arg0,pos);
CommonData.acc=queryAccountType_.elementAt(posi);
Stringtext=(String)this.items[pos];
if(text.equals("
查看"
)){
newZChakanDialog(context){
publicvoidonCancel(DialogInterfacearg0){
chaxun.performClick();
};
}.showDialog();
}elseif(text.equals("
删除"
newAlertDialog.Builder(context).setTitle("
确认删除"
)
.setPositiveButton("
确定"
//设置确定按钮,第二个参数是传事件对象
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhichButton){
//删除操作
if(CommonData.acc.getId()<
7){
Toast.makeText(context,"
删除失败,默认类型无法删除"
Toast.LENGTH_LONG).show();
}else{
newAccountDao(context).deleteAccountType_(CommonData.acc.getId());
Toast.makeText(context,"
删除成功"
Toast.LENGTH_LONG).show();
}
}
}).setNeutralButton("
取消"
null).show();
}
this.dismiss();
}
}.showSingleChoiceDialog();
returnfalse;
}
4.2.2用户注册及登录功能
将用户的信息添加到数据库中,先进行用户注册,把用户信息添加到数据库中,注册时若数据数据库中没有数据则注册,然后点击菜单中的登陆按钮,就可以显示登陆成功。
然后就可以进行用户的信息添加查询之类的操作。
4.2.2.1用户登录动态模型
打开主页面的菜单,点击菜单中的注册按钮,就可以使用用户注册的功能,注册成功之后,返回,点击菜单中的登陆按钮,就可以成功的登陆。
接着就可以添加信息,修改信息,生成请求对象,序列化反序列化之后,可以存储到服务端。
服务端通过客户端的响应判断是否同步到服务端。
如下图,图4.2.2.1用户登录动态图。
活动动态图:
图4.2.2.1用户登录动态图
4.2.2.2登录界面效果
1.进入主页面,打开注册系统,先进行注册,注册成功之后点击登陆按钮就可以登陆了。
如图2-2-1所示。
图2-2-1主界面菜单图2-2-2注册窗口图2-2-3登录窗口
相4.2.2.3关核心代码
//发送登录请求的编码如下所示:
//获取用户数据,封装成json,发送
Stringname=nameEdit.getText().toString().trim();
Stringpass=passEdit.getText().toString().trim();
UserInfouser=newUserInfo();
user.setUserName(name);
user.setUserPass(pass);
MyData<
UserInfo>
request=newMyData<
request.type=CommonData.RequestType.LOGIN;
request.data=user;
request.status="
Stringrequest_=JSON.toJSON(request).toString();
SocketProcessor.sendData(request_);
//处理用户登录响应的Handler编码如下所示
_response_login_handler=newHandler(){
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
Stringdata=msg.getData().getString(SocketProcessor.KEY);
md_=JSON.parseObject(data,newTypeReference<
if(md_.status.equals("
CommonData.login_user=md_.data;
userText.setText("
用户:
+md_.data.getNickName());
loginDialog.dismiss();
}elseif(md_.status.equals("
notok"
showToast("
用户名、密码错误!
}
};
服务端关键代码:
if(type.equals(CommonData.RequestType.LOGIN)){
//JSON.
Stringname=md_.data.getUserName();
Stringpass=md_.data.getUserPass();
System.out.println("
用户名:
+name+"
密码:
+pass);
UserInfouser=UserInfoDao.findUserInfoByNamePass(name,pass);
if(user!
=null){//合法用户
MyData
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 应用 案例 报告