最近在项目中研究计步模块,每天0点开始记录当天的步数,类似微信运动。碰到了不少坑今天有时间整理出来给大家看看。

做之前在google、baidu、github上搜了个遍没找到好的,大多数都是需要在后台存活,需要后台Service。

对于现在的各大手机厂商为了提高电池的续航里程(省电),基本上AlertManager、android.intent.action.BOOT_COMPLETED、后台Service都是被干掉的。

后台保活策略Service,基本上没什么用,被手机系统干掉只是时间问题,所以我认为最好也不要去做,就算后台存活了,用户看到这个app非常费电也会被删除的。

项目地址:https://github.com/jiahongfei/TodayStepCounter

第二篇地址:http://www.jianshu.com/p/c4bb1c45aeec

目前android计步有两种方式

系统计步芯片

在Android4.4版本之后,部分机型实现了Sensor.TYPE_STEP_COUNTER传感器,用于纪录用户行走的步数。从手机开机开始纪录,手机关机时重置为0。

这个记步芯片是系统级别的,相对之前老版本的传感器记步,性能有一些优化:

不会因为App单独用了记步的功能而额外耗电

系统芯片记步是持续的,能够优化部分机型后台不记步的问题。

加速度传感器计算方式

加速度传感器非常耗电,导致App的耗电量很高,影响用户体验。

需要后台实时运行才能实现记步的功能,如果App进程被系统或者安全软件杀死,导致记步功能没办法使用

根据以上两种方式实现计步,手机提供计步传感器就使用Sensor.TYPE_STEP_COUNTER方式(app后台关闭也可以计步,但是部分手机也不支持,请看第二篇),如果不提供就使用Sensor.TYPE_ACCELEROMETER方式(app需要保持后台运行)。

项目结构:

计步Service使用单独进程,所以使用到进程间通信aidl,todaystepcounterlib为库文件用于在单独进程中实现计步算法,app依赖todaystepcounterlib项目获取当前步数展示。

screenshots.png

接入方式:

项目结构app中时如何使用计步模块的看如下代码

public class MainActivity extends AppCompatActivity{

private static String TAG = "MainActivity";

private static final int REFRESH_STEP_WHAT = 0;

//循环取当前时刻的步数中间的间隔时间

private long TIME_INTERVAL_REFRESH = 500;

private Handler mDelayHandler = new Handler(new TodayStepCounterCall());

private int mStepSum;

private ISportStepInterface iSportStepInterface;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Intent intent = new Intent(this, VitalityStepService.class);

startService(intent);

bindService(intent, new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service){

iSportStepInterface = ISportStepInterface.Stub.asInterface(service);

try {

mStepSum = iSportStepInterface.getCurrTimeSportStep();

updateStepCount();

} catch (RemoteException e) {

e.printStackTrace();

}

mDelayHandler.sendEmptyMessageDelayed(REFRESH_STEP_WHAT, TIME_INTERVAL_REFRESH);

}

@Override

public void onServiceDisconnected(ComponentName name){

}

}, Context.BIND_AUTO_CREATE);

}

class TodayStepCounterCall implements Handler.Callback{

@Override

public boolean handleMessage(Message msg){

switch (msg.what) {

case REFRESH_STEP_WHAT: {

if (null != iSportStepInterface) {

int step = 0;

try {

step = iSportStepInterface.getCurrTimeSportStep();

} catch (RemoteException e) {

e.printStackTrace();

}

if (mStepSum != step) {

mStepSum = step;

updateStepCount();

}

}

mDelayHandler.sendEmptyMessageDelayed(REFRESH_STEP_WHAT, TIME_INTERVAL_REFRESH);

break;

}

}

return false;

}

}

private void updateStepCount(){

Log.e(TAG,"updateStepCount : " + mStepSum);

TextView stepTextView = (TextView)findViewById(R.id.stepTextView);

stepTextView.setText(mStepSum + "步");

}

}

计步策略:

1.如果使用加速度传感器计步必须要app在后台存活才可以计步。‘

2.重头戏是使用计步传感器实现计步,app在后台关闭也可以计步。

如下是采用Sensor.TYPE_STEP_COUNTER传感器实现计步策略:

1. 用户新安装app,从用户第一次打开App开始计步,当天不跨天

case_1.png

2. 用户一直打开app计步,且跨越0点没有关闭App

case_2.png

3.用户打开一次App后台关闭,跨越0点且0点分隔AlertManager不能自启动(目前多数手机都是不能启动的)

case_3.png

4.用户打开一次app后台关闭,跨越多个0点且Alertmanager 0点分隔可以启动

case_4.png

5.用户开启一次app且在同一天进行重启手机(自启动不好用,很多手机不好用)

case_5.png

6.用户开启一次app,开关机跨0点(开机自启动不好用)

case_6.png

7.用户开启一次app,开关机跨0点(开机自启动可以)

case_7.png

缺陷

1.方案三 跨0点打开app步数算 前一天的,如果跨越多天会导致前一天步数非常大。

2.方案四 跨0点之前的步数会丢失(由于0点分隔AlertManager可以回调,所以可以处理0点之前的数据,以后版本在修复吧)

3.在计步器回调中频繁调用SharePreference费电

注意:

1.每天早上打开App可以提高几步精度,和微信步数几乎一致。 2.每次重启手机请打开app,会合并步数

