Doze 模式如何影响注册的侦听器(尤其是传感器侦听器)

How does Doze mode affect registered listeners (especially sensor listeners)

Doze 模式如何影响注册的侦听器?

如果可能的话,我还想知道它是如何影响传感器监听器的。

我的问题是我在清单中有一个 WatchFaceService 具有唤醒锁定权限。 watchFace 每分钟运行 onTimeTick。很多时候当设备打瞌睡时会发生这种情况。在那一刻,它为 HR 注册了一个侦听器以收集 10 个值。根据我的观察,在注册侦听器后打瞌睡模式开始,但传感器保持活动状态。 例如,心率传感器保持点亮。

这正常吗?为什么?这是我的观察


采样周期为0微秒的监听器:

sensorManager.registerListener(averagingSensorEventListener, sensor, averageSamplingPeriodUs, averageMaxReportLatencyUs);

日志:

06-12 17:35:00.308 724-724/? D/android.sensor.heart_rate: Starting average calculation
06-12 17:36:01.065 724-724/? D/android.sensor.heart_rate: Event value 75.0 accepted
06-12 17:36:01.166 724-724/? D/android.sensor.heart_rate: Event value 75.0 accepted
06-12 17:36:20.471 724-724/? D/android.sensor.heart_rate: Event value 71.0 accepted
06-12 17:37:01.066 724-724/? D/android.sensor.heart_rate: Event value 72.0 accepted
06-12 17:38:01.067 724-724/? D/android.sensor.heart_rate: Event value 73.0 accepted
06-12 17:39:00.072 724-724/? D/android.sensor.heart_rate: Event value 81.0 accepted
06-12 17:39:28.135 724-724/? D/android.sensor.heart_rate: Event value 81.0 accepted
06-12 17:39:28.276 724-724/? D/android.sensor.heart_rate: Event value 80.0 accepted
06-12 17:39:29.244 724-724/? D/android.sensor.heart_rate: Event value 77.0 accepted
06-12 17:39:30.110 724-724/? D/android.sensor.heart_rate: Event value 75.0 accepted
06-12 17:39:31.172 724-724/? D/android.sensor.heart_rate: Event value 73.0 accepted
06-12 17:39:31.173 724-724/? D/android.sensor.heart_rate: Stopped listening
06-12 17:39:31.180 724-724/? D/android.sensor.heart_rate: Average calculated: 76.0
06-12 17:39:31.180 724-724/? D/android.sensor.heart_rate: Event value 76.0 accepted

完成需要超过 4 分钟,在这几分钟内,HR 传感器处于活动状态(绿灯),但不会触发 onSensorChanged 回调或报告已注册侦听器的值。


更新:

对于我的问题,在 Morales 的出色回答之后,我解决了这个问题,每次我需要注册一个侦听器时,我都会获得一个唤醒锁,并在采样完成后释放它。这样,事件与我询问的时间一致,并且不会使传感器保持活动状态。

传感器

文档说返回了几个 sensor types, every sensor has a reporting-mode (continuous, on-change, one-shot and special) and every sensor is classified by type 传感器:

  • 唤醒传感器:确保其数据的传送独立于 SoC 的状态。
  • 非唤醒传感器:不阻止SoC进入挂起模式,不唤醒SoC上报数据

打瞌睡文档没有指出任何关于特定传感器的信息,除了 significant motion sensor 配置打瞌睡模式所需的信息。

要查看各个 传感器类型描述 以获取有关事件生成时间的详细信息,您可以查看 documentation

限制

有一些限制适用于您的应用程序在打瞌睡模式下:

  • 网络访问已暂停。
  • 系统忽略wake locks
  • 标准AlarmManager警报(包括setExact()setWindow())推迟到下一次维护window.
  • 系统不执行 Wi-Fi 扫描。
  • 系统不允许sync adapters到运行。
  • 系统不允许JobScheduler到运行。

打瞌睡会对应用产生不同的影响,具体取决于它们提供的功能和使用的服务。许多应用程序无需修改即可在 Doze 周期内正常运行。在某些情况下,您必须优化您的应用程序管理 网络警报工作同步。应用程序应该能够在每次 维护期间有效地管理活动 window

来自 Optimizing for Doze and App Standby.