面试问题2之计步器

1 你这个是用什么语言写的

在Android studio上,配置了SDK,前端是用的xml开发的,后端是用的Java开发的,最后打包成一个apk安装到手机上运行

(追问)xml是什么

是一种标记语言,跟html有些类似,是一种开发前端的界面技术,

2 这是你自己做的吗

是的,当时因为自己很感兴趣,就动手做了一个这样的app,作为期末的设计交给老师,也因为这个设计,安卓老师给了我一个比较高的期末分数

(追问)有遇到过什么困难吗

这个项目功能不是很复杂,所以在开发的过程中都可以通过查资料看视频的方式解决。困难的话可能刚开始做,会有一些无从下手的感觉,不过因为有一些github上的例子作参考,所以总体过程还是比较顺畅的。

(追问) 说一下你的学习过程

本科有学过安卓开发的课程,那时候对这门课程很感兴趣,所以课下又单独找了安卓官方的系列教学的视频,后期做这个app的时候根据就是边查边做,也会参考github上的项目的代码思路,不断完善功能

3 都有什么功能(怎么进行交互的)

主界面显示的是 当前时间、步数、总里程、消耗的卡路里
交互操作主要有 开始计步、暂停、保存计步记录、查看记录、设置步长和体重这些操作

(追问) 是怎么实现计步功能的

就是利用了手机的加速度传感器,这个传感器可以感知人体加速度的变化,因为人的每走一步加速度就会有一个峰值,就仿写了一个峰值检测的算法,检测到一个峰值,传感器就判定为一步。在界面上的步数就有出现加一的显示

是使用的安卓自带的内置计步传感器,使用了峰值检测法这个计步算法,通过这个算法可以使用传感器来感知人体加速度的变化,用户每走一步就触发一次事件,会传递一个从开启服务开始到目前为止的计步总数,并将计步数传到Activity与用户交互

计步操作的实现主要在于手机中的内置的加速度传感器对步数的统计工作,因为人在行走过程中加速度变化会呈现出一个cos函数的波形,每走一步会出现一个加速度的峰值,传感器正是利用这一特点采用了峰值检测法来检测步数。当出现峰值时,并且前后两个峰值产生的时间之差是合理的,则将该步计入总步数。

具体的检测步骤为:
对峰值的检测需要找到满足如下条件的点:
上一次加速度向上,此次加速度向下,并且在该段时间内可以追溯到一段时间内的加速度数值一直增加

(追问)怎么计算总里程和卡路里的

默认:体重60kg
步长:1米
总路程=步长✖总步数
卡路里=体重✖总路程

(追问)历史记录里记录的是什么,是怎么存储起来的

历史记录里有 保存的时间、步数、总里程、卡路里
是使用了文件存储的方式,以字符流的的形式放到文件中,需要的时候读取,不需要的时候直接从文件中删除。

4 具体是如何实现这个步数的计算的 (什么情况下会进行计步)

点击开始计步,如果期间不暂停的话,就一直计步知道直到保存操作结束

(追问)关机之后还会统计步数吗,那熄屏或者app退出之后呢

关机之后就不会,或者退出app之后就不会统计步数了,
熄屏之后,如果这时候app仍在后台运行,也会是会一直统计步数的

(追问)怎么做到熄屏之后还统计步数的

用到SDK里的一个服务类, 开启一个Service就可以实现计步器的后台的运行,在其中实现传感器的监听,并将计步数传到Activity与用户交互,并在Service中每隔30s保存一次数据以保证数据的精确。
Service(服务)是Android中实现后台运行的解决方案,适合执行不需要与用户交互而且还要求长期运行的任务。

5 怎么实现数据的存储的

一些设置信息是用sharedpreference存储的
历史记录是用的文件以字符流的的方式存储

内置计步传感器
Android计步模块(类似微信运动)
Android中怎样使用计步器传感器 “TYPE_STEP_DETECTOR”
手机上的计步功能是怎么实现的

Sensor_ TYPE_STEP_DETECTOR

步行检测传感器,用户每走一步就触发一次事件

传感器类型值(Sensor Type):18 (0x00000012)

猜你喜欢

转载自blog.csdn.net/yunxiu988622/article/details/105697670