1、专业工程综合实训设计报告55目 录第一章绪论11。1课题的背景及意义11。2系统框架1第二章系统分析32。1 系统可行性分析32。1.1 功能可行性分析32.1。2 运行环境可行性分析32。2 开发环境简介32。2。1 Java Development kit(JDK)介绍32。2。2 Android SDK 介绍32.2。3 Eclipse开发工具介绍42。2.4 Android Development Tools(ADT)介绍4第三章 Android开发常用到的技术及环境搭建43。1 Android开发常用到的技术43.1。1 Activity43.1。2 Service63。1.3 Co
2、ntent Provider 内容提供者63。1。4 Intent 信使63.2环境搭建63。2。1安装JDK63。2。2安装Eclipse73。2。3 Android SDK安装73.2.4 ADT安装7第四章手机计步器的设计与实现84。1计步器功能的设计84。2计步器功能的实现104.2。1 计步开始及暂停104.2.2 复位键114。2。3设置步长114。2。4设置体重114。2。5历史记录的查看及删除12第五章计步器的界面效果165。1用户界面165。2设置界面175。3历史界面205.4日历选择界面215。5用户离开界面22第六章系统测试与分析236。1 测试过程236.2 测试分析
3、36结论36参考文献37第一章 绪论1。1课题的背景及意义当今社会,手机已经成为人们工作生活中必不可少的一项通讯和娱乐工具,随着手机的不断更新,手机的各种高层服务和应用层出不穷。现在智能手机可谓是爆发式增长,与此同时传统手机在不断地消失,诺基亚就是在这样的环境中受到了重创。现在主要有三个使用率和关注度最高的手机平台,分别是:Android,ios和windows phone平台,在这三个平台中Android的占有率最高.自2007年11月Google公司发布Android系统以来,短短几年时间,Android已经占据了智能手机市场的半壁江山,成为目前最为炙手可热的智能手机操作系统。Androi
4、d走进了越来越多人的生活,成为他们获取信息的主要平台。Android平台对于Google和用户的意义不在于手机本身,而在于为了推动移动互联网产业链的迅速成型.具有开源性的Android手机平台与之前Symbian、windows mobile等操作系统不同,它们收取高额的授权费用,而Android不需要,这样使得应用开发成本大大降低;也正是由于它的源代码是开放的,使得开发者可以随心所欲的开发应用.同时,手机生产商和软件开发商也能够在这里得到利润,手机软件得到有效的维护协调发展。这正是Google发布Android平台的意义,也是Android平台的使命所在.同时目前搭载Android平台的应用
5、有很多,但针对传感器而开发的应用市场上还不多见.本应用正是针对Android手机内置的加速度传感器而特别设计的应用.所以鉴于移动端应用开发是目前软件开发行业正在兴起并会越来越炙手可热的一个分支,并且针对传感器的开发相对空白我选择了研究此课题。1。2系统框架在设计一款软件时一般都会把它分成几个模块,在模块的基础上还会再分小模块,这样就达到了软件模块化设计的要求,然后再对各个小模块进行详细设计和编写,采用模块化的管理方式可以使软件结构更清晰,也使得软件的管理更有秩序,使别人容易理解和阅读,但是这些模块也要根据别的模块来设计和约束,不能随便设计脱离框架,设计完成后需要把每个设计完成的模块根据总体框架
6、结合起来。根据本软件的功能需求,将本软件分为以下几个功能模块,如图 1-1所示:主界面步数公里暂停/开始卡路里设置走过的总步数走过的总长度开始/暂停运动运动所消耗的能量复位所有数据清零选择日期日期步长体重设置用户步长设置用户体重结束关闭应用软件历史查看历史记录删除历史记录保存保存记录图11 整体框架图第二章 系统分析2。1 系统可行性分析可行性分析(FeasibilityAnalysis)也称为可行性研究,是在系统调查的基础上,针对刚刚开发打算进一步应用的系统的必要性和可能性的分析和研究.可行性研究的目的主要在于,用最小的代价在尽可能短的时间内确定问题是否能够解决。1该阶段通过对系统总目标的初
7、步调研与分析,提出可行性方案并进行论证。2.1.1 功能可行性分析1、计步功能:根据用户设置的步长和体重,估算用户步行运动所消耗的热量.当距离发生改变时在前台界面上刷新用户步行的步数、距离、和消耗的卡路里;该计步功能还实现了Notification后台运行的功能. 2、设置参数功能:设置用户的步长、体重2个参数信息.通过设置体重可以估算出不同体重的人运动所消耗的卡路里量. 3、退出系统功能:当用户想终止计步软件时,可以点击退出菜单后退出本系统。4、历史记录功能: 用户可以查看以往的历史记录。5、保存功能: 有户可以保存当天的运动量,以便之后查看.2.1.2 运行环境可行性分析本软件是在wind
8、ows 7 操作系统中,利用Eclipse 开发工具搭载Android SDK工具包,结合Android手机自带的sqlite数据库进行开发。2。2 开发环境简介2。2.1 Java Development kit(JDK)介绍JDK是Java语言的软件开发工具包。本应用用的是JDK的J2ME版,它主要用于移动设备、嵌入式设备上的Java应用程序.没有JDK的话,无法编译Java程序,所以这是开发Java程序必须安装的工具。2.2。2 Android SDK 介绍SDK(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操
9、作系统等建立应用软件的开发工具的集合.因此,Android SDK指的是Android专属的软件开发工具包。2.2.3 Eclipse开发工具介绍Eclipse是一个开放源代码的、基于插件的可扩展性平台。也可以说它只是一个框架和一组服务,用于通过插件组件构建开发环境.Eclipse附带了一些标准的插件集,包括Java开发工具(JDK).本次应用就是将Eclipse当作Java集成开发环境来使用,但是它的作用并不仅仅如此。由于Eclipse中的每样东西都是插件,所以只要有插件就可以使用它,因而不仅仅是Java语言,C/C+、PHP等语言也可以使用Eclipse。2。2.4 Android Dev
10、elopment Tools(ADT)介绍目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具.ADT扩展了Eclipse的功能,让我们能快速建立新的Android项目、创建应用程序的用户界面。它可以帮助Eclipse找到Android SDK,再加上Android框架的API组件调试使用Android SDK工具,以便APK分发给应用程序。同时大大减轻了Android应用程序的开发工作量,工具集成XML编辑器,将给开发者一个令人难以置信的开发And
11、roid应用环境。当然如果你不用Eclipse作为你的开发工具,你就不需要下载ADT, 只下载SDK即可开发.2第三章Android开发常用到的技术及环境搭建3。1Android开发常用到的技术3。1。1 ActivityActivity是Android应用程序开发中最重要的组件.一个Activity提供一个屏幕,用户可以用来交互以完成某项任务,例如点击、拍照、拨号等.它是用户与应用交互的直接且最重要的组件。Activity生命周期可以用几个函数说明:onCreate():Activity开始创建时调用;onStart():在Activity开始执行时调用,这时Activity已经可见;onR
12、esume():在Activity获得用户焦点时调用,此时Activity可以和用户交;onPause():在Activity被暂停时调用,失去用户焦点,但没有被摧毁;onStop():在Activity被停止时调用,此时Activity已经不可见,但仍然没有被摧毁;onRestart():在Activity被重新启动时调用;onDestory():在Activity被彻底摧毁时调用.下面用一张图来解释Activity的生命周期在各函数之间的跳转。如图31:图31 Activity的生命周期图3.1。2 Service一个Service是一段长生命周期的,没有用户界面的程序,可以用来开发如监控
13、类程序。一个很好的例子就是用手机在播放音乐时,用户可以进行其它应用的活动而此时并没有播放音乐的界面,但是音乐在后台播放并不受影响,这就是Service的功劳。还有就是闹钟提醒,当你设置好闹钟后并不需要一直显示在闹钟那个界面,甚至手机也可以关掉但是只要时间到了,闹钟依然可以提醒,这也是Service的作用。3。1.3Content Provider 内容提供者android平台提供了Content Provider,它是一个应用程序的指定数据集提供数据给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。本文用到了文件存储和Shared Preferen
14、ces的存储方式。文件存储大家都很熟悉,就是以文件为操作对象,向文件中写入或读取数据.Shared Preferences可以将数据保存到应用程序的私有存储区,这些存储区中的数据只能被写入这些数据的软件读取。它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.例如:登陆时用到的用户名和密码。3。1.4 Intent 信使Intent 也是Android开发者比较重要的一部分,它主要用来解决Android应用的各项组件之间的通讯,被称为Android应用中的信使。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此I
15、ntent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。所以它常被用来启动一个Activity或Service,3例如当从一个Activity启动另一个Activity时,可以这样操作,Intent intent=new Intent();intent.setClass(startActivity。this,secondActivity。class);this。startActivity(intent)。3。2环境搭建首先要有一台安装有Windows系统的计算机,接下来就是安装过程。3。2.1安装JDK下载JDK,在这里1. 我的电脑属性环境变量系统变量;2.
16、 JAVA_HOME值为:D:Program Filesjdk(你安装JDK的目录);3. CLASSPATH 值为:;JAVA_HOMElibtools。jar;%JAVA_HOMElibdt.jar;JAVA_HOMEbin;4. Path:在开始追加JAVA_HOMEbin;如果安装成功,打开cmd窗口,输入java-version会出现如图31显示的信息:图 31 JDK安装成功提示信息3.2。2安装Eclipse下载Eclipse,这里是网址http:/www。eclipse。org/downloads/解压后即可使用.3。2。3 Android SDK安装在Android Deve
17、lopers下载最新版本的压缩包,下载完成后解压到任意路径,运行SDK Setup。exe。选定你要安装的内容。这里也需要配置环境变量,在用户变量中新建PATH值为:Android SDK中的tools绝对路径.53。2。4 ADT安装打开Eclipse IDE,点击菜单中的“Help”然后点击“Install New Software”,再点击Add。.按钮,这时会弹出一个对话框要求输入,Name和Location:Name项可以自己随便填取,Location输入http:/dl-ssl。 with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开
18、它会有Android DDMS和Android Development Tool,选定他们.然后按要求一步一步next,完成之后,这个过程可能会很慢。这取决于网络环境。最后选择WindowPreferences.。在左边的面板选择Android,然后再右侧点击Browse,并选中SDK路径。点击Apply,到此就配置完成了6.第四章 手机计步器的设计与实现4。1计步器功能的设计软件采用最主流的Android软件应用开发风格,并使用Android的原生组件进行开发,界面友好,简洁易懂,组建布局具有诱导性,用户使用极其方便快捷。1、主界面操作流程见图4-1:开始计步计步暂停计步清零开始图41 图为
19、主界面操作流程图2、设置界面操作流程见图42:主界面设置体重步长图4-2 图为设置界面操作流程图 3、日历选择界面操作流程见图4-3:主界面日历选择日历图43 日历选择界面操作流程图4、历史界面操作流程见图44:主界面历史查看选择范围删除图44 历史界面操作流程图5、复位界面操作流程见图45:主界面复位清空数据图4-5 复位界面操作流程图6、关闭程序界面操作流程见图4-6:主界面关闭结束程序图46 关闭程序界面操作流程图4。2计步器功能的实现计步器的主要功能有:计步开始/暂停,设置,显示运动所消耗的卡路里,走过长度。本软件是一个结合手机用户特别是智能手机用户常用功能的一个软件平台,本软件可以通
20、过界面快速获取运动的情况,获取信息后可以对这些信息进行个性化处理以方便用户直观的感受运动量。4。2。1计步开始及暂停首先对暂停/ 开始键做一个监听start_pause_button。setOnClickListener(new View。OnClickListener()同时还要对此时状态做一个判断start_pause_button.setText(mIsRunning ? R。string.pause : R.string。resume);若初始状态为记录则显示暂停,若初始状态为非记录状态则显示开始。4.2。2 复位键对清零按钮做一个View即:resetButton = (Button
21、) findViewById(R。id。reset_button);实现清零的语句很简单,对“开始”键做一个监听,当用户点击“开始”键时,即:resetButton.setOnClickListener(new View.OnClickListener()7执行一下命令:public void onClick(View v)resetValues(true);这样记录数据清零的按钮就完成了。4。2。3设置步长对于设置步长,首先要获取用户所输入的步长信息:return Float。valueOf(mSettings。getString(”step_length”, ”70)若用户未对步长信息进行
22、编辑,则默认为70.在DistanceNotifier中使用mStepLength来计算走过的距离:mDistance = mDistance + (float) (mStepLength / 100000。0);notifyListener();4。2.4设置体重对于设置体重,首先要获取用户所输入的体重信息:return Float。valueOf(mSettings.getString(”body_weight”, ”50若用户未对步长信息进行编辑,则默认为50.在CaloriesNotifier中使用mBodyWeight来计算用户因运动所消耗的卡路里:mCalories += (mBo
23、dyWeight (mIsRunning ? METRIC_RUNNING_FACTOR : METRIC_WALKING_FACTOR)) mStepLength / 100000.0;notifyListener();4。2。5历史记录的查看及删除publicclass View1 extends Activity/使用ActionBarActivity出现闪退不能运行, 可以使用 Activityprivate ListView list;private Button btnBack,btnForward;privateint mYear,mMonth,mDay;private Text
24、View tvTitle;String from;String today;int to;int _id;SimpleCursorAdapter mAdapter;DataBase db;Cursor cur;Overrideprotectedvoid onCreate(Bundle savedInstanceState) super。onCreate(savedInstanceState);setContentView(R.layout。view1);db=new DataBase(this);db。CreatTable_amount();list=(ListView)findViewByI
25、d(R.id。listView1);Calendar c = Calendar. getInstance(TimeZone。getTimeZone(GMT+08:00);mYear = c。get(Calendar.YEAR); mMonth = c。get(Calendar.MONTH)+1; mDay=c。get(Calendar。DAY_OF_MONTH);if(mMonth10)today = mYear + ”- + 0”+mMonth;else today=mYear+”+mMonth; cur=db。getAmount(today);from=new String”date”,”
26、Distance”;to=newintR。id。textView1,R。id。textView2;cur=db。getAmount(today);mAdapter = newSimpleCursorAdapter(this, R.layout.items, cur,from, to);list.setAdapter(mAdapter);list。setOnItemLongClickListener(new OnItemLongClickListener() Overridepublicboolean onItemLongClick(AdapterView? Vparent, android.v
27、iew.View view,int position, long id) / TODO Autogenerated method stub_id=(int)id;new AlertDialog。Builder(View1.this)。setTitle(提示”).setMessage(”确定删除该细节?)。setIcon(R。drawable。ic_launcher)。setPositiveButton(”确定”,new DialogInterface。OnClickListener() publicvoid onClick(DialogInterface dialog, int whichBu
28、tton) /Log。v(,”+_id); db。delAmount(_id); mAdapter。changeCursor(cur); (SimpleCursorAdapter) mAdapter).notifyDataSetChanged();finish(); System.out.println(ok); list.setAdapter(mAdapter);)。setNegativeButton(取消,new DialogInterface.OnClickListener() publicvoid onClick(DialogInterface dialog, int whichBut
29、ton) ).show();returnfalse;);tvTitle=(TextView)findViewById(R。id。tvTitle);tvTitle。setText(mYear+”-”+mMonth+-+01+”-”+mYear+”+(mMonth+1)+”+”01);/if(mMonth=12) tvTitle。setText(mYear+mMonth+”01+”-”+(mYear+1)+”+1+”+01); elseif(mMonth12) mMonth=1; mYear=mYear+1; tvTitle。setText(mYear+-”+mMonth+-”+”01”+”-+m
30、Year+”-+(mMonth+1)+”+01); /btnBack=(Button)findViewById(R。id.btnBack);btnForward=(Button)findViewById(R.id.btnForward);ButtonListener buttonlistener =new ButtonListener();btnBack.setOnClickListener(buttonlistener);btnForward。setOnClickListener(buttonlistener);class ButtonListener implements OnClickL
31、istener publicvoid onClick(android。view。View v) switch(v。getId() case R.id。btnBack:leftView();break;case R。id。btnForward:rightView();break; privatevoid rightView() Calendar c = Calendar. getInstance(TimeZone.getTimeZone(”GMT+08:00”));mMonth +;tvTitle.setText(mYear+”-”+mMonth+”01”+mYear+”+(mMonth+1)+
32、-”+01”);if(mMonth=12)tvTitle.setText(mYear+”+mMonth+”01+”-”+(mYear+1)+-+1+”01”);elseif(mMonth12) mMonth=1; mYear=mYear+1;tvTitle。setText(mYear+”+mMonth+”-”+01+-+mYear+”+(mMonth+1)+”+”01); if(mMonth10) today = mYear + ” + 0+mMonth;else today=mYear+”+mMonth; cur=db。getAmount(today);mAdapter.changeCurs
33、or(cur);(SimpleCursorAdapter) mAdapter).notifyDataSetChanged();privatevoid leftView() mMonth=mMonth-1;if(mMonth1) mMonth=12; mYear=mYear1;tvTitle.setText(mYear+”+mMonth+”+01”+”-”+(mYear+1)+”+”1+”+”01); elseif(mMonth=12) mMonth=1; mYear=mYear+1;tvTitle.setText(mYear+”+mMonth+”-+”01”+”+(mYear+1)+”+1”+
34、”-”+01”); elsetvTitle。setText(mYear+”+mMonth+01”+”-”+mYear+”-+(mMonth+1)+”-”+01);if(mMonth10) today = mYear + ” + 0”+mMonth;else today=mYear+”-+mMonth; cur=db。getAmount(today); mAdapter.changeCursor(cur);((SimpleCursorAdapter) mAdapter)。notifyDataSetChanged();第五章 计步器的界面效果5.1用户界面图 51 用户主界面5.2设置界面图52
35、设置体重界面图5-3 设置步长界面5。3历史界面图5-4 记录历史界面5。4日历选择界面图5-5 日期选择界面5。5用户离开界面图56 用户离开界面第六章 系统测试与分析6.1 测试过程1) 点击应用图标,如图 6-1所示:图6-1 图为计步器主界面2) 计步器主界面开始记录数据,如图 62所示:图6-2 图为计步器主界面3) 在主界面点击暂停,如图 6-3所示:图63 图为停止计步界面4) 继续运动观察主界面数据是否有变化,如图 64所示:图64 图为停止计步后仍在运动界面5) 进入体重设置界面,如图 65所示:图65 图为体重设置界面6) 进入步长设置界面,如图 66所示:图66 图为步长
36、设置界面7) 选择日期界面,如图 67所示:图67 图为日期选择界面图68 图为日期选择后的界面8) 历史界面,如图 69所示:图68 图为历史界面9) 历史查询界面如图 6-9所示:图6-9 图为历史查询界面10) 历史删除界面 如图 610所示:图6-10 图为历史删除界面图6-11 图为历史删除后的界面11) 退出程序界面 如图 612所示:图612 图为退出程序界面6。2 测试分析本软件中几个模块的功能经过测试,均测试通过,测试结果和最初的设计基本一致,所有的功能均能正常运行,软件需要比较特殊的运行环境,首先手机的重力感应功能必须有,而且Android系统的版本过低将不能使用。至此基于
37、安卓平台的手机计步器的设计基本完成。结 论经过了数月的努力,Android平台手计步器软件终于完成了。本软件能实现用户对计步器的基本要求.方便用户开启关闭计步器,对运动情况和运动量可以直观的从主界面获取信息,设置选项中的智能人机交互平台也可以明了的对用户信息进行编辑,不需要复杂的操作不需要学习,一目了然。对于智能手机用户来说,基于安卓平台的手机计步器提供了一个快捷方便的平台。为用户提供随时随地的服务,节省用户不必要的资金消耗与时间消耗是本软件设计的一个宗旨,整个框架和细节的设计都是围绕这个宗旨进行的,虽然整个软件还不是很成熟,还有很多不足和需要改进的地方,或者还有很多信息提供不到位,例如我们可
38、以加入音乐播放模块,是用户在运动的同时享受轻松快乐的环境,这些还需要日后慢慢优化和改善,但是最初的设计都实现了。在现在的功能基础上本软件可以进行扩展升级。本软件最初设计的时候就是一个可以扩展的框架,所以为将来加入新的功能提供了很大的方便。本软件虽然不是很强大,但是是我自己亲手编写的,开发一个能在时下最流行的软件,使之顺利的在平台上运行是一件令人兴奋的事情。把自己的想法一步一步地付诸实践,最后成为一个真实的实物,被别人使用和称赞,此时得到的成就感是尤为强烈的。参考文献1 高焕堂。Google Android应用程序框架原理与程序设计。http:/download。2 E2ECloud工作室著深入
39、浅出Google AndroidM北京:人民邮电出版社,2009-081.3 Android API。chmhttp:/ 201004-10.4 王家林大话企业级Android应用开发实战M电子工业出版社,2011,85 差沙。用Android手机开发应用。程序员。2008.6 万玛,宁关永,韩相军。嵌入式数据库典型技术SQLite和Berkeley的研究。微计算机信息,2006。7 马越.Andriod的架构与应用.北京:中国地质大学,2008.8 高昂,冯大祥等。Google Android 开发入门与实践.北京:人民邮电出版社,2009.9张孝祥著java就业培训教程M北京:清华大学出版
40、社,2007。10Michael McRoberts著,杨继志,郭敬译。 Arduino从基础到实践M。 北京:电子工业出版社,2013。附录:1。启动界面import android。app。Activity;import android。annotation。SuppressLint;import android。content。Intent;import android。os。Bundle;import android。os。Handler;import android.os.Message;/import android。support。v7.app。ActionBarActivity
41、;/import android。widget。ImageView;import android.widget.TextView;public class Welcome extends Activity /ActionBarActivity 可以使用 Activityprivate Handler mHandler = new Handler();ImageView imageview;TextView textview;int alpha = 150;int b = 0;SuppressLint( NewApi, HandlerLeak” )SuppressWarnings(depreca
42、tion”)Overrideprotected void onCreate(Bundle savedInstanceState) super。onCreate(savedInstanceState);setContentView(R。layout。welcome);imageview = (ImageView) this。findViewById(R。id。imageView1);imageview。setImageAlpha(alpha);new Thread(new Runnable() public void run() while (b 2) try if (b = 0) Thread.sleep(1000);b = 1; else Thread.sleep(50);updateApp(); catch (InterruptedException e) e。printStackTrace();)。start();mHandler = new Handler() Overridepublic void handleMessage(Message msg) super。handleMessage(msg);imageview.setAlpha(alpha);imageview.invalidate();publ