Android中的步数计数器:永远在线?

众所周知的问题是许多Android手机在屏幕关闭时关闭加速度计。 然而Android Fit(应用程序)似乎发生了一些变化。 即使屏幕熄灭,Fit也会保持计数步数。 如果安装了Fit,则会在Fit环境中引发事件以进行步数计数,并且我可以使用它来捕获它们

Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder() .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE) 

我在三星S4和Oneplus One上进行了测试,在这两种情况下都计算了步数。 他们是怎么做到的? 他们使用什么Android课程? 我的理解是,自Kitkat以来引入的可用方法是实现SensorEventListener。 例如,theelfismike提供了实现此function的代码。 然而,在许多手机上,当屏幕熄灭时,步数会停止。 有趣的是,如果安装了Google Fit应用程序,计数似乎并未停止(因此我猜他们会保持加速度计开启)。

我错过了什么吗? 屏幕关闭后保持计数步骤的function是否可供凡人程序员使用? 谢谢!

正如Ilja所说,即使屏幕关闭,您的代码也会运行。 但在这种情况下,我想我们需要一个不同的答案。

他们肯定使用一个保留唤醒锁的服务, 并向传感器查询数据。 这里的重要部分是拿着唤醒锁 – 你必须防止设备在你的服务生命周期内进入睡眠状态 – 如果你不想错过一些数据。

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

这就是为什么有传感器批处理 。 这样即使不让设备保持清醒,您也可以获得连续的传感器数据。 它基本上将传感器事件存储在芯片本身的基于hw的队列中,并且仅以预定间隔批量发送到您的应用程序(服务,…)。 这使您可以在不显着耗尽电池的情况下进行全天候监控。 请注意,只有受支持的芯片组可以做到这一点(您可以在Android文档中find详细信息),如果是旧手机,您需要回退到可怕的唤醒锁定方法以获取数据。

您也可以使用Google Fit API ,但只有在设备上安装了Google Fit + Google Play服务且监控已启用时,才能使用此function。

当屏幕关闭或者Activity失去焦点时,每个正常线程都会继续工作……但是当活动被杀死时,所有线程都被杀死了……

但是,您可以使用服务来执行长时间运行,例如询问加速度计