最近项目研究了计步器模块,每天从0点开始记录当天的步数。 就像微信运动一样。 因为碰到了很多洞,所以今天有时间整理一下给大家看。
做之前在谷歌、baidu、github上找不到好的东西。 大部分都需要在后台生存,需要后台服务。
现在的大型手机制造商为了提高电池的续航距离(省电),基本上都会杀死AlertManager、Android.intent.action.boot _ completed和后台服务。
后台保存战略服务,基本上没什么用,被手机系统杀死只是时间问题,所以我觉得还是不做的好。 即使后台还活着,用户看到这个APP也会非常消耗电力,所以会被删除。
项目地址: https://github.com/Jia hongfei/todaystepcounter
第二编地址: http://www.Jian Shu.com/p/c4bb1c 45 aeec
目前,android仪表步骤有两种方法
系统步骤芯片
从Android 4.4版开始,部分机型实现了Sensor.TYPE_STEP_COUNTER传感器来记录用户行走的步数。 手机开机后开始记录,手机关机后重置为0。
该计步器芯片在系统级,相对于较早版本的传感器计步器,性能进行了一些优化:
因为APP使用单独记住步数的功能,所以不会额外消耗电力
系统芯片的步数是可持续的,可以在部分机型的后台优化不记住步数的问题。
加速度传感器计算方式
该传感器非常耗电,APP功耗高,会影响用户体验。
如果不在后台实时运行,就无法实现记住步数的功能。 如果APP进程被系统或安全软件杀死,则无法使用记住步数的功能
当通过以上两种方式实现计步器时,在移动电话提供计步器传感器时使用Sensor.TYPE_STEP_COUNTER方式,在不提供计步器传感器时使用Sensor.TYPE_ACCELEROMETER方式(app方式)
项目结构:
计步器Service使用单独的进程,因此使用进程间通信aidl。 todaystepcounterlib用于在单独的进程中实现库文件的计步器算法,app依赖于todaystepcounterlib项目来获取当前步数的表示。
screenshots.png
访问方法:
有关在项目结构app中使用计步器模块的信息,请参考以下代码
publicclassmainactivityextendsappcompatactivity {
privatestaticstringtag='主活动';
privatestaticfinalintrefresh _ step _ what=0;
//循环取当前时刻步数中间的间隔时间
private long time _ interval _ refresh=500;
privatehandlermdelayhandler=new handler (newtodaystepcountercall );
私有int MST epsum;
privateisportstepinterfaceisportstepinterface;
@Override
保护性视频创建(bundlesavedinstancestate )。
super.oncreate (savedinstancestate;
setcontentview (r.layout.activity _ main;
intentintent=newintent(this,VitalityStepService.class;
sartservice(intent );
bindservice(intent,new ServiceConnection )。
@Override
公共服务连接(componentnamename,I binder服务) )。
isportstepinterface=isportstepinterface.stub.as interface (服务;
try {
MST epsum=isportstepinterface.getcurrtimesportstep (;
updateStepCount (;
}catch(remoteexceptione ) {
e .打印任务跟踪(;
}
mdelayhandler.sendemptymessagedelayed (refresh _ step _ what,TIME_INTERVAL_REFRESH );
}
@Overridepublic 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,会合并步数