SoC 電源狀態
晶片系統 (SoC) 的電源狀態包括開啟、閒置和暫停。「開啟」是指 SoC 正在執行時。「閒置」是一種中等電源模式,其中 SoC 已開啟電源,但不會執行任何工作。「Suspend」是 SoC 未通電的低耗電模式。裝置在這個模式下的耗電量通常比「開啟」模式少 100 倍。
非喚醒感應器
非喚醒感應器不會讓 SoC 進入休眠模式,也不會喚醒 SoC 回報資料。具體來說,驅動程式不得保留喚醒鎖定。如果應用程式希望在螢幕關閉時接收非喚醒感應器的事件,則必須負責維持部分喚醒鎖定。當 SoC 處於暫停模式時,感應器必須繼續運作並產生事件,並放入硬體 FIFO。(詳情請參閱「批次處理」)。當 SoC 喚醒時,FIFO 中的事件會傳送至應用程式。如果 FIFO 太小,無法儲存所有事件,系統會捨棄較舊的事件,以便容納最新資料。在 FIFO 不存在的極端情況下,SoC 處於暫停模式時產生的所有事件都會遺失。唯一的例外狀況是每個變動感應器的最新事件:最後一個事件必須儲存在 FIFO 外 ,才能確保不會遺失。
一旦 SoC 離開暫停模式,系統就會回報 FIFO 的所有事件,並恢復正常運作。
使用非喚醒感應器的應用程式應保留喚醒鎖定,確保系統不會進入暫停狀態,並在不需要感應器時取消註冊,或在 SoC 處於暫停模式時預期會遺失事件。
喚醒感應器
與非喚醒感應器相反,喚醒感應器可確保其資料可獨立於 SoC 狀態傳送。當 SoC 處於喚醒狀態時,喚醒感應器的運作方式會像非喚醒感應器。當 SoC 處於休眠狀態時,喚醒感應器必須喚醒 SoC 才能傳送事件。這些應用程式仍必須讓 SoC 進入暫停模式,但也必須在需要回報事件時喚醒 SoC。也就是說,在報告延遲時間上限或硬體 FIFO 已滿之前,感應器必須喚醒 SoC 並傳送事件。詳情請參閱「批次處理」一節。
為確保應用程式在 SoC 進入休眠狀態前有時間接收事件,驅動程式每次回報事件時,必須保留「逾時喚醒鎖定」200 毫秒。也就是說,系統不應在喚醒中斷後的 200 毫秒內,允許 SoC 進入休眠狀態。這項規定會在日後的 Android 版本中取消,但在此之前,我們需要使用這個逾時喚醒鎖定機制。
如何定義喚醒和非喚醒感應器?
在 KitKat 之前,感應器是否為喚醒感應器或非喚醒感應器,取決於感應器類型:大多數為非喚醒感應器,但鄰近感應器和重大動作偵測器除外。
從 L 開始,感應器定義中的標記會指定特定感應器是否為喚醒感應器。大多數感應器可透過同一個感應器的喚醒和非喚醒變化版本定義,在這種情況下,它們必須以兩個獨立的感應器運作,且不相互互動。詳情請參閱「互動」一文。
除非在感應器類型定義中另有指定,否則建議為 Sensor types 中列出的每個感應器類型實作一個喚醒感應器和一個非喚醒感應器。在每個感應器類型定義中,查看 SensorManager.getDefaultSensor(sensorType)
會傳回哪些感應器 (喚醒或非喚醒)。這是大多數應用程式都會使用的感應器。