Android中的步进计数器:始终打开?

Android中的步进计数器:始终打开?,android,accelerometer,google-fit,Android,Accelerometer,Google Fit,这是一个众所周知的问题,许多安卓手机关闭加速度计时,手机。然而,Android Fit(应用程序)似乎已经发生了一些变化。即使屏幕关闭,Fit也会持续计算步数。如果安装了Fit,则会在Fit环境中引发事件进行步数计算,我可以使用 Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder() .setDataTypes(DataType.TYPE_STEP_COUNT_CUM

这是一个众所周知的问题,许多安卓手机关闭加速度计时,手机。然而,Android Fit(应用程序)似乎已经发生了一些变化。即使屏幕关闭,Fit也会持续计算步数。如果安装了Fit,则会在Fit环境中引发事件进行步数计算,我可以使用

Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
                .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)
我已经在三星S4和Oneplus One上测试了这一点,在这两种情况下都计算了步数。 他们是怎么做到的?他们使用什么Android类? 我的理解是,自Kitkat以来引入的可用方法是实现SensorEventListener。例如,Selfismike提供了这样的代码。然而,在许多手机上,当屏幕关闭时,步数停止。有趣的是,如果安装了GoogleFit应用程序,计数似乎并没有停止(因此我猜他们会保持加速计开启)

我错过什么了吗?普通程序员可以在屏幕关闭后继续计算步骤吗?
谢谢

当屏幕关闭或活动失去焦点时,每个正常线程都会继续工作…但当活动被终止时,所有线程都会被终止


但是,您可以使用服务执行长时间运行的任务,例如询问加速计,正如Ilja所说,您的代码即使在屏幕关闭后也会运行。但在这种情况下,我想我们需要一个不同的答案

他们肯定会使用一种服务来保存数据,并向传感器查询数据。这里最重要的部分是保持wakelock,如果您不想丢失某些数据,您必须防止设备在服务生命周期内进入睡眠状态

但这种方法会很快耗尽电池电量,因为为了检测步骤,需要处理来自传感器的大量数据

这就是为什么会有。这样,即使设备处于唤醒状态,您也可以获得连续的传感器数据。它基本上将传感器事件存储在芯片本身的一个基于硬件的队列中,并且只以预定义的间隔批量发送给您的应用程序(服务…)。这使您能够进行24/7监控,而无需大量耗尽电池电量。请注意,只有受支持的芯片组才能做到这一点(您可以在Android文档中找到详细信息),如果是较旧的手机,您需要回退到可怕的wakelock保持方法才能获取数据


您也可以直接使用,但只有当设备上同时安装了Google Fit+Google Play服务且监控功能已打开时,此功能才起作用。

谢谢您的回答。我使用后台服务,因此当应用程序失去焦点时,它们仍在工作。我在这个过程中使用了步进计数器和活动识别。活动继续进行。台阶计数器被杀死了。谢谢@simekadam。你说的是对的。然而,我不明白的是他们是如何做到这一点的。在许多手机上,我能看到的唯一保持踏板计数器开启的方法是获得一个完全锁定,这并不是真正的节能。大部分加速计似乎忽略了WakefulBroadcastReceiver等部分尾波锁。这就是为什么我想知道他们是如何以一种高效的方式来做这件事的。@FabioCiravegna你能不能在你的问题上多发一些代码?这可以帮我解决你的问题..你是从一个WakefulBroadcasting接收器启动你的步进计数器吗?您是否使用startWakefulService启动录音服务?您是否也为您的服务购买了单独的唤醒锁?(WakeFullBroadcastReceiver在60秒后释放其wakelock)非常感谢您提供的帮助。我在[link]()Github上创建了一个简单的示例。这比我之前提到的更简单。主活动注册传感器并设置部分唤醒锁。然后我开始活动。step_计数器工作正常。当我关掉电话时,它就停止了。但是,我创建了一个服务来检查wakeLock是否打开。它是。但是台阶计数器是关闭的。设置还会检查手机是否具有硬件步进计数器。我的有。我很困惑。欢迎任何帮助。谢谢尝试删除
活动运行
条件。这将使步进计数器即使在屏幕关闭后仍能工作。此外,您最好将步进计数逻辑移到服务中。无论您持有何种证书,活动都可以随时终止wakelock@JohanShogun:文档中的内容:网络访问被禁用,除非您的应用程序收到高优先级的谷歌云消息提示。唤醒锁被忽略。使用AlarmManager类计划的报警被禁用,但使用setAlarmClock()方法和AlarmManager.SetAndAllowHileId()设置的报警除外。不允许运行同步适配器和作业调度器的同步和作业。结论:您将无法在打瞌睡时获取加速计数据-您可能会在稍后根据硬件队列大小获取加速计数据(或部分数据)(一旦撤消)。