基于Android的手机计步器的设计实现分析+源代码_第1页
基于Android的手机计步器的设计实现分析+源代码_第2页
基于Android的手机计步器的设计实现分析+源代码_第3页
基于Android的手机计步器的设计实现分析+源代码_第4页
基于Android的手机计步器的设计实现分析+源代码_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.PAGE.>专业工程综合实训设计报告..>目录TOC\o"1-3"\h\u第一章绪论11.1课题的背景及意义11.2系统框架1第二章系统分析32.1系统可行性分析32.1.1功能可行性分析32.1.2运行环境可行性分析32.2开发环境简介32.2.1JavaDevelopmentkit〔JDK〕介绍32.2.2AndroidSDK介绍32.2.3Eclipse开发工具介绍42.2.4AndroidDevelopmentTools〔ADT〕介绍4第三章Android开发常用到的技术及环境搭建43.1Android开发常用到的技术43.1.1Activity43.1.2Service63.1.3ContentProvider容提供者63.1.4Intent信使63.2环境搭建6安装JDK6安装Eclipse73.2.3AndroidSDK安装73.2.4ADT安装7第四章手机计步器的设计与实现84.1计步器功能的设计84.2计步器功能的实现104.2.1计步开场及暂停104.2.2复位键11设置步长11设置体重11历史记录的查看及删除12第五章计步器的界面效果165.1用户界面165.2设置界面175.3历史界面205.4日历选择界面215.5用户离开界面22第六章系统测试与分析236.1测试过程236.2测试分析36结论36参考文献37..>第一章绪论1.1课题的背景及意义当今社会,手机已经成为人们工作生活中必不可少的一项通讯和娱乐工具,随着手机的不断更新,手机的各种高层效劳和应用层出不穷。现在智能手机可谓是爆发式增长,与此同时传统手机在不断地消失,诺基亚就是在这样的环境中受到了重创。现在主要有三个使用率和关注度最高的手机平台,分别是:Android,ios和windowsphone平台,在这三个平台中Android的占有率最高。自2007年11月Google公司发布Android系统以来,短短几年时间,Android已经占据了智能手机市场的半壁江山,成为目前最为炙手可热的智能手机操作系统。Android走进了越来越多人的生活,成为他们获取信息的主要平台。Android平台对于Google和用户的意义不在于手机本身,而在于为了推动移动互联网产业链的迅速成型。具有开源性的Android手机平台与之前Symbian、windowsmobile等操作系统不同,它们收取高额的授权费用,而Android不需要,这样使得应用开发本钱大大降低;也正是由于它的源代码是开放的,使得开发者可以随心所欲的开发应用。同时,手机生产商和软件开发商也能够在这里得到利润,手机软件得到有效的维护协调开展。这正是Google发布Android平台的意义,也是Android平台的使命所在。同时目前搭载Android平台的应用有很多,但针对传感器而开发的应用市场上还不多见。本应用正是针对Android手机置的加速度传感器而特别设计的应用。所以鉴于移动端应用开发是目前软件开发行业正在兴起并会越来越炙手可热的一个分支,并且针对传感器的开发相对空白我选择了研究此课题。1.2系统框架在设计一款软件时一般都会把它分成几个模块,在模块的根底上还会再分小模块,这样就到达了软件模块化设计的要求,然后再对各个小模块进展详细设计和编写,采用模块化的管理方式可以使软件构造更清晰,也使得软件的管理更有秩序,使别人容易理解和阅读,但是这些模块也要根据别的模块来设计和约束,不能随便设计脱离框架,设计完成后需要把每个设计完成的模块根据总体框架结合起来。根据本软件的功能需求,将本软件分为以下几个功能模块,如图1-1所示:主界面主界面步数公里暂停/开场卡路里设置走过的总步数走过的总长度开场/暂停运动运动所消耗的能量复位所有数据清零选择日期日期步长体重设置用户步长设置用户体重完毕关闭应用软件历史查看历史记录删除历史记录保存保存记录图1-1整体框架图第二章系统分析2.1系统可行性分析可行性分析〔Feasibility

