基于Android系统的计步器软件的设计与制作 - 图文
更新时间:2024-05-03 22:07:01 阅读量: 综合文库 文档下载
- android计步器实现推荐度:
- 相关推荐
北京邮电大学世
传感器的种类很多,其中包括加速度传感器、姿态传感器、磁场传感器、温度传感器、光传感器等,本论文介绍的计步器应用就是使用加速度传感器。
本论文主要对计步器以下功能做主要研究。程序运行后进入主界面,用户可以看到行程、消耗热量、速度以及步速。点击开始,进入运行状态,点击清零可以使所有数据回归零初始状态。点击设置选项可以进入设置界面,调节灵敏度来设置需要的灵敏度(灵敏度越高,对身体的动作的感应越灵敏,调节灵敏度来适应不同的体型了,路面等因素),通过设置步长来设置用户自身实际步长(为了估算行走的距离和速度,输入步长得出粗略的距离和速度,仅供参考),设置体重来调节用户的实际体重(这是为了计算消耗的卡路里)。
按软件工程步骤:
2.相关技术介绍
2.1 开发工具及环境简介
Android 的上层应用程序是用Java 语言开发,同时还需要基于Dalvik 虚拟机,所以Google 公司推荐使用主流的Java 继承开发环境Eclipse。只有Eclipse还不够,因为是使用Java 语言进行开发,还应该有由SUN 公司提供的Java SDK(其中包括JRE:Java Runtime Environment)。此外,Android 的应用程序开发和Java 开发有较大区别的,所以还需要有Google 提供的Android SDK。同时,还需要在Eclipse 安装ADT,为Android 开发提供开发工具的升级或者变更,是Eclipse 下开发工具的升级下载的工具。
简言之,需要以下软件,才能搭建Android 开发环境,从而进行Android 应用程序的开发。
(1) Java SDK (2) Eclipse (3) Android SDK (4) ADT 2.1.1 开发工具
2.1.1.1 Android SDK介绍
SDK指是软件开发包,被软件开发工程师用于为特定的软件包、软件框架、硬件
北京邮电大学世
平台、操作系统等建立应用软件的开发工具的集合。因此,Android SDK指的既是Android专属的软件开发工具包。 2.1.1.2 Eclipse简介
Eclipse是一个著名的跨平台的自由集成开发环境软件。最初主要用来Java语言开发,现在人们可以通过安装插件使其作为C++、Python、PHP等其他语言的开发工具。Eclipse的本身只是一个框架平台,但是随着众多插件的产生,使得Eclipse拥有很好的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse含有插件开发环境,这个组件主允许希望扩展Eclipse的软件开发人员构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
尽管Eclipse是使用 Java 语言开发的,但它的用途并不限于 Java 语言。例如,支持诸如 C/C++ 和 COBOL 等编程语言的插件已经可用。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
本系统即通过Eclipse,添加Android做插件,匹配上AndroidSDK进行软件的开发。
2.1.1.3 JDK简介
JDK(Java Development Kit)是一个写Java应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运行用Java语言写的applet和应用程序所需的工具组成。
JDK是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK(Software development kit)。JDK是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK中还包括完整的JRE(Java Runtime Environment,Java运行环境),也被称为private runtime。包括了用于产品环境的各种库类,以及给开发员使用的补充库,如国际化的库、IDL库。
2.1.1.4 ADT简介
Google专门为Eclipse开发了一个插件来辅助开发,即Android Development Tools(ADT)。目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE
北京邮电大学世
环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具。 2.1.2 开发环境
本软件是在windows 7 操作系统中,利用Eclipse开发工具搭载Android SDK工具包,结合Android手机自带的sqlite3数据库进行开发。
2.2 Android SDK常见公共类库介绍
2.2.1 android的传感器
加速度传感器 、磁场传感器、光线传感器 、重力传感器、线性加速传感器、等等。
加速度传感器 :Sensor.TYPE_ACCELEROMETER:返回手机设备在X,Y,Z三个方向上的加速度.(我们用到的)
磁场传感器:Sensor.TYPE_MAGNETIC_FIELD:,返回周围磁场在手机的X,Y,Z方向上的影响(磁场分量).
距离感应器:Sensor.TYPE_PROXIMITY: 重力传感器:Sensor.TYPE_GRAVITY:
线性加速传感器:Sensor.TYPE_LINEAR_ACCELERATION: 2.2.2 Android界面Activity介绍
Android的界面是由每一个成为Activity的java类组成的,这个类库是制作Android软件必须使用的。 WalkingActivity是应用程序的用户界面,主要功能是按照XML布局文件的内容显示界面并与用户进行交互。只有使用了这个才可以让用户看得见,本类中有几个常用的覆写方法来表示界面的生存周期,分别是:
onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy(),onRestart()七个方法。
Activity的生命周期图,如图2-1所示:
北京邮电大学世
图2-1 Android Activity生存周期图
北京邮电大学世
3.系统需求分析
3.1 可行性研究
可行性分析(Feasibility Analysis)也称为可行性研究,是在系统调查的基础上,针对刚刚开发打算进一步应用的系统的必要性和可能性的分析和研究。可行性研究的目的主要在于,用最小的代价在尽可能短的时间内确定问题是否能够解决。
该阶段通过对系统总目标的初步调研与分析,提出可行性方案并进行论证。在此,主要从经济可行性、技术可行性和操作可行性三方面进行分析。 3.1.1 经济可行性
随着人民生活水平的提高,尤其我国成功承办2008年奥运会以来,人们的健康运动意识逐渐增强。而上班族们由于时间紧张可利用的休闲时间较少,他们则会利用一些零散的时间进行锻炼,比如上班来回的路上多走路少乘车,在办公区尽量选择走楼梯而不是乘坐电梯等等,由于运动时间零散不便于量化自己的运动量,也就无法估计健身效果。在这样的背景前提下,拥有一款计步器就显得尤为必要了。目前市场上的计步器少则几十多则上百,而智能手机计步器软件的成本几乎为零。只需用户拥有一台有安卓系统的智能手机即可安装使用了。并且手机计步器软件携带方便,可以随时随地获取用户的运动信息,拥有不受地理和时间限制的特点,可以充分利用人们的闲暇时间,从这个角度看,该软件可行。 3.1.2 技术可行性
开发工具:Eclipse Classic 3.7.2 数据库环境:sqlite3
系统环境:Microsoft Windows XP或以上版本
软件实现是依靠基于Android系统的开发技术,使用的是java为主的开发语言进行开发,再加上SOAP技术进行数据交互。
北京邮电大学世
3.1.2.1 功能说明
具体有如下一些功能:计步开始,计步暂停,计步清零,主屏幕显示计步总数,走过的公里数,每分钟走多少步,每小时走多少公里和消耗的卡路里量。进入设置菜单设置灵敏度,设置步长,根据步长计算走过公里数、步速和消耗的卡路里量,设置体重和运动类型,主要用于计算消耗的卡路里量。退出应用。 3.1.2.2 技术分析
表 3-1 技术需求分析
关键技术项 数据结构 数据库 Java Android 要求 了解 熟悉 熟练 现有水平 了解 了解 熟悉 对照分析 可以满足要求。 虽有欠缺,但通过指导培训,应该在短期内可以达到要求。 基本可以满足要求。 短期需进一步达到要求,存在一定问题。 精通 熟悉
3.1.3 操作可行性
软件采用最主流的Android软件应用开发风格,并使用Android的原生组件进行开发,界面友好,简洁易懂,组建布局具有诱导性,用户使用极其方便快捷。主界面操作流程见图3-1,设置界面操作流程见图3-2。
开始 开始计步 计步暂停 计步清零 图3-1 图为主界面操作流程图
北京邮电大学世
主界面 设置 灵敏度 步长 体重 运动类型返回
图3-2 图为设置界面操作流程图
3.2 性能需求分析
为了保证软件能够长期、安全、稳定、可靠、高效地在Android设备上运行,本系统应该满足以下性能需求。 3.2.1 实用性原则
充分利用手机的内置传感器功能,为本软件提供信息支持,充分考虑用户获取信息的心理需求,在简洁实用的基础上对软件界面层级进行布局,做到了方便,美观大方。
3.2.2 可扩展性与可维护性原则
为适应将来的发展,软件应该具有良好的可扩展性和可维护性。系统设计尽可能模块化、组件化,由于Android设备分辨率的各不相同,使软件可灵活配置,适应不同的的Android终端设备。系统的可扩展性应包括能接纳已有的系统和在今后系统软硬件扩展时,能有效地保护已有的资源建设。当用户的需求有所改变时,可以对其快速的配置改变,以应对用户的需求,有一个较好的应用平台——Android设
北京邮电大学世
备,能容易地安装和卸载。系统易于扩充升级,既能满足当前业务的需求,将来的需求改变升级也被考虑在内。 3.2.3 安全可靠性原则
随着三网融合的发展,智能终端产业链的构成相对于传统功能手机发生了巨大变化。处于上游的操作系统提供商制定安全机制的基本规则以及相应的应用商店政策。终端厂商在这些规则的基础上,定制个性化的终端软件,建立自有的应用商店。应用软件开发商/开发者则利用操作系统提供商提供的工具进行各类应用软件的开发,第三方应用商店或论坛等提供应用软件的下载渠道。基于智能终端产业链在管理和技术方面暴露出来的脆弱性,来源于传统互联网和信息系统的各类攻击逐渐将目标定位于智能终端,并借助智能终端操作系统的开放性制造出大量的恶意软件。此外,应用商店的审核机制欠缺也导致了恶意软件的泛滥。目前智能终端信息窃取类软件横行,一款应用软件的安全可靠性便显得尤为重要了。
现在智能终端个人信息的泄露通常不会引起用户的觉察,或者即便觉察也无法判断其带来的损失。与早期的安全问题不同,个人信息泄露所带来的通常不是直接的高额话费,而是潜在的巨大经济损失。如银行账户泄密、绝密商业信息泄露等。如何保护用户个人信息,防止在用户不知情的情况下泄露隐私信息,是当前亟待解决的问题。本软件承诺不会残留用户任何的隐私信息。 3.2.4 用户界面美观原则
界面经过对用户心理的调研和统计后。并参考时下流行的软件风格进行设计,在此基础上,加入了对用户具有诱导性的按键设计,使得用户在初次使用的时候就会使用,而不需要在使用的时候进行特别的学习和指导。
a. 应用图标见图3-3。
图3-3 图为应用图标
北京邮电大学世
b.主界面见图3-4。 c.设置和退出按钮见图3-5。
图3-4 图为应用主界面 d.设置界面见图3-6。
图3-6 图为设置界面
图3-5 画红圈处为设置,退出按钮
北京邮电大学世
3.3 数据需求分析
表3-2 信息输入输出
信息输入 用户点击开始计步 用户点击暂停 用户用户点击清零 用户点击设置键 输入步长设置 输入灵敏度设置 输入体重设置 输入运动类型设置
信息处理 软件通过后台感应手机状态,开始计步 软件将通过后台停止感应手机状态,从而停止计步 软件通过后台运行清除所记录的数据 软件通过数据库中的设置管理 对数据库中步长信息进行改变 对数据库中灵敏度信息进行改变 信息输出 通过软件主界面输出计步总数,消耗卡路里等信息 显示计步的相应信息 所有这界面显示的信息将归零等待下次命令 显示设置主界面 刷新设置中步长列表 刷新设置中灵敏度列表 对数据库中的体重进行管理 刷新收藏夹电视频道的列表 对数据库中的运动类型进行管理 刷新收藏夹单词的列表
北京邮电大学世
4.系统设计
4.1 系统总体结构设计
在设计一款软件时一般都会把它分成几个模块,在模块的基础上还会再分小模块,这样就达到了软件模块化设计的要求,然后再对各个小模块进行详细设计和编写,采用模块化的管理方式可以使软件结构更清晰,也使得软件的管理更有秩序,使别人容易理解和阅读,但是这些模块也要根据别的模块来设计和约束,不能随便设计脱离框架,设计完成后需要把每个设计完成的模块根据总体框架结合起来。
根据本软件的功能需求,将本软件分为以下几个功能模块,如图 4-1所示:
主界面 暂停/开始 步数 公里 步速 时速 卡路里 清零 结束 开始暂停运动走过的总步数走过的总长度每分钟多少步走过的总步数运动所消耗的能量所有数据清零关闭应用软件
图4-1 整体框架图
/ 灵敏度 步长 体重 设置 运动类型 设置软件敏感程度设置用户一步多长设置用户体重设置用户运动类型 北京邮电大学世
4.2 系统静态模型设计
根据系统需求可以识别系统中存在的对象。从需求中可知我们至少创建2个类:主界面类和设置类。
系统和用户交互时需要直观的图形化界面,所以我们需要5个设置界面类。 确定了系统的类后需要确定类之间的关系,如图4-2所示:
StepService计步器后台服务类实现StepService对加速传感器的监听()ControlStepDetector加速度传感器的直接监听者监听加速度传感器并分发监听事件到各种notifier()ModelStepNotifier 对StepDetector的监听器(计步)监听到动作后,对步数进行累加()PaceNotifier 对StepDetector的监听器(步速)监听到动作后,对步速计算()SpeedNotifier 对StepDetector的监听器(时速)监听到动作后,对时速计算()DistanceNotifier 对StepDetector的监听器(距离)监听到动作后,对距离累加计算()CaloriesDetector加StepDetector的监听器(热量)监听到动作后计算累加热量()WalkingActivity主界面类及各种onXXXView组件监听/响应方法() 图4-2系统静态模型
北京邮电大学世
5.系统实现
本章介绍本系统的各个模块的设计和实现。首先在Eclipse中配置好ADT和Android SDK等开发环境,然后新建一个Android项目,项目名为pedometer,然后在Android项目中的AndroidManifest.xml文件中配置本软件需要使用的权限。
本论文用到的是:
计步器的主要功能有:计步开始/暂停,设置,显示运动所消耗的卡路里,走过长度,步速,时速,里程。本软件是一个结合手机用户特别是智能手机用户常用功能的一个软件平台,本软件可以通过界面快速获取运动的情况,获取信息后可以对这些信息进行个性化处理以方便用户直观的感受运动量。 5.1布局界面的设计 5.1.1主界面的设计 由于Android平台手机屏幕大小有限,为了不使用户有凌乱的感觉,在主界面使用了清爽的色彩以及上两层信息显示的排版,使界面看起来简单明快功能健全。 本软件实现了步速,步数,卡路里的显示等功能,为了让界面显得更为美观,使用更为方便,笔者使用在TextView的基础上实现了Tab底部菜单,在底部菜单上添加了 “Pause/Resume”,“Reset”如图5-1所示: (a)主界面运动信息的显示 (b)Pause/Resume及Reset键 图5-1 主界面信息显示及暂停/开始,清零键 北京邮电大学世 “Pause/Resume”主要终于用于停止和开启监听手机运动状态,也就是用户可以点击该按钮添来控制手机计步器的工作开始或者暂停。 “Reset”用于清除Android数据池所获得的数据即用户可以利用此键将之前所记录的运动信息清零,以便开始记录新一次的运动情况。 在主界面下,点击Android固有的功能键即可呼唤出设置和退出应用键,即“Settings”,“Quite”如图5-2所示: 图5-2 Settings和Quite键 “Settings”用于进入设置主界面,对用户的参数进行设这。 “Quite”即退出本程序 5.1.2设置界面的设计 用户选择设置后会进入一个设置列表界面,该界面是利用Android固有的资源模板,没有做多余的修饰,简单明了的表达出设置项目及目的。每一行显示一条设置信息。该界面仅仅使用一个ListView控件实现设置的列表,不占用较多的尺寸却能够让用户直观的看到所有关于计步器统计运动量所需的信息。 列表中的每一项均可再打开一个小窗口用于更改用户信息,例如设置步长功能(见图5-3),在点击“Step length”键后会出现填入用户步长的对话框如图5-4。 图5-3 设置步长 图5-4 输入用户步长 北京邮电大学世 设置列表中的每一项指向了一条设置内容,点击一条设置项目后能够进入设置项目的输入界面,用户可以根据自身的实际情况来更改设置信息,这也很符合人们的使用习惯。 5.2 各功能的实现 5.2.1 计步开始及暂停 首先对Pause/ resume键做一个监听 start_pause_button.setOnClickListener(new View.OnClickListener() 同时还要对此时状态做一个判断 start_pause_button.setText(mIsRunning ? R.string.pause : R.string.resume); 若初始状态为记录则显示pause,若初始状态为非记录状态则显示resume。具体 代码的实现见附录“开始/暂停按钮” 5.2.2 记录数据清零 对清零按钮做一个View即: resetButton = (Button) findViewById(R.id.reset_button); 实现清零的语句很简单,对“reset”键做一个监听,当用户点击“reset”键时,即: resetButton.setOnClickListener(new View.OnClickListener() 执行一下命令: { }; public void onClick(View v) { } resetValues(true); 这样记录数据清零的按钮就完成了。 5.2.3 设置步长 对于设置步长,首先要获取用户所输入的步长信息: return Float.valueOf(mSettings.getString(\ 北京邮电大学世 若用户未对步长信息进行编辑,则默认为20. 在DistanceNotifier中使用mStepLength来计算走过的距离: mDistance = mDistance + (float) (mStepLength / 100000.0); notifyListener(); 在paceChanged中使用mStepLength来计算步速: mSpeed = // kilometers / hour value * mStepLength // centimeters / minute / 100000f * 60f; // centimeters/kilometer tellFasterSlower(); notifyListener(); 5.2.4 设置体重 对于设置体重,首先要获取用户所输入的体重信息: return Float.valueOf(mSettings.getString(\ 若用户未对步长信息进行编辑,则默认为50. 在CaloriesNotifier中使用mBodyWeight来计算用户因运动所消耗的卡路里: mCalories += (mBodyWeight * (mIsRunning ? METRIC_RUNNING_FACTOR : METRIC_WALKING_FACTOR)) * mStepLength / 100000.0; notifyListener(); 5.2.5 设置运动状态 当用户选择跑步运动的时候,程序会判断返回值等于Running: return mSettings.getString(\ .equals(\ 判断跑步还是走路是为了方便计算用户所消耗的卡路里,在因运动所消耗卡路里的计算公式中跑步状态和走路状态分别对应不同的参数,根据用户的选择而确定卡路里的计算方法。设置运动装态的详细代码见附录“判断是走路还是跑步”。 北京邮电大学世 6.系统测试 6.1 测试开始停止模块 测试能否根据用户控制得到开始计步和停止计步的结果。 6.1.1 测试准备 1) 模块名:计步器 2) 负责人:梁文淑 3) 意图:测试计步器各模块功能。 6.1.2测试过程 1) 点击应用图标,如图 6-1所示: 2) 运动使主界面开始记录数据,如图 6-2所示: 我要过论文我要过论文我要过论文我要过论文我要过论文我要过论文我要过论文 图6-1 图为计步器主界面 图6-2 图为计步器主界面 北京邮电大学世 3) 在主界面点击Pause,如图 6-3所示: 4) 继续运动观察主界面数据是否有变化,如图 6-4所示: 我要过论文我要过论文我要过论文我要过论文我要过论文我要过论文我要过论文我要过论文我要 论文我要过论文我要过论文我要过论文我要过论文我要过论文我要文 图6-3 图为停止计步界面 图6-4 图为停止计步后仍在运动界面 5) 进入settings(设置)界面,如图 6-5所示: 6) 点击设置Sensitivity(灵敏度),如图6-6所示: 过论文我要过论文我要过论 图6-5 图为设置界面 图6-6 图为设置灵敏度界面 7) 点击设置Step length(步长),如图 6-7所示: 北京邮电大学世 8) 点击设置Body weight(体重),如图 6-8所示: 图6-7 图为步长设置界面 图6-8 图为体重设置界面 9) 点击设置Exercise type(运动类型),如图6-9所示: 过论文我要过论文我要过论文 我要过论文我要过论文我要过论文我要过论文我要过论文我要过论文 图6-9 图为运动类型设置界面 6.2 测试总结 本软件中几个模块的功能经过测试,均测试通过,测试结果和最初的设计基本 北京邮电大学世 一致,所有的功能均能正常运行,软件需要比较特殊的运行环境,首先手机的重力感应功能必须有,而且Android系统的版本过低将不能使用。至此基于安卓平台的手机计步器的设计基本完成。 北京邮电大学世 5.结论 经过了数月的努力,Android平台手计步器软件终于完成了。本软件能实现用户对计步器的基本要求。方便用户开启关闭计步器,对运动情况和运动量可以直观的从主界面获取信息,设置选项中的智能人机交互平台也可以明了的对用户信息进行编辑,不需要复杂的操作不需要学习,一目了然。对于智能手机用户来说,基于安卓平台的手机计步器提供了一个快捷方便的平台。为用户提供随时随地的服务,节省用户不必要的资金消耗与时间消耗是本软件设计的一个宗旨,整个框架和细节的设计都是围绕这个宗旨进行的,虽然整个软件还不是很成熟,还有很多不足和需要改进的地方,或者还有很多信息提供不到位,例如我们可以加入音乐播放模块,是用户在运动的同时享受轻松快乐的环境,这些还需要日后慢慢优化和改善,但是最初的设计都实现了。 在现在的功能基础上本软件可以进行扩展升级。本软件最初设计的时候就是一个可以扩展的框架,所以为将来加入新的功能提供了很大的方便。本软件虽然不是很强大,但是是我自己亲手编写的,开发一个能在时下最流行的软件,使之顺利的在平台上运行是一件令人兴奋的事情。把自己的想法一步一步地付诸实践,最后成为一个真实的实物,被别人使用和称赞,此时得到的成就感是尤为强烈的。 北京邮电大学世 参考文献 [1] 李刚.疯狂的Android讲义[M].北京:电子工业出版社.2011.7. [2] 吴亚峰,苏亚光.Android2.0游戏开发实战宝典[M].北京:人民邮电出版 社.2010.7. [3] 李宁.Android开发完全讲义[M].北京:中国水利水电出版社.2012.4. [4] 严蔚敏,吴伟民.数据结构 [M].北京:清华大学出版社.2007.3. [5] 李刚.疯狂Java讲义[M].北京:电子工业出版社.2008.10. [6] Bruce Eckel著.Java编程思想(陈昊鹏)[M].北京:机械工业出版 社.2007.6:23-35 [7] 苏亚光;吴亚峰;索依娜.Android平台下传感器技术开发计步器应用[J].电脑编程技巧与维护.2010(23):3-6. [8] 熊刚.基于Android的智能手机的设计与实现[D].武汉理工大学.2010:34一60. [9] Sandeep Kumar. Location Based Services using Android[C]. Android Application Fundamentals, 2009 IEEE International Conference: P1-5 [10] 姚昱旻,刘卫国.Android 与J2ME 平台间即时通信的研究与实现[J].计算机系 统应用.2008(12):118-120 [11] 公磊,周聪.基于Android 的移动终端应用程序开发与研究[J].计算机与现代 化.2008(8):86-89. [12] 差沙,地狱男爵.用Android 开发手机应用[J].程序员.2008(1):25-27 [13] Narayan Babu.Android application development skills[J].IT TIME WEEKLY, 2012。6(8):55-58. [14] Konrad Adenauer.Android structural design guidelines[J].Journal of Computer and Software Engineering,2012.3(6):69-72. 北京邮电大学世 附录 Activity package edu.bupt.comm.liangwenshu.pedometer; import android.app.Activity; import android.app.backup.RestoreObserver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; /** * @author Liangwenshu */ public class WalkingActivity extends Activity { private static final String TAG = \ private SharedPreferences mSettings; private PedometerSettings mPedometerSettings; private Utils mUtils; private TextView mStepValueView; // 步数 private TextView mPaceValueView; // private TextView mDistanceValueView; // 距离 private TextView mSpeedValueView; // 速度 private TextView mCaloriesValueView; // 卡路里消耗显示框 TextView mDesiredPaceView; private int mStepValue;// mStepValueView的值 private int mPaceValue;// mPaceValueView的值 private float mDistanceValue;// mDistanceValueView的值 private float mSpeedValue;// mSpeedValueView的值 北京邮电大学世 private int mCaloriesValue;// mCaloriesValueView的值 private float mDesiredPaceOrSpeed;// private int mMaintain;// is爬山 private boolean mIsMetric=true;// 公制和米制切换标志 private float mMaintainInc;// private boolean mQuitting = false; // private Button resetButton; private Button start_pause_button; // Set when user selected Quit from menu, can be used by onPause, onStop, // onDestroy /** * True, when service is running. */ private boolean mIsRunning;// 程序是否运行的标志位 /** Called when the activity is first created. */ @Override // 开始函数,重写该函数,加入日志。 @Override protected void onStart() { Log.i(TAG, \ super.onStart(); } // 重写回复函数 @Override protected void onResume() { Log.i(TAG, \ super.onResume(); mSettings = PreferenceManager.getDefaultSharedPreferences(this); mPedometerSettings = new PedometerSettings(mSettings); mUtils.setSpeak(mSettings.getBoolean(\ // Read from preferences if the service was running on the last onPause mIsRunning = mPedometerSettings.isServiceRunning(); // Start the service if this is considered to be an application start // (last onPause was long ago) mPedometerSettings.clearServiceRunning(); mStepValueView = (TextView) findViewById(R.id.step_value); mPaceValueView = (TextView) findViewById(R.id.pace_value); mDistanceValueView = (TextView) findViewById(R.id.distance_value); mSpeedValueView = (TextView) findViewById(R.id.speed_value); 北京邮电大学世 mCaloriesValueView = (TextView) findViewById(R.id.calories_value); mDesiredPaceView = (TextView) findViewById(R.id.desired_pace_value); // 重设按钮 resetButton = (Button) findViewById(R.id.reset_button); resetButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { resetValues(true); } }); // 开始/暂停按钮 start_pause_button = (Button) findViewById(R.id.start_pause_button); start_pause_button.setText(mIsRunning ? R.string.pause : R.string.resume); start_pause_button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (start_pause_button.getText().equals(getResources().getString(R.string.pause))) { start_pause_button.setText(R.string.resume); unbindStepService(); stopStepService(); } else if (start_pause_button.getText().equals(getResources().getString(R.string.resume))) { start_pause_button.setText(R.string.pause); startStepService(); bindStepService(); } } }); mIsMetric = mPedometerSettings.isMetric(); ((TextView) findViewById(R.id.distance_units)) .setText(getString(mIsMetric ? R.string.kilometers 北京邮电大学世 : R.string.miles)); ((TextView) findViewById(R.id.speed_units)) .setText(getString(mIsMetric ? R.string.kilometers_per_hour : R.string.miles_per_hour)); mMaintain = mPedometerSettings.getMaintainOption(); if (mMaintain == PedometerSettings.M_PACE) { mMaintainInc = 5f; mDesiredPaceOrSpeed = (float) mPedometerSettings.getDesiredPace(); } else if (mMaintain == PedometerSettings.M_SPEED) { mDesiredPaceOrSpeed = mPedometerSettings.getDesiredSpeed(); mMaintainInc = 0.1f; } Button button1 = (Button) findViewById(R.id.button_desired_pace_lower); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mDesiredPaceOrSpeed -= mMaintainInc; mDesiredPaceOrSpeed = Math.round(mDesiredPaceOrSpeed * 10) / 10f; displayDesiredPaceOrSpeed(); setDesiredPaceOrSpeed(mDesiredPaceOrSpeed); } }); Button button2 = (Button) findViewById(R.id.button_desired_pace_raise); button2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mDesiredPaceOrSpeed += mMaintainInc; mDesiredPaceOrSpeed = Math.round(mDesiredPaceOrSpeed * 10) / 10f; displayDesiredPaceOrSpeed(); setDesiredPaceOrSpeed(mDesiredPaceOrSpeed); } }); 北京邮电大学世 @Override protected void onPause() { Log.i(TAG, \ if (mIsRunning) { unbindStepService(); } if (mQuitting) { mPedometerSettings.saveServiceRunningWithNullTimestamp(mIsRunning); } else { mPedometerSettings.saveServiceRunningWithTimestamp(mIsRunning); } super.onPause(); savePaceSetting(); } } // 开始/暂停按钮 { public void onClick(View v) { if (start_pause_button.getText().equals(getResources().getString(R.string.pause))) { start_pause_button.setText(R.string.resume); unbindStepService(); stopStepService(); } else if (start_pause_button.getText().equals(getResources().getString(R.string.resume))) { start_pause_button.setText(R.string.pause); startStepService(); bindStepService(); 北京邮电大学世 } } }); mIsMetric = mPedometerSettings.isMetric(); ((TextView) findViewById(R.id.distance_units)) .setText(getString(mIsMetric ? R.string.kilometers : R.string.miles)); ((TextView) findViewById(R.id.speed_units)) .setText(getString(mIsMetric ? R.string.kilometers_per_hour : R.string.miles_per_hour)); mMaintain = mPedometerSettings.getMaintainOption(); ((LinearLayout) this.findViewById(R.id.desired_pace_control)) .setVisibility(mMaintain != PedometerSettings.M_NONE ? View.VISIBLE : View.GONE); if (mMaintain == PedometerSettings.M_PACE) { mMaintainInc = 5f; mDesiredPaceOrSpeed = (float) mPedometerSettings.getDesiredPace(); } else if (mMaintain == PedometerSettings.M_SPEED) { mDesiredPaceOrSpeed = mPedometerSettings.getDesiredSpeed(); mMaintainInc = 0.1f; } Button button1 = (Button) findViewById(R.id.button_desired_pace_lower); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mDesiredPaceOrSpeed -= mMaintainInc; mDesiredPaceOrSpeed = Math.round(mDesiredPaceOrSpeed * 10) / 10f; displayDesiredPaceOrSpeed(); setDesiredPaceOrSpeed(mDesiredPaceOrSpeed); } }); 北京邮电大学世 Button button2 = (Button) findViewById(R.id.button_desired_pace_raise); button2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mDesiredPaceOrSpeed += mMaintainInc; mDesiredPaceOrSpeed = Math.round(mDesiredPaceOrSpeed * 10) / 10f; displayDesiredPaceOrSpeed(); setDesiredPaceOrSpeed(mDesiredPaceOrSpeed); } }); if (mMaintain != PedometerSettings.M_NONE) { ((TextView) findViewById(R.id.desired_pace_label)) .setText(mMaintain == PedometerSettings.M_PACE ? R.string.desired_pace : R.string.desired_speed); } displayDesiredPaceOrSpeed(); } private void displayDesiredPaceOrSpeed() { if (mMaintain == PedometerSettings.M_PACE) { mDesiredPaceView.setText(\ } else { mDesiredPaceView.setText(\ } } @Override protected void onPause() { Log.i(TAG, \ if (mIsRunning) { 北京邮电大学世 unbindStepService(); } if (mQuitting) { mPedometerSettings.saveServiceRunningWithNullTimestamp(mIsRunning); } else { mPedometerSettings.saveServiceRunningWithTimestamp(mIsRunning); } super.onPause(); savePaceSetting(); } @Override protected void onStop() { Log.i(TAG, \ super.onStop(); } protected void onDestroy() { Log.i(TAG, \ super.onDestroy(); } protected void onRestart() { Log.i(TAG, \ super.onDestroy(); } private void setDesiredPaceOrSpeed(float desiredPaceOrSpeed) { if (mService != null) { if (mMaintain == PedometerSettings.M_PACE) { 北京邮电大学世 mService.setDesiredPace((int) desiredPaceOrSpeed); } else if (mMaintain == PedometerSettings.M_SPEED) { mService.setDesiredSpeed(desiredPaceOrSpeed); } } } private void savePaceSetting() { mPedometerSettings.savePaceOrSpeedSetting(mMaintain, mDesiredPaceOrSpeed); } private StepService mService; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mService = ((StepService.StepBinder) service).getService(); mService.registerCallback(mCallback); mService.reloadSettings(); } public void onServiceDisconnected(ComponentName className) { mService = null; } }; private void startStepService() { if (!mIsRunning) { Log.i(TAG, \ mIsRunning = true; startService(new Intent(WalkingActivity.this, 北京邮电大学世 StepService.class)); } } private void bindStepService() { Log.i(TAG, \ bindService(new Intent(WalkingActivity.this, StepService.class), mConnection, Context.BIND_AUTO_CREATE + Context.BIND_DEBUG_UNBIND); } private void unbindStepService() { Log.i(TAG, \ unbindService(mConnection); } private void stopStepService() { Log.i(TAG, \ if (mService != null) { Log.i(TAG, \ stopService(new Intent(WalkingActivity.this, StepService.class)); } mIsRunning = false; } 判断是走路还是跑步 public boolean isRunning() { return mSettings.getString(\ .equals(\ } public int getDesiredPace() { return mSettings.getInt(\ } public void savePaceOrSpeedSetting(int maintain, float desiredPaceOrSpeed) 北京邮电大学世 { SharedPreferences.Editor editor = mSettings.edit(); if (maintain == M_PACE) { editor.putInt(\ } else if (maintain == M_SPEED) { editor.putFloat(\ } editor.commit(); } }
正在阅读:
基于Android系统的计步器软件的设计与制作 - 图文05-03
《城南旧事》阅读课教案06-15
鲁教版八年级上册5-8单元重点05-06
ISO9001-2015 FDIS标准学习课堂练习10-19
数控切割设备维修保养说明及安全操作规程08-29
新课标人教版四年级上册数学单元测试题全套04-18
我以前的同桌作文500字07-08
3000字电子信息专业实习总结09-25
系统集成平台项目详细实施方案-v1.004-05
第四章 传热自测11-10
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 计步器
- 基于
- Android
- 图文
- 制作
- 设计
- 系统
- 软件
- 数学建模实验拟合
- 本科组_低功耗应用类_河南工业大学_基于介电原理的润滑油检测
- 可行性研究报告 - 图文
- 2013-2014学年人教版小学五年级上期末复习题汇编(91页)
- BOM详细解析(生产、销售、包材、海关用BOM)
- 总结梯形常用辅助线及对应例题
- 社会组织参与社会治理:进展、问题与对策
- 建筑材料
- 2011级地理科学类专业《地图学野外综合实习》教学大纲2011
- 水质监测项目(高锰酸盐指数、氨氮、硝酸盐氮、叶绿素、总氮和总
- 锡林郭勒盟褐煤提质行业发展情况调研报告
- 管理试题
- 三批可供网站转载新闻的中央新闻单位名单(发)
- 河南省历届省委书记(建国后) - 图文
- 大学语文-学习手册16.9.8(2学分) - 图文
- 还原糖测定
- SIMBANKV4操作手册
- 2016年山东省日照市五莲县中考数学一模试卷(解析版)
- 质量技术监督简报2007年第4期(总第101期)
- 2017年茂名一模作文审题指导及考场范文