安卓中的步数计数器:始终开启?

13

众所周知,许多安卓手机在屏幕关闭时会关闭加速度计。然而,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提供了 实现此功能 的代码。但是,在许多手机上,当屏幕关闭时,步数统计会停止。有趣的是,如果安装了Google Fit应用程序,计数似乎不会停止(因此我猜测他们保持了加速度计的运转)。
我错过了什么吗?在屏幕关闭后继续计步的功能是否对普通程序员可用?
谢谢!
2个回答

9
正如Ilja所说,您的代码即使在屏幕关闭后也会运行。但在这种情况下,我想我们需要一个稍微不同的答案。
他们肯定使用了一个保持wakelock并查询数据传感器的服务。这里重要的部分是持有wakelock-您必须在服务的生存期内防止设备进入睡眠状态-如果您不想错过一些数据。
但是,这种方法会非常快地耗尽电池,因为为了检测步数,您需要从传感器处理相当多的数据。
这就是为什么有sensor batching。它允许您获得连续的传感器数据,即使不保持设备处于唤醒状态。它基本上将传感器事件存储在芯片本身的基于硬件的队列中,并且仅在预定义的时间间隔内批量发送到您的应用程序(服务等)。这使您可以进行24/7监视而不会显着耗尽电池。请注意,只有支持的芯片组才能做到这一点(您可以在Android文档中找到详细信息),对于旧手机,您需要回退到丑陋的wakelock保持方法以获取您的数据。
您也可以只使用Google Fit APIs,但这仅在设备上安装了Google Fit和Google Play服务并启用了监视时才能起作用。

1
感谢 @simekadam。你说的是正确的。然而,我不理解他们是如何做到的。在许多手机上保持步数计数器唯一的方法似乎是获取完全锁定,这并不真正节能。诸如WakefulBroadcastReceiver之类的部分唤醒锁似乎被大多数加速度计忽略。这就是为什么我想知道他们如何以高效的方式实现它。 - FabioC
1
@FabioCiravegna,你能否在你的问题中贴出更多的代码?这将有助于我解决你的问题。你是从WakefulBroadcastReceiver开始你的步数计数器吗?你是否使用startWakefulService启动了录制服务?你是否还为你的服务获取了一个独立的wakelock?(WakeFullBroadcastReceiver在60秒后释放它的wakelock) - simekadam
1
非常感谢您提供帮助。我在Github上创建了一个简单的示例[链接](https://github.com/fabcira/step_counter_with_wakeLock)。它比我之前提到的那个甚至更简单。主活动注册传感器并设置部分唤醒锁定。然后我启动活动。步数计数器有效。当我关闭手机时,它停止工作。但是,我创建了一个检查唤醒锁定是否打开的服务。它是打开的。但是步数计数器已关闭。设置还检查手机是否具有硬件步数计数器。我的手机有它。我很困惑。欢迎任何帮助。谢谢! - FabioC
1
尝试移除activityRunning条件,这样可以使您的计步器在屏幕关闭后继续工作。此外,最好将计步逻辑移到服务中。无论您是否持有唤醒锁定,活动都可能随时被终止。 - simekadam
2
@JohanShogun:文档中包含的内容:除非您的应用程序接收到高优先级的Google Cloud Messaging提示,否则网络访问将被禁用。唤醒锁将被忽略。使用AlarmManager类安排的闹钟将被禁用,除非您使用setAlarmClock()方法和AlarmManager.setAndAllowWhileIdle()设置了闹钟。不允许运行同步适配器和JobScheduler的同步和作业。结论:在休眠时无法获取加速度计数据 - 但是根据硬件队列大小,稍后可能会获取它们(或其中一部分)(一旦解除休眠)。 - simekadam
显示剩余3条评论

0

每个普通的线程在屏幕关闭或活动失去焦点时都会继续工作...但是当活动被杀死时,所有线程都会被杀死...

然而,您可以使用服务来执行长时间运行的任务,例如请求加速度计。


1
谢谢您的回答。我使用后台服务,这样当应用程序失去焦点时它们仍然在工作。我在这个过程中同时使用了计步器和活动识别。活动识别会一直运行,但是计步器会被杀掉。 - FabioC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接