挂起模式

SoC 电源状态

系统芯片 (SoC) 的电源状态包括:开启、空闲和挂起。“开启”表示 SoC 正在运行。“空闲”表示一种中等耗电模式,在该模式下,SoC 已接通电源但不执行任何任务。“挂起”表示 SoC 未通电的低功耗模式。该模式下的设备功耗通常是“开启”模式的 1/100。

非唤醒传感器

非唤醒传感器是不阻止 SoC 进入挂起模式也不会将 SoC 唤醒以报告数据的传感器。具体来讲,就是不允许驱动程序持有唤醒锁定。如果应用要在屏幕关闭时从非唤醒传感器处接收事件,则必须自行保留部分唤醒锁定。当 SoC 处于挂起模式时,传感器必须继续工作并生成事件,这些事件会放入硬件 FIFO 中(如需了解详情,请参阅Batching)。当 SoC 唤醒时,FIFO 中的事件将传送到应用。如果 FIFO 太小而无法存储所有事件,则较旧的事件将丢失;最旧的数据将被删除以容纳最新的数据。在不存在 FIFO 的极端情况下,在 SoC 处于挂起模式时生成的所有事件都将丢失。一种例外情况是来自每个采用变化时触发模式的传感器最新事件:最后一个事件必须保存在 FIFO 之外,以使其不会丢失。

一旦 SoC 退出挂起模式,就会报告来自 FIFO 的所有事件,并且操作将恢复正常。

使用非唤醒传感器的应用要么应持有唤醒锁定以确保系统不会挂起,在不需要传感器时取消注册传感器,要么接受 SoC 处于挂起模式期间的事件会丢失这一事实。

唤醒传感器

与非唤醒传感器相反,唤醒传感器会确保其数据传输不依赖于 SoC 状态。当 SoC 唤醒时,唤醒传感器的行为与非唤醒传感器相同。当 SoC 休眠时,唤醒传感器必须唤醒 SoC 以发送事件。它们必须仍可让 SoC 进入挂起模式,但是当需要报告事件时,还必须唤醒 SoC。也就是说,在达到最大报告延迟时间或硬件 FIFO 已满之前,传感器必须唤醒 SoC 并传送事件。如需了解详情,请参阅Batching

为确保应用有时间在 SoC 返回休眠状态之前接收事件,每次报告事件时,驱动程序必须持有“超时唤醒锁定”200 毫秒。也就是说,在唤醒中断后的 200 毫秒内,不允许 SoC 返回休眠状态。此要求将在未来的 Android 版本中消失,在此之前,我们需要该超时唤醒锁定。

如何定义唤醒和非唤醒传感器?

在 KitKat 及更早版本中,某个传感器是唤醒传感器还是非唤醒传感器取决于传感器类型:除近程传感器和大幅度动作检测器之外,大多数传感器都是非唤醒传感器。

从 L 版本开始,传感器是否为唤醒传感器由传感器定义中的标记指定。大多数传感器均可由同一传感器的唤醒和非唤醒变体对来定义,在这种情况下,它们必须作为两个独立的传感器运行,且彼此不进行交互。有关详情,请参阅交互性

除非在传感器类型定义中另行指定,否则建议为传感器类型中列出的每种传感器类型各实现一个唤醒传感器和一个非唤醒传感器。在每个传感器类型定义中,查看 SensorManager.getDefaultSensor(sensorType) 将返回什么样的传感器(唤醒传感器还是非唤醒传感器)。它是大多数应用将使用的传感器。