Android 中的计步器:始终开启?

Step Counter in Android: always on?

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

捕获它们
Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
                .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)

我已经在 Samsung S4 和 Oneplus One 上对此进行了测试,在这两种情况下都计算了步数。 他们是怎么做到的?他们用什么Android 类? 我的理解是Kitkat之后引入的available方法是实现一个SensorEventListener。例如 theelfismike 提供的代码是 implements this。然而,在许多手机上,当屏幕熄灭时计步停止。有趣的是,如果安装了 Google Fit 应用程序,计数似乎不会停止(因此我猜他们会保持加速度计开启)。

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

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

但是您可以将服务用于长时间运行的任务,例如询问加速度计

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

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

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

这就是 sensor batching 的原因。这使您即使不让设备保持唤醒状态也能获得连续的传感器数据。它基本上将传感器事件存储在芯片本身的基于硬件的队列中,并且仅按预定义的时间间隔将它们分批发送到您的应用程序(服务,..)。这使您可以进行 24/7 监控,而不会显着耗尽电池电量。请注意,只有支持的芯片组才能做到这一点(您可以在 Android 文档中找到详细信息),如果是旧手机,您需要回退到可怕的唤醒锁保持方法才能获取数据。

您也可以只使用 Google Fit APIs,但这只有在设备上安装了 Google Fit + Google Play 服务并开启监控时才有效。