0°

Android计步模块优化(今日步数)

内容预览:
  • 3.对于各大手机厂商为了提高电池的续航里程AlertManager、BOOT_COMPLETE...~
  • 6.Android计步模块(类似微信运动) (http://www.jianshu.com/p/ca1e1c...~
  • 跨天分隔步数采用两种方式: 1.第一种方式和上面一样采用Intent.ACTION_...~

始发于微信公众号: 程序员小乐

分享编程技能、互联网技术、生活感悟、打造干货分享平台,将总结的技术、心得、经验分享给大家,这里不只限于技术!学无止境,不求尽如人意,但求问心无愧。让学习成为一种美、一种习惯。值得爱学习的你去关注,感觉有帮助转发分享让更多的人去关注!点击上方 蓝字 关注!



作者:码农一颗颗

链接: http://www.jianshu.com/p/cfc2a200e46d
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android计步模块优化(今日步数)—– 由   分享

每日英语

Our deeds determine us, much as we determine our deeds.

什么样的人,便决定了干什么样的事。同样,干什么样的事,也决定了是什么样的人。


1.最近在项目中研究计步模块,主要功能记录当天步数,类似微信运动,支付宝计步,咕咚今日步数。

2.开发之前的调研工作,搜遍baidu,google,github都没有找到我想要的demo和文章,大多数都是需要Service保活。

3.对于各大手机厂商为了提高电池的续航里程AlertManager、BOOT_COMPLETED、Service的START_STICKY基本上都是不起作用的,Service后台保活更是不可能。

4.下面是我实现的计步模块和大家一起学习

github地址(https://github.com/jiahongfei/TodayStepCounter

5.之前也有一篇文章写计步模块,这篇文章是对上面文章的优化,github代码已经更新到最新了。

6.Android计步模块(类似微信运动)

http://www.jianshu.com/p/ca1e1c3ac086


App计步模块优化的三个过程



1.加速度传感器Sensor.TYPE_ACCELEROMETER计步方式:


这种方式是有开源的算法根据加速度传感器进行计算步数;


优点:只要有加速度传感器的设备都可以使用,相对来说可以使用的设备较多。


缺点:步数的准确性取决于算法且算法比较难优化;需要后台保活Service否则不能计步;计步算法比较费电;部分手机锁屏不能计步;


2.计步传感器Sensor.TYPE_STEP_COUNTER计步方式:


官方解释翻译(本人英文不是很好根据理解翻译,如有错误请指出):


这个传感器是返回手机系统启动到当前时间的所有步数。手机系统重启传感器返回步数为0。还返回一个时间戳,表示最后一次步数的时间。这个计步传感器是个硬件,功耗非常低。如果你想记录步数,注册该传感器不要注销,他能自动在后台计步,在app唤醒的时候会返回计步总数。应用程序需要注册该传感器,否则不能返回步数。


优点:硬件计步准确性高;功耗小;只要注册不用后台Service自动计步;


缺点:Android4.4系统以上的部分手机;手机系统重启计步器清零;不能返回步数明细(步数对应时间),只是返回当前时间的总步数。


1.计步模块两种计步方式都采用:

2.判断是否支持Sensor.TYPE_STEP_COUNTER如果支持采用计步传感器,如果不支持用加速度传感器计步。

3.使用加速度传感器计步需要用户自己手动设置后台自启动,否则不能计步。

4.使用计步传感器需要在程序中克服他的缺点:手机系统重启计步器清零;不能返回步数明细(步数对应时间),只是返回当前时间的总步数。



先介绍接入方法,在介绍计步模块原理


接入方法



1.先下载计步demo TodayStepCounter

2.demo项目结构如下图:


Android计步模块优化(今日步数)

由图可见todaystepcounterlib是计步模块封装好的Module,它对外提供的接口就是ISportStepInterface.aidl

3.如何接入:

查看对外接口ISportStepInterface.aidl如下代码:


Android计步模块优化(今日步数)


查看使用代码MainActivity.java,里面关键代码有注释非常简单


Android计步模块优化(今日步数)

Android计步模块优化(今日步数)

Android计步模块优化(今日步数)



计步模块原理



计步模块流程图

Android计步模块优化(今日步数)

计步模块流程图.png


讲解流程图:

1.整个计步模块是由一个运行在单独进程的Service(TodayStepService)来提供,由于运行在单独的进程所以对外提供的接口采用aidl形式(ISportStepInterface)。


2.零点分隔广播(TodayStepAlertReceive):用来解决跨天计步模块归零问题,由于计步传感器不会根据天来分割只是返回当前步数的总和,所以需要这个广播来对计步模块进行分割,只要跨天了计步模块就归零从0开始计步。


3.开机广播(TodayStepBootCompleteReceiver):开机广播用来解决手机重启计步传感器归零问题,由于计步传感器手机重启会归零,所以收到开机广播会做步数合并,启动Service从上次关机的步数开始累加。


4.数据库(TodayStepDBHelper):用来记录当天步数明细,一个时间对应一个步数


5.加速度传感器计步(TodayStepDcretor):由于android4.4以下或者一些特殊的手机不提供计步传感器所以这些机型采用加速度传感器进行计步,通过OnStepCounterListener监听返回给TodayStepService .


6.计步传感器计步(TodayStepCounter):android4.4以上提供了计步协处理器,可以通过计步传感器计步功耗小,计步准,通过OnStepCounterListener监听返回给TodayStepService .


7.关机监听(TodayStepShutdownReceiver):用来判断手机是否关机,当重启手机打开计步Service根据这个标志来判断是否重启进行步数合并,主要是增加精度有时开机广播不能收到。


加速度传感器计步流程图


Android计步模块优化(今日步数)

加速度传感器计步流程图.png


讲解流程图:


Android4.4以下或者一些特殊的手机不提供计步传感器,我只能用加速度传感器计步,加速度传感器的原理就是利用一定的算法模拟出步数(加速度传感器计步算法不在本篇文章讨论的范围之内),用这种方式计步Service一定要在后台存活否则不能计步,这种方式跨天分隔步数利用Intent.ACTION_TIME_TICK广播回调来判断当前时间和上次PreferencesHelper记录的时间是否相同如果不同步数归零从0开始计步,步数的记录采用PreferencesHelper来保存,防止当天重启手机系统步数归零。


计步传感器计步流程图

Android计步模块优化(今日步数)

计步传感器计步流程图.png


讲解流程图:


Android4.4以上的可以使用计步传感器进行计步,至于计步传感器的有点上面已经介绍了。这种方式部分手机可以不需要程序自启动权限。


跨天分隔步数采用两种方式:


1.第一种方式和上面一样采用Intent.ACTION_TIME_TICK广播,这里不多说了。


2.第二种方式采用AlertManager方式也就是设置0点闹钟,在这个0点广播中对步数进行分隔,这个AlertManager不是每个手机都可以启动的。


手机系统重启判断采用四种方式:


1.开机广播监听BOOT_COMPLETED,这个监听不是每个手机都可以收到,如果收到可以启动Service,然后做步数合并使计步模块从上次关机时的步数开始累加,如果收不到只能用下面几种方式增加重启的判断了。


2.关机广播监听ACTION_SHUTDOWN,这个监听不是每个手机都可以收到,如果收到,在用户手动启动 Service中可以判断系统重启了。


3.记录运行时间判断手机重启,上次运行的时间大于当前运行时间判断为重启,只是增加精度,极端情况下连续重启,会判断不出来。


4.上次传感器步数总和,当前传感器步数小于上次传感器步数肯定是重新启动了,只是用来增加精度不是绝对的


计步传感器计步核心流程


Android计步模块优化(今日步数)

计步核心流程.png



这个流程图的讲解都在图片上。


提高计步精度:



1.设置app后台自启动


2.各种安全软件设置app为白名单,为了保证app不被任何安全软件在后台杀死。


以上两种方式保证通知栏中一直显示app的步数。


3.手机系统重启,如果通知栏中没有显示步数,表示app没有收到开机监听,需要手动启动app,否则步数会丢失 。


app一直在后台存活肯定会耗电,部分手机可以在后台关闭的情况下计步,但是这种方式需要每天早上打开一次app让计步模块对步数进行清零否则步数会丢失。


需要优化:



1.每次传感器回调都会写三次SharedPreferences。

2.计步模块在后台存活,每天过0点开始计步都会丢失一些步数,丢失的步数跟启动计步传感器需要的步数有关,例如:我的测试机连续走10步才可以启动计步传感器回调,所以就丢失10步。


总结:



Android计步就是在和android系统作斗争,各种系统监听回调都不好用(AlertManager、BOOT_COMPLETED、JobScheduler),还要解决计步传感器的一些限制(系统重启清零,不能自动分天,部分手机进程杀死不能计步),还要规避不同手机的问题,我们只能尽量做到不丢失步数,提高计步精度,目前我在测试计步发现支付宝计步非常准,我猜测系统为支付宝做了系统进程。


只有不断天坑,优化,增加计步准确性,也请个位大神下载代码一起交流。


如何您想进技术群和大牛们交流,关注公众号在后台回复 “加群” 即可

如果您觉得不错,请别忘了分享到您的朋友圈让更多的人看到!! 您的举手之劳,就是对我最好的支持,非常感谢!


Android计步模块优化(今日步数)

每日掏心话

起初,我们揣着糊涂装明白。后来,我们揣着明白装糊涂。并不是我们愿意活得不明不白。


Android计步模块优化(今日步数)


推荐阅读





小密圈
这里聚集了业界内的大牛,值得各位大牛的加入!


Android计步模块优化(今日步数)

看完本文有收获?请转发分享给更多人
关注「杨守乐」,提升编程技能

【QQ技术群】279126311 []
【QQ技术群】484572225 [未]


以上就是:Android计步模块优化(今日步数) 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论