在 Android 11 中,非專心睡眠是一項省電功能,允許設置用戶不活動超時,然後屏幕關閉,即使具有FLAG_KEEP_SCREEN_ON
的窗口可見或FULL_WAKE_LOCK
、 SCREEN_BRIGHT_WAKE_LOCK
或SCREEN_DIM_WAKE_LOCK
級別的喚醒鎖被保持。具有PARTIAL_WAKE_LOCK
級別的喚醒鎖不受此功能的影響。在超時到期前不久,可以顯示一條消息,警告用戶如果他們不與設備交互,設備將進入睡眠狀態。
在這種情況下,用戶活動是指觸發對PowerManager#userActivity
的調用(不帶USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS
標誌)的任何事情,包括但不限於:
- 與觸摸屏交互
- 按下物理按鈕
- 來自外部附件的輸入事件(例如,連接的鍵盤、藍牙遙控器、紅外遙控器)
- 語音交互
- 接收某些 HDMI CEC 消息,例如 One Touch Play
- 開始新的演員會議
定制
如果啟用該功能,設備會在用戶不活動的指定時間後顯示屏幕警告。如果不採取任何措施,屏幕將關閉。您可以使用這些配置選項自定義功能。
配置超時
要配置超時,請更新frameworks/base/core/res/res/values/config.xml
中的以下元素:
-
config_attentiveTimeout
- 指定用戶不活動的默認時間(以毫秒為單位),之後屏幕關閉(即使屏幕喚醒鎖已到位)。
- 在構建時設置。
- 如果該值介於
0
和config_minimumScreenOffTimeout
之間,則超時設置為config_minimumScreenOffTimeout
以防止設備在喚醒後不久關閉屏幕。 - 默認值:
-1
,禁用此功能。
覆蓋默認超時
要覆蓋默認超時設置,請更新以下元素。
-
Settings.Secure.ATTENTIVE_TIMEOUT
- 如果設置,則覆蓋
config_attentiveTimeout
設置的默認不專心睡眠超時。 - 可以在運行時設置。
配置警告出現前的持續時間
要配置持續時間,請更新frameworks/base/core/res/res/values/config.xml
中的以下元素:
-
config_attentiveWarningDuration
- 用戶長時間不活動後屏幕關閉前向用戶顯示警告消息的時間。
- 該值應遠低於設置的疏忽睡眠超時,否則警告對話框會不斷顯示並且無法關閉。
- 默認值:
30000
(30 秒)。
在 TvSettings 中顯示超時首選項
要顯示超時首選項,請更新packages/apps/TvSettings/Settings/res/values/config.xml
中的以下元素:
-
config_show_standby_timeout
- 是否顯示允許在媒體播放期間關閉屏幕的首選項。
- 默認值:
false
。
警告 UI 的資源
- 警告對話框的佈局在
frameworks/base/packages/SystemUI/res/layout/inattentive_sleep_warning.xml
中定義。 - 對話框的以下字符串在
frameworks/base/packages/SystemUI/res/values/strings.xml
和frameworks/base/packages/SystemUI/res-product/values/strings.xml
中定義。 -
inattentive_sleep_warning_title
-
inattentive_sleep_warning_message
構建時配置和資源可以通過資源覆蓋進行更改。
執行
使用以下功能啟用該功能。
- 覆蓋默認的
config_attentiveTimeout
。 - 如果使用 AOSP
TvSettings
: - 通過覆蓋
config_show_standby_timeout
禁用設置中的功能。 - 實現您自己的設置
Settings.Secure.ATTENTIVE_TIMEOUT
。
驗證
該功能的 CTS 測試位於cts/hostsidetests/os/src/android/os/cts/InattentiveSleepTests.java
。
示例和來源
frameworks/base/packages/SystemUI/src/com/android/systemui/power/InattentiveSleepWarningView.java
包含默認的警告 UI 實現。-
packages/apps/TvSettings
提供瞭如何在設置中公開該功能的示例。
手動測試用例示例
如果設備的運行狀況 HAL 報告設備有電池(
battery_present
為true
),請確保stay_on_while_plugged_in
開發人員設置已關閉,因為這可能會阻止該功能關閉屏幕。
adb shell settings put global stay_on_while_plugged_in 0
- 將疏忽睡眠超時設置為比警告對話持續時間多幾秒鐘。
adb shell settings put secure attentive_timeout 32000
- 開始播放視頻(以獲取屏幕喚醒鎖)。
- 確認幾秒鐘後出現睡眠警告對話框。
- 驗證設置的超時時間到期後屏幕是否關閉。