掛起模式

SoC電源狀態

片上系統(SoC)的電源狀態為:開啟,空閒和掛起。 SoC運行時為“ On”。 “空閒”是中功率模式,其中SoC通電但不執行任何任務。 “掛起”是一種低功耗模式,其中SoC未被供電。在此模式下,設備的功耗通常比“開”模式下的功耗低100倍。

非喚醒傳感器

非喚醒傳感器是指不會阻止SoC進入掛起模式並且不會喚醒SoC來報告數據的傳感器。特別是,不允許駕駛員持有喚醒鎖。如果應用程序希望在屏幕關閉時希望接收來自非喚醒傳感器的事件,則應保持部分喚醒鎖定。當SoC處於掛起模式時,傳感器必須繼續運行並生成事件,這些事件被放入硬件FIFO中。 (有關更多詳細信息,請參見批處理。)當SoC喚醒時,FIFO中的事件將傳遞給應用程序。如果FIFO太小而無法存儲所有事件,則較舊的事件將丟失;反之,刪除最舊的數據以容納最新的數據。在FIFO不存在的極端情況下,SoC處於掛起模式時生成的所有事件都將丟失。一個例外是每個接通傳感器上的最新事件:最後一個事件必須保存在FIFO之外,以免丟失。

SoC退出掛起模式後,將報告FIFO中的所有事件,並且恢復正常操作。

使用非喚醒傳感器的應用程序應持有喚醒鎖以確保系統不會掛起,在不需要它們時從傳感器中註銷,或者期望在SoC處於掛起模式時丟失事件。

喚醒傳感器

與非喚醒傳感器相反,喚醒傳感器可確保獨立於SoC狀態傳送其數據。 SoC處於喚醒狀態時,喚醒傳感器的行為類似於非喚醒傳感器。當SoC處於睡眠狀態時,喚醒傳感器必須喚醒SoC才能傳遞事件。他們仍然必須讓SoC進入掛起模式,但是還必須在需要報告事件時將其喚醒。也就是說,傳感器必須在最大報告等待時間過去或硬件FIFO變滿之前喚醒SoC並傳遞事件。有關更多詳細信息,請參見批處理

為確保應用程序有時間在SoC返回睡眠之前接收事件,每次報告事件時,驅動程序必須保持200毫秒的“超時喚醒鎖”。也就是說,喚醒中斷後的200毫秒內,不允許SoC返回睡眠狀態。這項要求會在未來的Android版本中消失,而在此之前我們需要此超時喚醒鎖。

如何定義喚醒和非喚醒傳感器?

直到KitKat為止,傳感器的類型決定了傳感器是喚醒傳感器還是非喚醒傳感器:大多數傳感器是非喚醒傳感器,但接近傳感器和有效運動檢測器除外。

從L開始,給定傳感器是否為喚醒傳感器由傳感器定義中的標誌指定。大多數傳感器可以由同一傳感器的一對喚醒和非喚醒變體定義,在這種情況下,它們必須表現為兩個獨立的傳感器,彼此之間不得交互。有關更多詳細信息,請參見交互

除非傳感器類型定義中另有說明,否則建議為“傳感器類型”中列出的每種傳感器類型實現一個喚醒傳感器和一個非喚醒傳感器。在每個傳感器類型定義中,查看SensorManager.getDefaultSensor(sensorType)將返回哪種傳感器(喚醒或非喚醒SensorManager.getDefaultSensor(sensorType) 。它是大多數應用程序將使用的傳感器。