电视待机

在 Android 11 中,注意力不集中睡眠是一种省电功能,允许在设置用户不活动超时后关闭屏幕,即使具有 FLAG_KEEP_SCREEN_ON 的窗口可见或持有级别为 FULL_WAKE_LOCKSCREEN_BRIGHT_WAKE_LOCKSCREEN_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
    • 指定用户不活动后的默认时间(以毫秒为单位),在此时间后屏幕将关闭(即使屏幕唤醒锁已就位)。
    • 在构建时设置。
    • 如果该值介于 0config_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.xmlframeworks/base/packages/SystemUI/res-product/values/strings.xml 中定义。
    • inattentive_sleep_warning_title
    • inattentive_sleep_warning_message

构建时配置和资源可以通过资源叠加层进行更改。

实现

使用以下方法启用该功能。

  1. 覆盖默认的 config_attentiveTimeout
  2. 如果使用 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 提供了一个如何在设置中公开该功能的示例。

手动测试用例示例

  1. 确保在设备的运行状况 HAL 报告设备有电池(battery_presenttrue)的情况下,stay_on_while_plugged_in 开发者设置处于关闭状态,因为这可能会阻止该功能关闭屏幕。
    adb shell settings put global stay_on_while_plugged_in 0

  2. 将无操作睡眠超时设置为比警告对话框持续时间长几秒。
    adb shell settings put secure attentive_timeout 32000
  3. 开始播放视频(以获取屏幕唤醒锁)。
  4. 验证睡眠警告对话框是否在几秒钟后出现。
  5. 验证屏幕是否在设置的超时时间到期后关闭。