SoC 电源状态
片上系统 (SoC) 的电源状态包括:开启、空闲和暂停。“开启”是指 SoC 正在运行。“空闲”是一种中等功率模式,SoC 已通电但不执行任何任务。“暂停”是一种低功耗模式,SoC 未通电。设备在此模式下的功耗通常比“开启”模式下低 100 倍。
非唤醒传感器
非唤醒传感器是指不会阻止 SoC 进入暂停模式,也不会唤醒 SoC 以报告数据的传感器。 特别是,驱动程序不允许持有唤醒锁。 如果应用程序希望在屏幕关闭时接收来自非唤醒传感器的事件,则应用程序有责任保持部分唤醒锁。 当 SoC 处于暂停模式时,传感器必须继续运行并生成事件,这些事件被放入硬件 FIFO 中。(有关更多详细信息,请参阅批处理。)当 SoC 唤醒时,FIFO 中的事件将被传递给应用程序。 如果 FIFO 太小而无法存储所有事件,则较旧的事件将丢失; 最旧的数据将被删除以容纳最新的数据。 在 FIFO 不存在这种极端情况下,在 SoC 处于暂停模式时生成的所有事件都将丢失。 一个例外是来自每个“on-change”传感器的最新事件:最后一个事件必须保存在FIFO 之外,这样它就不会丢失。
一旦 SoC 退出暂停模式,FIFO 中的所有事件都将被报告,并且操作将恢复正常。
使用非唤醒传感器的应用程序应持有唤醒锁以确保系统不会进入暂停状态,在不需要传感器时取消注册传感器,或者预期在 SoC 处于暂停模式时丢失事件。
唤醒传感器
与非唤醒传感器相反,唤醒传感器确保其数据独立于 SoC 的状态进行传递。 当 SoC 处于唤醒状态时,唤醒传感器的行为类似于非唤醒传感器。 当 SoC 处于休眠状态时,唤醒传感器必须唤醒 SoC 以传递事件。 它们仍然必须让 SoC 进入暂停模式,但也必须在需要报告事件时唤醒它。 也就是说,传感器必须在最大报告延迟时间过去或硬件 FIFO 已满之前唤醒 SoC 并传递事件。 有关更多详细信息,请参阅批处理。
为了确保应用程序有时间在 SoC 恢复休眠之前接收到事件,驱动程序每次报告事件时都必须持有 200 毫秒的“超时唤醒锁”。 也就是说,在唤醒中断后的 200 毫秒内,不应允许 SoC 恢复休眠。 此要求将在未来的 Android 版本中消失,在此之前我们需要此超时唤醒锁。
如何定义唤醒和非唤醒传感器?
在 KitKat 之前,传感器是唤醒传感器还是非唤醒传感器由传感器类型决定:大多数是非唤醒传感器,但接近传感器和显著运动检测器除外。
从 L 版本开始,给定传感器是否为唤醒传感器由传感器定义中的一个标志指定。 大多数传感器可以定义为同一传感器的唤醒和非唤醒变体对,在这种情况下,它们必须表现为两个独立的传感器,互不干扰。 有关更多详细信息,请参阅交互。
除非传感器类型定义中另有规定,否则建议为传感器类型中列出的每种传感器类型实现一个唤醒传感器和一个非唤醒传感器。 在每种传感器类型定义中,查看 SensorManager.getDefaultSensor(sensorType)
将返回哪种传感器(唤醒或非唤醒)。 它是大多数应用程序将使用的传感器。