android自动计步_Android计步模块(类似微信运动)相关推荐

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

    最近在项目中研究计步模块,每天0点开始记录当天的步数,类似微信运动.碰到了不少坑今天有时间整理出来给大家看看. 做之前在google.baidu.github上搜了个遍没找到好的,大多数都是需要在后台 ...

  2. Android计步模块(类似微信运动 今日步数)

    目前android计步有两种方式 系统计步芯片 在Android4.4版本之后,部分机型实现了Sensor.TYPE_STEP_COUNTER传感器,用于纪录用户行走的步数.从手机开机开始纪录,手机关 ...

  3. Android聊天页面发送图片定制(类似微信)

    前言 微信聊天页面的图片显示是一个自定制的形状,和它的聊天背景形状一样,在此仿微信定制了一个工具,可以自定制他的形状.前提是要有个背景图片.我在此封装的是网络和本地图片的定制工具类,基于univers ...

  4. Android自定义九宫格图片展示,类似微信朋友圈

    之前网上也找了很多类似的功能,但是很多放在列表中复用item就出现高度测量是0,出现条目中图片空间不显示问题 这里做了一些优化,解决该问题 具体可参考这篇博客,(这里要感谢博主)不过这个放在列表复用时 ...

  5. android 仿微信选取相册_Android类似微信图片选择器

    很多项目要用到图片选择控件,每次都要写一大堆逻辑.于是基于图片选择组件(PhotoPicker)封装了一个控件PhotoUploadView.方便简易,一键集成,几句代码就可以添加类似微信的图片选择控 ...

  6. Android原生计步功能的实现,记录当日步数(仿微信运动),不需要后台service

    Android原生计步功能的实现,记录当日步数(仿微信运动),不需要后台service 概述:通过调用Android4.4以上系统自带的计步传感器Sensor.TYPE_STEP_COUNTER,实现 ...

  7. android 获取微信计步数量,微信运动步数是怎样计算的?终于有人研究出来了!

    第一组萌妹子赢114步第二组赢76步,小短腿完胜. 实验成果: 经过两组测验,微信运动记载下的步数 每一组都是萌妹子占优 看来如果走相同的旅程,大长腿并没有优势 test 3 跑步比走路记步多?真相让 ...

  8. 手机用计算机微信运动记步吗,微信运动怎么用?微信运动计步功能使用方法介绍...

    微信手机版2017v6.5.4 官网最新版 类型:社交聊天大小:38.7M语言:中文 评分:9.3 标签: 立即下载 微信运动计步功能推出已经有较长的一段时间了,但是许多的手机微信用户不知道微信 ...

  9. 利用Xposed框架修改微信运动计步

    1.源码 使用的方法是以咕咚为跳板,先修改咕咚的计步数据然后上传微信. 其中: l 使用的手机是 小米3+miui8首先要满足xposed可以运行的条件,其次系统一定要是android6.0+,原因会 ...

  10. php接入微信运动计步功能,运动计步,微信运动究竟靠不靠谱?

    很多朋友喜欢用微信运动,记录自己每天的运动步数,希望通过每天运动计步,达到减肥健身的效果.那么,微信运动到底靠谱吗 ? 能起到锻炼的效果吗 ? 在搞清这个问题之前,我们需要熟悉几个概念. 1.微信计步 ...

最新文章

  1. java编程 linux_Linux下java编程
  2. 应用PlanAhead进行I/O规划
  3. 十二个任务 分给三个线程处理
  4. C++学习笔记之二:通过结构体来理解类
  5. SAP Spartacus B2B 页面 Disable 按钮的显示原理
  6. Linux用于账号文件,linux的文件及账号管理
  7. 笔记,Vector类模板的基本功能
  8. csv文件怎么转成excel_Java读写excel,excel转成json写入磁盘文件
  9. 覆盖php扩展后服务挂了,PHP 扩展管理
  10. plc输入/输出模块的选择
  11. LayoutInflater的使用
  12. 分级基金下折套利风险介绍
  13. 还在傻傻的数star、数fork吗?3秒钟教会你如何查看GitHub项目活跃度,是死是活一眼便知
  14. html5 input valid,javascript – 如果inputElement.validity.valid == false,如何显示HTML5验证?...
  15. Linux系统卡死,只有鼠标能动,解决办法
  16. 为什么要学习数据结构?
  17. 数据结构课程设计报告——Huffman编码
  18. 泊松分布、高斯分布、卡方检验与noise level
  19. php mysql 撮合交易_Php+Redis 币币交易撮合
  20. 备考蓝桥杯【快速排序和归并排序】

热门文章

  1. 维纳滤波python 函数_图像维纳滤波实现(1)
  2. 笔记本显示未连接录音服务器,电脑显示未安装音频设备怎么办?
  3. 计算机汉字编码输入码,汉字编码、输入系统和码本
  4. 用命令行安装IIS(pkgmgr版)
  5. .NET报表控件TeeChart使用教程:构建图表
  6. linux 锐捷 自动,Linux 锐捷自动交互认证
  7. 台式计算机键盘驱动,提示检测到不兼容的键盘驱动程序怎么解决 教你几个步骤轻松修复...
  8. 床长人工智能教程 - 前言
  9. 5000字超干货,新中国成立70年人口流动迁移的特征与趋势可视化!
  10. 安居客Android项目架构演进