暫停模式

SoC 電源狀態

系統單晶片 (SoC) 的電源狀態為:開啟、閒置和掛起。 “On”表示 SoC 正在運行。 「空閒」是一種中等功耗模式,其中 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 毫秒。也就是說,不應允許 SoC 在喚醒中斷後的 200 毫秒內返回睡眠狀態。此要求將在未來的 Android 版本中消失,在此之前我們需要此逾時喚醒鎖定。

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

到 KitKat 為止,感測器是喚醒感測器還是非喚醒感測器由感測器類型決定:大多數都是非喚醒感測器,除了接近感測器和顯著運動偵測器之外。

從 L 開始,給定感測器是否是喚醒感測器由感測器定義中的標誌指定。大多數感測器可以由同一感測器的成對喚醒和非喚醒變體來定義,在這種情況下,它們必須充當兩個獨立的感測器,而不是彼此互動。有關更多詳細信息,請參閱交互

除非感測器類型定義另有指定,否則建議為感測器類型中列出的每種感測器類型實現一個喚醒感測器和一個非喚醒感測器。在每個感測器類型定義中,查看SensorManager.getDefaultSensor(sensorType)將傳回什麼感測器(喚醒或非喚醒)。這是大多數應用都會使用的感測器。