Analysis〕也称为可行性研究,是在系统调查的根底上,针对刚刚开发打算进一步应用的系统的必要性和可能性的分析和研究。可行性研究的目的主要在于,用最小的代价在尽可能短的时间确定问题是否能够解决。[1]该阶段通过对系统总目标的初步调研与分析,提出可行性方案并进展论证。2.1.1功能可行性分析1、计步功能:根据用户设置的步长和体重,估算用户步行运动所消耗的热量。当距离发生改变时在前台界面上刷新用户步行的步数、距离、和消耗的卡路里;该计步功能还实现了Notification后台运行的功能。2、设置参数功能:设置用户的步长、体重2个参数信息。通过设置体重可以估算出不同体重的人运动所消耗的卡路里量。3、退出系统功能:当用户想终止计步软件时,可以点击退出菜单后退出本系统。4、历史记录功能:用户可以查看以往的历史记录。5、保存功能:有户可以保存当天的运动量,以便之后查看。2.1.2运行环境可行性分析本软件是在windows7操作系统中,利用Eclipse开发工具搭载AndroidSDK工具包,结合Android手机自带的sqlite数据库进展开发。2.2开发环境简介2.2.1JavaDevelopmentkit〔JDK〕介绍JDK是Java语言的软件开发工具包。本应用用的是JDK的J2ME版,它主要用于移动设备、嵌入式设备上的Java应用程序。没有JDK的话,无法编译Java程序,所以这是开发Java程序必须安装的工具。2.2.2AndroidSDK介绍SDK(softwaredevelopmentkit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。因此,AndroidSDK指的是Android专属的软件开发工具包。2.2.3Eclipse开发工具介绍Eclipse是一个开放源代码的、基于插件的可扩展性平台。也可以说它只是一个框架和一组效劳,用于通过插件组件构建开发环境。Eclipse附带了一些标准的插件集,包括Java开发工具〔JDK〕。本次应用就是将Eclipse当作Java集成开发环境来使用,但是它的作用并不仅仅如此。由于Eclipse中的每样东西都是插件,所以只要有插件就可以使用它,因而不仅仅是Java语言,C/C++、PHP等语言也可以使用Eclipse。2.2.4AndroidDevelopmentTools〔ADT〕介绍目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具。ADT扩展了Eclipse的功能,让我们能快速建立新的Android工程、创立应用程序的用户界面。它可以帮助Eclipse找到AndroidSDK,再加上Android框架的API组件调试使用AndroidSDK工具,以便APK分发给应用程序。同时大大减轻了Android应用程序的开发工作量,工具集成*ML编辑器,将给开发者一个令人难以置信的开发Android应用环境。当然如果你不用Eclipse作为你的开发工具,你就不需要下载ADT,只下载SDK即可开发。[2]第三章Android开发常用到的技术及环境搭建3.1Android开发常用到的技术3.1.1ActivityActivity是Android应用程序开发中最重要的组件。一个Activity提供一个屏幕,用户可以用来交互以完成*项任务,例如点击、拍照、拨号等。它是用户与应用交互的直接且最重要的组件。Activity生命周期可以用几个函数说明:onCreate():Activity开场创立时调用;onStart():在Activity开场执行时调用,这时Activity已经可见;onResume():在Activity获得用户焦点时调用,此时Activity可以和用户交;onPause():在Activity被暂停时调用,失去用户焦点,但没有被摧毁;onStop〔〕:在Activity被停顿时调用,此时Activity已经不可见,但仍然没有被摧毁;onRestart():在Activity被重新启动时调用;onDestory():在Activity被彻底摧毁时调用。下面用一图来解释Activity的生命周期在各函数之间的跳转。如图3-1:图3-1Activity的生命周期图3.1.2Service一个Service是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。一个很好的例子就是用手机在播放音乐时,用户可以进展其它应用的活动而此时并没有播放音乐的界面,但是音乐在后台播放并不受影响,这就是Service的功绩。还有就是闹钟提醒,当你设置好闹钟后并不需要一直显示在闹钟那个界面,甚至手机也可以关掉但是只要时间到了,闹钟依然可以提醒,这也是Service的作用。3.1.3ContentProvider容提供者android平台提供了ContentProvider,它是一个应用程序的指定数据集提供数据给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。本文用到了文件存储和SharedPreferences的存储方式。文件存储大家都很熟悉,就是以文件为操作对象,向文件中写入或读取数据。SharedPreferences可以将数据保存到应用程序的私有存储区,这些存储区中的数据只能被写入这些数据的软件读取。它的本质是基于*ML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。例如:登陆时用到的用户名和密码。3.1.4Intent信使Intent也是Android开发者比拟重要的一局部,它主要用来解决Android应用的各项组件之间的通讯,被称为Android应用中的信使。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进展描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。所以它常被用来启动一个Activity或Service,[3]例如当从一个Activity启动另一个Activity时,可以这样操作,Intentintent=newIntent();intent.setClass(startActivity.this,secondActivity.class);this.startActivity(intent)。3.2环境搭建首先要有一台安装有Windows系统的计算机,接下来就是安装过程。3.2.1安装JDK下载JDK,在这里oracle./technetwork/java/inde*.html下载,解压双击按提示安装。然后是配置环境变量:我的电脑—>属性—>环境变量—>系统变量;JAVA_HOME值为:D:\ProgramFiles\jdk〔你安装JDK的目录〕;CLASSPATH值为:;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME\bin;Path:在开场追加%JAVA_HOME\bin;如果安装成功,翻开cmd窗口,输入java--version会出现如图3-1显示的信息:图3-1JDK安装成功提示信息3.2.2安装Eclipse下载Eclipse,这里是网址/downloads/解压后即可使用。3.2.3AndroidSDK安装在AndroidDevelopers下载最新版本的压缩包,下载完成后解压到任意路径,运行SDKSetup.e*e。选定你要安装的容。这里也需要配置环境变量,在用户变量中新建PATH值为:AndroidSDK中的tools绝对路径。[5]3.2.4ADT安装翻开EclipseIDE,点击菜单中的"Help〞然后点击"InstallNewSoftware〞,再点击Add...按钮,这时会弹出一个对话框要求输入,Name和Location:Name项可以自己随便填取,Location输入dl-ssl.google./android/eclipse。点击确定后,在workwith后的下拉列表中选择我们刚刚添加的ADT,我们会看到下面出有DeveloperTools,展开它会有AndroidDDMS和AndroidDevelopmentTool,选定他们。然后按要求一步一步ne*t,完成之后,这个过程可能会很慢。这取决于网络环境。最后选择Window->Preferences...在左边的面板选择Android,然后再右侧点击Browse,并选中SDK路径。点击Apply,到此就配置完成了[6]。第四章手机计步器的设计与实现4.1计步器功能的设计软件采用最主流的Android软件应用开发风格,并使用Android的原生组件进展开发,界面友好,简洁易懂,组建布局具有诱导性,用户使用极其方便快捷。1、主界面操作流程见图4-1:开场计步开场计步计步暂停计步清零开场图4-1图为主界面操作流程图2、设置界面操作流程见图4-2:主界面主界面设置体重步长图4-2图为设置界面操作流程图3、日历选择界面操作流程见图4-3:主界面主界面日历日历选择日历选择日历图4-3日历选择界面操作流程图4、历史界面操作流程见图4-4:主界面主界面历史历史查看查看选择范围选择范围删除删除图4-4历史界面操作流程图5、复位界面操作流程见图4-5:主界面主界面复位复位清空数据清空数据图4-5复位界面操作流程图6、关闭程序界面操作流程见图4-6:主界面主界面关闭关闭完毕完毕程序图4-6关闭程序界面操作流程图4.2计步器功能的实现计步器的主要功能有:计步开场/暂停,设置,显示运动所消耗的卡路里,走过长度。本软件是一个结合手机用户特别是智能手机用户常用功能的一个软件平台,本软件可以通过界面快速获取运动的情况,获取信息后可以对这些信息进展个性化处理以方便用户直观的感受运动量。4.2.1计步开场及暂停首先对暂停/开场键做一个监听start_pause_button.setOnClickListener(newView.OnClickListener()同时还要对此时状态做一个判断start_pause_button.setTe*t(mIsRunning"R.string.pause:R.string.resume); 假设初始状态为记录则显示暂停,假设初始状态为非记录状态则显示开场。4.2.2复位键对清零按钮做一个View即:resetButton=(Button)findViewById(R.id.reset_button);实现清零的语句很简单,对"开场〞键做一个监听,当用户点击"开场〞键时,即:resetButton.setOnClickListener(newView.OnClickListener()[7] 执行一下命令: { publicvoidonClick(Viewv) { resetValues(true); } };这样记录数据清零的按钮就完成了。4.2.3设置步长对于设置步长,首先要获取用户所输入的步长信息:returnFloat.valueOf(mSettings.getString("step_length","70")假设用户未对步长信息进展编辑,则默认为70.在DistanceNotifier中使用mStepLength来计算走过的距离:mDistance=mDistance+(float)(mStepLength/100000.0); notifyListener();4.2.4设置体重对于设置体重,首先要获取用户所输入的体重信息:returnFloat.valueOf(mSettings.getString("body_weight","50"假设用户未对步长信息进展编辑,则默认为50.在CaloriesNotifier中使用mBodyWeight来计算用户因运动所消耗的卡路里:mCalories+=(mBodyWeight*(mIsRunning"METRIC_RUNNING_FACTOR:METRIC_WALKING_FACTOR))*mStepLength/100000.0; notifyListener();4.2.5历史记录的查看及删除publicclassView1e*tendsActivity{//使用ActionBarActivity出现闪退不能运行,可以使用ActivityprivateListViewlist;privateButtonbtnBack,btnForward;privateintmYear,mMonth,mDay;privateTe*tViewtvTitle; String[]from; Stringtoday;int[]to;int_id; SimpleCursorAdaptermAdapter; DataBasedb; Cursorcur; OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.view1); db=newDataBase(this); db.CreatTable_amount(); list=(ListView)findViewById(R.id.listView1); Calendarc=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(mMonth<10) {today=mYear+"-"+"0"+mMonth;}else {today=mYear+"-"+mMonth;} cur=db.getAmount(today); from=newString[]{"date","Distance"}; to=newint[]{R.id.te*tView1,R.id.te*tView2}; cur=db.getAmount(today); mAdapter=newSimpleCursorAdapter(this,R.layout.items,cur,from,to); list.setAdapter(mAdapter); list.setOnItemLongClickListener(newOnItemLongClickListener(){ OverridepublicbooleanonItemLongClick(AdapterView <">Vparent,android.view.Viewview,intposition,longid){ //TODOAuto-generatedmethodstub _id=(int)id;newAlertDialog.Builder(View1.this).setTitle("提示ʾ").setMessage( "确定删除该细节"").setIcon(R.drawable.ic_launcher).setPositiveButton("确定",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){ //Log.v("",""+_id); db.delAmount(_id); mAdapter.changeCursor(cur); ((SimpleCursorAdapter)mAdapter).notifyDataSetChanged(); finish(); System.out.println("ok"); list.setAdapter(mAdapter); } }).setNegativeButton("取消",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhichButton){ } }).show();returnfalse; } }); tvTitle=(Te*tView)findViewById(R.id.tvTitle); tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+mYear+"-"+(mMonth+1)+"-"+"01");//if(mMonth==12){tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+1+"-"+"01");}elseif(mMonth>12){mMonth=1;mYear=mYear+1;tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+mYear+"-"+(mMonth+1)+"-"+"01");}// btnBack=(Button)findViewById(R.id.btnBack); btnForward=(Button)findViewById(R.id.btnForward); ButtonListenerbuttonlistener=newButtonListener(); btnBack.setOnClickListener(buttonlistener); btnForward.setOnClickListener(buttonlistener); }classButtonListenerimplementsOnClickListener{publicvoidonClick(android.view.Viewv) {switch(v.getId()) {caseR.id.btnBack:leftView();break;caseR.id.btnForward:rightView();break; } }privatevoidrightView(){ Calendarc=Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); mMonth++; tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+mYear+"-"+(mMonth+1)+"-"+"01");if(mMonth==12) { tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+1+"-"+"01"); }elseif(mMonth>12) { mMonth=1; mYear=mYear+1; tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+mYear+"-"+(mMonth+1)+"-"+"01"); }if(mMonth<10) {today=mYear+"-"+"0"+mMonth;}else {today=mYear+"-"+mMonth;} cur=db.getAmount(today); mAdapter.changeCursor(cur); ((SimpleCursorAdapter)mAdapter).notifyDataSetChanged(); }privatevoidleftView(){ mMonth=mMonth-1;if(mMonth<1) { mMonth=12; mYear=mYear-1; tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+"1"+"-"+"01"); }elseif(mMonth>=12) { mMonth=1; mYear=mYear+1; tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+"1"+"-"+"01"); }else tvTitle.setTe*t(mYear+"-"+mMonth+"-"+"01"+""+mYear+"-"+(mMonth+1)+"-"+"01");if(mMonth<10) {today=mYear+"-"+"0"+mMonth;}else {today=mYear+"-"+mMonth;} cur=db.getAmount(today); mAdapter.changeCursor(cur); ((SimpleCursorAdapter)mAdapter).notifyDataSetChanged(); }}}第五章计步器的界面效果5.1用户界面图5-1用户主界面5.2设置界面图5-2设置体重界面图5-3设置步长界面5.3历史界面图5-4记录历史界面5.4日历选择界面图5-5日期选择界面5.5用户离开界面图5-6用户离开界面第六章系统测试与分析6.1测试过程点击应用图标,如图6-1所示:图6-1图为计步器主界面计步器主界面开场记录数据,如图6-2所示:图6-2图为计步器主界面在主界面点击暂停,如图6-3所示: 图6-3图为停顿计步界面继续运动观察主界面数据是否有变化,如图6-4所示:图6-4图为停顿计步后仍在运动界面进入体重设置界面,如图6-5所示:图6-5图为体重设置界面进入步长设置界面,如图6-6所示:图6-6图为步长设置界面选择日期界面,如图6-7所示:图6-7图为日期选择界面图6-8图为日期选择后的界面历史界面,如图6-9所示:图6-8图为历史界面历史查询界面如图6-9所示:图6-9图为历史查询界面10〕历史删除界面如图6-10所示:图6-10图为历史删除界面图6-11图为历史删除后的界面11〕退出程序界面如图6-12所示:图6-12图为退出程序界面6.2测试分析本软件中几个模块的功能经过测试,均测试通过,测试结果和最初的设计根本一致,所有的功能均能正常运行,软件需要比拟特殊的运行环境,首先手机的重力感应功能必须有,而且Android系统的版本过低将不能使用。至此基于安卓平台的手机计步器的设计根本完成。结论经过了数月的努力,Android平台手计步器软件终于完成了。本软件能实现用户对计步器的根本要求。方便用户开启关闭计步器,对运动情况和运动量可以直观的从主界面获取信息,设置选项中的智能人机交互平台也可以明了的对用户信息进展编辑,不需要复杂的操作不需要学习,一目了然。对于智能手机用户来说,基于安卓平台的手机计步器提供了一个快捷方便的平台。为用户提供随时随地的效劳,节省用户不必要的资金消耗与时间消耗是本软件设计的一个宗旨,整个框架和细节的设计都是围绕这个宗旨进展的,虽然整个软件还不是很成熟,还有很多缺乏和需要改良的地方,或者还有很多信息提供不到位,例如我们可以参加音乐播放模块,是用户在运动的同时享受轻松快乐的环境,这些还需要日后慢慢优化和改善,但是最初的设计都实现了。在现在的功能根底上本软件可以进展扩展升级。本软件最初设计的时候就是一个可以扩展的框架,所以为将来参加新的功能提供了很大的方便。本软件虽然不是很强大,但是是我自己亲手编写的,开发一个能在时下最流行的软件,使之顺利的在平台上运行是一件令人兴奋的事情。把自己的想法一步一步地付诸实践,最后成为一个真实的实物,被别人使用和称赞,此时得到的成就感是尤为强烈的。参考文献[1]高焕堂.GoogleAndroid应用程序框架原理与程序设计./souree,2008.[2]E2ECloud工作室著.深入浅出GoogleAndroid[M].:人民邮电,2009-08-1.[3]AndroidAPI.chm.androidappdocs.appspot./inde*.html.2010-04-10.[4]王家林.大话企业级Android应用开发实战[M].电子工业,2011,8[5]差沙.用Android手机开发应用.程序员.2008.[6]万玛,宁关永,相军.嵌入式数据库典型技术SQLite和Berkeley的研究.微计算机信息,2006.[7]马越.Andriod的架构与应用.:中国地质大学,2008.[8]高昂,大祥等.GoogleAndroid开发入门与实践.:人民邮电,2009.[9]孝祥著.java就业培训教程[M].:清华大学,2007.[10]MichaelMcRoberts著,继志,郭敬译.Arduino从根底到实践[M].:电子工业,2013.附录:1.启动界面importandroid.app.Activity;importandroid.annotation.SuppressLint;importandroid.content.Intent;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;//importandroid.support.v7.app.ActionBarActivity;//////importandroid.widget.ImageView;importandroid.widget.Te*tView;publicclassWelee*tendsActivity{//ActionBarActivity可以使用Activity privateHandlermHandler=newHandler(); ImageViewimageview; Te*tViewte*tview; intalpha=150; intb=0; SuppressLint({"NewApi","HandlerLeak"}) SuppressWarnings("deprecation") Override protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.wele); imageview=(ImageView)this.findViewById(R.id.imageView1); imageview.setImageAlpha(alpha); newThread(newRunnable(){ publicvoidrun(){ while(b<2){ try{ if(b==0){ Thread.sleep(1000); b=1; }else{ Thread.sleep(50); } updateApp(); }catch(InterruptedE*ceptione){ e.printStackTrace(); } } } }).start(); mHandler=newHandler(){ Override publicvoidhandleMessage(Messagemsg){ super.handleMessage(msg); imageview.setAlpha(alpha); imageview.invalidate(); } }; } publicvoidupdateApp(){ alpha-=5; if(alpha<=0){ b=2; //渐变效果完毕时启动主菜单的Activity Intentin=newIntent(this,.zyl11123ok.deRun.View.class); startActivity(in); this.finish(); } mHandler.sendMessage(mHandler.obtainMessage()); }}2.主界面代码importjava.util.Calendar;importjava.util.TimeZone;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.app.DatePickerDialog;importandroid.app.DatePickerDialog.OnDateSetListener;importandroid.contentponentName;importandroid.content.Conte*t;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.content.SharedPreferences;import.Uri;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.IBinder;importandroid.os.Message;importandroid.preference.PreferenceManager;//importandroid.support.v7.app.ActionBarActivity;//////importandroid.util.Log;importandroid.view.LayoutInflater;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.DatePicker;importandroid.widget.EditTe*t;importandroid.widget.ImageButton;importandroid.widget.Te*tView;importandroid.widget.Toast;importandroid.R.layout;import.zyl11123ok.deRun.R;import.zyl.deRun.DataBase.DataBase;publicclassViewe*tendsActivity{//使用ActionBarActivit闪退不能运行y可以使用Activity privatestaticfinalStringTAG="Delightful"; privateButtonbtnReset,btnCancel,btnSave,btnDate,btnNe*t,btnAC; publicDataBasedb; privateTe*tViewtvDate,tvCount,tvMile,tvKaluli; privateButtonimageButton;privateSharedPreferencesmSettings; privateSettingsmPedometerSettings;privateUtilsmUtils;privateDatePickerDialogdialog;privateintmStepValue;privatefloatmDistanceValue;privatebooleanmIsRunning;privatebooleanmQuitting=false;privateintmYear;privateintmMonth;privateintmDay;privateintstep_length;intacctitemid=-1; //Override protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG,"[ACTIVITY]onCreate"); mStepValue=0; mUtils=Utils.getInstance(); setContentView(R.layout.view_plus); btnReset=(Button)findViewById(R.id.BtnReset); btnCancel=(Button)findViewById(R.id.btnCancel); btnSave=(Button)findViewById(R.id.BtnSave); btnDate=(Button)findViewById(R.id.BtnEdit); btnNe*t=(Button)findViewById(R.id.BtnNe*t); btnAC=(Button)findViewById(R.id.btnAC); db=newDataBase(this); db.CreatTable_amount(); tvDate=(Te*tView)findViewById(R.id.tvDate); initTime(); if(mMonth<10&&mDay<10) { tvDate.setTe*t(mYear+"-"+"0"+mMonth+"-"+"0"+mDay); } elseif(mMonth<10&&mDay>=10) { tvDate.setTe*t(mYear+"-"+"0"+mMonth+"-"+mDay); } elseif(mMonth>=10&&mDay<10) { tvDate.setTe*t(mYear+"-"+mMonth+"-"+"0"+mDay); } else{tvDate.setTe*t(mYear+"-"+mMonth+"-"+mDay);} ButtonListenerbuttonlistener=newButtonListener(); btnDate.setOnClickListener(buttonlistener); btnNe*t.setOnClickListener(buttonlistener); btnReset.setOnClickListener(buttonlistener); btnCancel.setOnClickListener(buttonlistener); btnSave.setOnClickListener(buttonlistener); btnAC.setOnClickListener(newOnClickListener(){ Override publicvoidonClick(android.view.Viewv){ AlertDialog.Builderbuilder=newAlertDialog.Builder(View.this); AlertDialog.Builderbuilder2=newAlertDialog.Builder(View.this); android.view.Viewview=LayoutInflater.from(View.this).inflate(R.layout.dialogdemo,null); android.view.Viewview2=LayoutInflater.from(View.this).inflate(R.layout.dialogdemo,null); builder.setView(view); builder2.setView(view2); finalEditTe*ted1=(EditTe*t)view.findViewById(R.id.editTe*t1); finalEditTe*ted2=(EditTe*t)view2.findViewById(R.id.editTe*t1); builder.setTitle("请输入步长(cm)"); builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){ Override publicvoidonClick(DialogInterfacearg0,intarg1){ Stringa=""+ed1.getTe*t().toString().trim(); if(!"".equals(a)){ booleanflag=true; for(inti=0;i<a.length();i++){ if("0123456789".contains(a.substring(i,i+1))==false){ flag=false; } } if(flag){ Settings.setStep_length(Integer.parseInt(a)); } } } }); builder.setNegativeButton("取消",newDialogInterface.OnClickListener(){ Override publicvoidonClick(DialogInterfacearg0,intarg1){ //TODOAuto-generatedmethodstub } }); builder.show(); builder2.setTitle("请输入体重(Kg)"); builder2.setPositiveButton("确定",newDialogInterface.OnClickListener(){ Override publicvoidonClick(DialogInterfacearg0,intarg1){ Stringa=""+ed2.getTe*t().toString().trim(); if(!"".equals(a)){ booleanflag=true; for(inti=0;i<a.length();i++){ if("0123456789".contains(a.substring(i,i+1))==false){ flag=false; } } if(flag){ Settings.setWeight(Integer.parseInt(a)); } } } }); builder2.setNegativeButton("取消",newDialogInterface.OnClickListener(){ Override publicvoidonClick(DialogInterfacearg0,intarg1){ //TODOAuto-generatedmethodstub } }); builder2.show(); } }); } //OverrideprotectedvoidonStart(){Log.i(TAG,"[ACTIVITY]onStart");super.onStart();} //OverrideprotectedvoidonResume(){Log.i(TAG,"[ACTIVITY]onResume");super.onResume();mSettings=PreferenceManager.getDefaultSharedPreferences(this);mPedometerSettings=newSettings(mSettings);mIsRunning=mPedometerSettings.isServiceRunning();booleantemp=mIsRunning;if(!mIsRunning&&mPedometerSettings.isNewStart()){startStepService();bindStepService();}elseif(mIsRunning){bindStepService();}mPedometerSettings.clearServiceRunning(); tvMile=(Te*tView)findViewById(R.id.tvMile); tvCount=(Te*tView)findViewById(R.id.tvCount); tvKaluli=(Te*tView)findViewById(R.id.tvKaluli); imageButton=(Button)findViewById(R.id.imageButton1); imageButton.setTe*t("暂停"); imageButton.setOnClickListener(newOnClickListener(){ booleantemp=mIsRunning; Override publicvoidonClick(android.view.Viewv){ if(temp){ imageButton.setTe*t("开场"); stopStepService();unbindStepService(); temp=false; } else{ imageButton.setTe*t("暂停"); startStepService(); bindStepService(); temp=true; } } });} //OverrideprotectedvoidonPause(){Log.i(TAG,"[ACTIVITY]onPause");super.onPause();} //OverrideprotectedvoidonStop(){Log.i(TAG,"[ACTIVITY]onStop");if(mIsRunning){unbindStepService();}if(mQuitting){mPedometerSettings.saveServiceRunningWithNullTimestamp(mIsRunning);}else{mPedometerSettings.saveServiceRunningWithTimestamp(mIsRunning);}super.onStop();}protectedvoidonDestroy(){Log.i(TAG,"[ACTIVITY]onDestroy");super.onDestroy();}protectedvoidonRestart(){Log.i(TAG,"[ACTIVITY]onRestart");super.onRestart();}privateMyServicemService;privateServiceConnectionmConnection=newServiceConnection(){publicvoidonServiceConnected(ponentNameclassName,IBinderservice){mService=((MyService.StepBinder)service).getService();mService.registerCallback(mCallback);mService.reloadSettings();}publicvoidonServiceDisconnected(ponentNameclassName){mService=null;}};privatevoidstartStepService(){if(!mIsRunning){Log.i(TAG,"[SERVICE]Start");mIsRunning=true;startService(newIntent(View.this,MyService.class));}}privatevoidbindStepService(){Log.i(TAG,"[SERVICE]Bind");bindService(newIntent(View.this,MyService.class),mConnection,Conte*t.BIND_AUTO_CREATE+Conte*t.BIND_DEBUG_UNBIND);}privatevoidunbindStepService(){Log.i(TAG,"[SERVICE]Unbind");unbindService(mConnection);}privatevoidstopStepService(){Log.i(TAG,"[SERVICE]Stop");if(mService!=null){Log.i(TAG,"[SERVICE]stopService");stopService(newIntent(View.this,MyService.class));}mIsRunning=false;}privatevoidresetValues(booleanupdateDisplay){if(mService!=null&&mIsRunning){mService.resetValues();}else{ tvCount.setTe*t("0"); tvMile.setTe*t("0"); tvKaluli.setTe*t("0"); SharedPreferencesstate=getSharedPreferences("state",0);SharedPreferences.EditorstateEditor=state.edit();if(updateDisplay){ stateEditor.putInt("steps",0); stateEditormit();}}}privatevoidinitTime(){ Calendarc=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); }privatestaticfinalintSTEPS_MSG=1;privatestaticfinalintDISTANCE_MSG=2;privateMyService.ICallbackmCallback=newMyService.ICallback(){publicvoidstepsChanged(intvalue){mHandler.sendMessage(mHandler.obtainMessage(STEPS_MSG,value,0));}publicvoiddistanceChanged(floatvalue){mHandler.sendMessage(mHandler.obtainMessage(DISTANCE_MSG,(int)(value*1000),0));}};privateHandlermHandler=newHandler(){OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseSTEPS_MSG: step_length=Settings.getStep_length();mStepValue=(int)msg.arg1;tvCount.setTe*t(""+mStepValue);DoublemDistance=mStepValue*step_length/100000.0;if(mDistance<=0.001)mDistance=0.0;tvMile.setTe*t((""+mDistance.toString()+"000000").substring(0,6));DoublemKaluli=Settings.getWeight()*mDistance*1.036;tvKaluli.setTe*t((mKaluli.toString()+"000000").substring(0,5)+"");break;//caseDISTANCE_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论