《移动应用开发》课程设计报告学院名称:计算机与信息工程学院班级名称:计科对口14学生姓名:胡闻璐学号:题目:基于《个人理财通》的计算器任课教师姓名:刘东良起止日期:2017年04月18日至04月30日目录《移动应用开发》课程设计报告 (1)摘要 (3)1 项目需求分析 (3)1.1 需求分析 (3)1.2 功能需求 (3)2系统总体设计 (4)2.1系统架构设计 (4)2.2系统功能体系 (4)3系统详细设计 (4)3.1 数据库设计 (4)3.2系统界面设计 (5)3.3数据存储设计 (6)3.4信息统计设计 (7)3.5地图轨迹设计 (7)3.6 服务应用设计 (15)4系统编码实现 (17)4.1框架引用 (17)4.2交互实现 (17)4.3单元测试 (19)5 系统测试发布 (20)5.1手机环境的实测 (20)5.2 APP的发布实测 (20)参考文献 (21)成绩评定 (22)摘要随着移动终端的迅速普及,Android系统平台引用软件的需求随之增大。
伴随着Android智能手机与平板电脑已经出现在我们生活的大量的使用,越来越多的基于Android开发平台也随之而出,为丰富人们使用Android智能产品的用途,使其可以帮人们记录一些事情。
本设计开发通过研究Android体系结构和个人理财管理方面的知识,设计并实现了个人理财通系统。
能够对理财信息进行获取、汇总、整理、计算等功能,从而实现随身随时随地地进行日常的理财活动。
1 项目需求分析1.1 需求分析物质和科技的飞速发展,人们的生活水平也不断的在提高,往往有很多人在快节奏的生活中迷失和迷茫,很多人觉得自己没钱,但每个月的工资也不是很低,却往往不知道钱花在哪,为什么每到月底自己的钱包会空空如也,正因为这样,人们才需要一款个人理财软件,简单的界面,易懂的操作,十分便携直观的理财方式,可以让人们更好的进行个人理财。
以下是本软件的一些功能:①登录界面:初始登陆时没有密码,为了方便用户保护隐私,可以自行设置密码②新增支出:添加支出金额、时间、类别和地点等信息③新增收入:添加收入金额、时间、类别和付款方等信息④数据管理:支出汇总,收入汇总,便签信息⑤便签功能:添加便签,设置提醒或事项⑥计算器:对数据进行计算,方便记录,长按结果可直接复制⑦移动课堂:泛雅平台中的安卓课程访问⑧帮助:对个人理财通各个功能部件的使用介绍⑨退出:退出该系统1.2 功能需求目前国内外理财软件已有上百种之多,如美国的直觉公司QUICKEN软件为美国13个州及加拿大的客户提供金融管理和预算等财务问题。
国内在财务管理方面做的比较突出的当属金蝶公司。
然而,在手机理财软件方面做的很突出的还没有,本软件是针对个人用户的一款Android软件,主要对个人理财收入、支出做一个记录和统计,可以对用户的收入、支出记录做添加、删除、查询和修改的管理,本软件该具备以下功能:①功能操作要方便、易懂、,不要有多余或复杂的操作。
②对用户收入支出信息做添加、删除、查询和修改。
③系统的功能复合本人的实际情况。
④界面直观简洁,方便用户更好的使用。
⑤保证软件的安全性。
2系统总体设计2.1系统架构设计3系统详细设计3.1 数据库设计(1)数据类型简要规则程序中需要定义常量,变量,这些需要指定的类型。
下面介绍常见的数据库类型,如表3-1 所示。
表3-1 数据类型简要规则(2)组件命名规则所有的组件对象名称的拼音简写,如果发现冲突可采用不同的简写规则。
组件命名如表3-2所示。
表3-2 组件命名规则个人理财通是一款运行在Android系统上的程序,在Android系统中,集成了一种轻量型的数据库,即SQLite,该数据库是使用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB,使用该数据库,用户可以像使用SQL Server数据库或者Oracle数据库那样来存储、管理和维护数据,本系统采用了SQLite数据库,并且命名为account.db,,该数据库中用到了4个数据表,分别是tb_flag、tb_inaccount、tb_outaccount和tb_pwd。
3.2系统界面设计1启动界面:清新简洁的启动界面,标识着个人理财通和开发者微博,提升整体软件美观程度,如图3-1所示。
图3-12.用户登录:首次登录不需要密码,进去后可在系统设置里设置密码。
由于本软件属于个人客户端,通常情况下只有本人使用,所以没有用户名,直接进入密码输入环节,便于保护用户隐私,如图3-2所示。
图3-23.用户登入后进入软件的主界面,主界面包括软件的所有功能图标,用户可根据需要使用,如图3-3所示。
图3-34.计算器:基本的加减乘除,可以方便用户对金额进行计算,从而方便记录,在本计算机中计算的结果,可以长按结果进行复制,从而到收入支出页面进行快捷的粘贴,如图3-4、3-5所示。
图3-4 图3-55.新增支出:此模块的功能是添加用户的新增支出。
同样新增支出可以选择金额、时间、类别、地点和备注。
类别可以选择餐费、应酬、礼金、车费以及其他,长按金额后面的填写框可以快捷复制计算器的计算结果,如图3-6、3-7所示。
图3-6 图3-76.新增收入:此模块的功能是添加用户新增的收入。
在平时理财的过程中,添加收入记录是很频繁操作,所以此模块为用户提供了一个非常实用而且便捷的操作过程。
在这个模块中,用户可以添加收入信息记录的内容包括:金额、时间、类别、付款方以及备注。
为了用户能够方便的查看收入记录,故将收入类别进行了分类,具体分为五类,分别为工资、兼职、分红、奖金、其他,长按金额后面的填写框可以快捷复制计算器的计算结果,如图3-8、3-9所示。
图3-8 图3-97.我的支出、我的收入:当在新增收入模块进行了添加操作后,添加的收入记录就会显示在模块中。
在这两个界面中可以清楚的看到所有的记录,如图3-10、3-11所示。
图3-10 图3-118.数据管理:对于家庭理财系统来说,数据管理功能是非常重要的一个功能,它主要是管理支出、收入以及便签的记录信息,如图3-12所示。
图3-129.系统设置:让用户来设置密码。
密码设置成功后,用户再次登录时就需要所设置的密码,如图3-13所示。
图3-1310.新增便签,主要实现添加便签记录。
便签模块可以记录将要进行的收入或支出信息,也就是相当于备忘录的功能,如图3-14所示。
图3-1411.移动课堂:泛雅平台的移动应用开发学习界面,用户可以在这里学习安卓有关知识,如图3-15所示。
图3-1512.帮助:《个人理财通》使用帮助,用于解决在系统中遇到的问题,如图3-16所示。
图3-1613.退出:用户点击退出图标后回到登录界面。
3.3数据存储设计public class DBOpenHelper extends SQLiteOpenHelper {private static final int VERSION = 1;// 定义数据库版本号private static final String DBNAME = "account.db";// 定义数据库名public DBOpenHelper(Context context){// 定义构造函数super(context, DBNAME, null, VERSION);// 重写基类的构造函数}@Overridepublic void onCreate(SQLiteDatabase db){// 创建数据库db.execSQL("create table tb_outaccount (_id integer primary key,money decimal,time varchar(10),"+ "type varchar(10),address varchar(100),mark varchar(200))");// 创建支出信息表db.execSQL("create table tb_inaccount (_id integer primary key,money decimal,time varchar(10),"+ "type varchar(10),handler varchar(100),mark varchar(200))");// 创建收入信息表db.execSQL("create table tb_pwd (password varchar(20))");// 创建密码表db.execSQL("create table tb_flag (_id integer primary key,flag varchar(200))");// 创建便签信息表}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){// 覆写基类的onUpgrade方法,以便数据库版本更新}}3.4信息统计设计当点击支出汇总、收入汇总或便签信息时,下方就会出现所有的支出、收入或便签信息。
如图3-17、3-18所示。
图3-17 图3-183.5地图轨迹设计/*** 计算器项目*/public class Calculator extends Activity {private static final boolean isDebug = true;// 判断项目是否处于debug调试模式,控制是否打印log// char 用来进行判断用private static final char CJia = '+';private static final char CJian = '-';private static final char CCheng = '*';private static final char CChu = '÷';// String 用来进行显示用private static final String SJia = "+";private static final String SJian = "-";private static final String SCheng = "*";private static final String SChu = "÷";private TextView textView;private Button mCopy;// 复制按钮private boolean isTextViewInputted = false;// 判断textView是否有输入,用来判断0按钮的功能// private Button btn_c, btn_del;// C、DEL// private Button btn_jia, btn_jian, btn_chu, btn_cheng;// +、-、x、÷// private Button btn_dian, btn_dengyu;// ., =// private Button btn_0, btn_1, btn_2, btn_3, btn_4;// 0,1,2,3,4// private Button btn_5, btn_6, btn_7, btn_8, btn_9;// 5,6,7,8,9 ∞protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 布局// 动态的设置Gridlayout中控件的宽度,使其全屏匹配屏幕ViewTreeObserver vto = gridlayout.getViewTreeObserver();vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {public void onGlobalLayout() {fillview(gl);ViewTreeObserver obs = gl.getViewTreeObserver();obs.removeGlobalOnLayoutListener(this);}});// 获得每个按钮的点击事件initViews();}// 为每个Button设置了onClick属性public void onClick(View view) {switch (view.getId()) {// 0-9button0Function();break;button1Function();break;button2Function();break;button3Function();break;button4Function();break;button5Function();break;button6Function();break;button7Function();break;button8Function();break;button9Function();break;buttonDianFunction();break;// CbuttonClear();break;// DELbuttonDel();break;// +buttonJiaYunSuanFunction();break;// -buttonJianYunSuanFunction();break;// XbuttonChengYunSuanFunction();break;// ÷buttonChuYunSuanFunction();break;// =buttonDengYuFunction();break;default:Button b = (Button) view;Toast.makeText(this, b.getText(), Toast.LENGTH_SHORT).show();break;}}/* ============================= *//* private 私有方法*//* =========================== */private void fillview(GridLayout gl) {Button buttontemp;youtParams params;for (int i = 0; i < gl.getChildCount(); i++) {buttontemp = (Button) gl.getChildAt(i);params = (LayoutParams) buttontemp.getLayoutParams();params.width = (gl.getWidth() / gl.getColumnCount())- params.rightMargin - params.leftMargin;buttontemp.setLayoutParams(params);}}// 初始化所有的控件private void initViews() {mCopy.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO 自动生成的方法存根if (textView.getText().toString().equals("")) {Toast.makeText(Calculator.this, "结果为空", Toast.LENGTH_SHORT).show();return;}}});}private void printDebugInfo(String str) {if (isDebug) {Log.i("TAG", "Debug: " + str);}}// 往Textv的尾部追加内容private void appendTextView(String str) {CharSequence text = textView.getText();text = text + str;printDebugInfo(text.toString());textView.setText(text);}// 添加数字按钮的功能start===========================// 对于0的输入的注意点:// 1、当还没有输入时,就是textview显示为0时,什么都不用做,继续保持为0// 2、当textview的显示不为0时,在textview的尾部追加一个0// 问题:判断条件怎样来确定。