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

下载本文档

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

文档简介

PAGEPAGE81专业工程综合实训设计报告目录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.1Activity 43.1.2Service 63.1.3ContentProvider内容提供者 63.1.4Intent信使 63.2环境搭建 63.2.1安装JDK 63.2.2安装Eclipse 73.2.3AndroidSDK安装 73.2.4ADT安装 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测试分析 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应用程序的开发工作量,工具集成XML编辑器,将给开发者一个令人难以置信的开发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可以将数据保存到应用程序的私有存储区,这些存储区中的数据只能被写入这些数据的软件读取。它的本质是基于XML文件存储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,在这里/technetwork/java/index.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.exe。选定你要安装的内容。这里也需要配置环境变量,在用户变量中新建PATH值为:AndroidSDK中的tools绝对路径。[5]3.2.4ADT安装打开EclipseIDE,点击菜单中的“Help”然后点击“InstallNewSoftware”,再点击Add...按钮,这时会弹出一个对话框要求输入,Name和Location:Name项可以自己随便填取,Location输入/android/eclipse。点击确定后,在workwith后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有DeveloperTools,展开它会有AndroidDDMS和AndroidDevelopmentTool,选定他们。然后按要求一步一步next,完成之后,这个过程可能会很慢。这取决于网络环境。最后选择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.setText(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历史记录的查看及删除publicclassView1extendsActivity{//使用ActionBarActivity出现闪退不能运行,可以使用Activity privateListViewlist; privateButtonbtnBack,btnForward; privateintmYear,mMonth,mDay; privateTextViewtvTitle; String[]from; Stringtoday; int[]to; int_id; SimpleCursorAdaptermAdapter; DataBasedb; Cursorcur; @Override protectedvoidonCreate(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.textView1,R.id.textView2}; cur=db.getAmount(today); mAdapter=newSimpleCursorAdapter(this,R.layout.items,cur,from,to); list.setAdapter(mAdapter); list.setOnItemLongClickListener(newOnItemLongClickListener(){ @Override publicbooleanonItemLongClick(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=(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(mMonth>12){mMonth=1;mYear=mYear+1;tvTitle.setText(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.setText(mYear+"-"+mMonth+"-"+"01"+""+mYear+"-"+(mMonth+1)+"-"+"01"); if(mMonth==12) { tvTitle.setText(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+1+"-"+"01"); } elseif(mMonth>12) { mMonth=1; mYear=mYear+1; tvTitle.setText(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.setText(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+"1"+"-"+"01"); } elseif(mMonth>=12) { mMonth=1; mYear=mYear+1; tvTitle.setText(mYear+"-"+mMonth+"-"+"01"+""+(mYear+1)+"-"+"1"+"-"+"01"); } else tvTitle.setText(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./index.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.TextView;publicclassWelcomeextendsActivity{//ActionBarActivity可以使用Activity privateHandlermHandler=newHandler(); ImageViewimageview; TextViewtextview; intalpha=150; intb=0; @SuppressLint({"NewApi","HandlerLeak"}) @SuppressWarnings("deprecation") @Override protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.welcome); 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(InterruptedExceptione){ 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,com.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.content.ComponentName;importandroid.content.Context;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.EditText;importandroid.widget.ImageButton;importandroid.widget.TextView;importandroid.widget.Toast;importandroid.R.layout;importcom.zyl11123ok.deRun.R;importcom.zyl.deRun.DataBase.DataBase;publicclassViewextendsActivity{//使用ActionBarActivit闪退不能运行y可以使用Activity privatestaticfinalStringTAG="Delightful"; privateButtonbtnReset,btnCancel,btnSave,btnDate,btnNext,btnAC; publicDataBasedb; privateTextViewtvDate,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); btnNext=(Button)findViewById(R.id.BtnNext); btnAC=(Button)findViewById(R.id.btnAC); db=newDataBase(this); db.CreatTable_amount(); tvDate=(TextView)findViewById(R.id.tvDate); initTime(); if(mMonth<10&&mDay<10) { tvDate.setText(mYear+"-"+"0"+mMonth+"-"+"0"+mDay); } elseif(mMonth<10&&mDay>=10) { tvDate.setText(mYear+"-"+"0"+mMonth+"-"+mDay); } elseif(mMonth>=10&&mDay<10) { tvDate.setText(mYear+"-"+mMonth+"-"+"0"+mDay); } else{tvDate.setText(mYear+"-"+mMonth+"-"+mDay);} ButtonListenerbuttonlistener=newButtonListener(); btnDate.setOnClickListener(buttonlistener); btnNext.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); finalEditTexted1=(EditText)view.findViewById(R.id.editText1); finalEditTexted2=(EditText)view2.findViewById(R.id.editText1); builder.setTitle("请输入步长(cm)"); builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacearg0,intarg1){ Stringa=""+ed1.getText().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.getText().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=(TextView)findViewById(R.id.tvMile); tvCount=(TextView)findViewById(R.id.tvCount); tvKaluli=(TextView)findViewById(R.id.tvKaluli); imageButton=(Button)findViewById(R.id.imageButton1); imageButton.setText("暂停"); imageButton.setOnClickListener(newOnClickListener(){ booleantemp=mIsRunning; @Override publicvoidonClick(android.view.Viewv){ if(temp){ imageButton.setText("开始"); stopStepService(); unbindStepService(); temp=false; } else{ imageButton.setText("暂停"); 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(ComponentNameclassName,IBinderservice){mService=((MyService.StepBinder)service).getService();mService.registerCallback(mCallback);mService.reloadSettings();}publicvoidonServiceDisconnected(ComponentNameclassName){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,Context.BIND_AUTO_CREATE+Context.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.setText("0"); tvMile.setText("0"); tvKaluli.setText("0"); SharedPreferencesstate=getSharedPreferences("state",0);SharedPreferences.EditorstateEditor=state.edit();if(updateDisplay){ stateEditor.putInt("steps",0); stateEmit();}}}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.setText(""+mStepValue);DoublemDistance=mStepValue*step_length/100000.0;if(mDistance<=0.00

温馨提示

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

评论

0/150

提交评论