电视待机模式

在 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 标志)的行为,包括但不限于:

  • 与触摸屏交互
  • 按实体按钮
  • 从外部配件(例如,连接的键盘、蓝牙遥控器、IR 遥控器)提供的输入事件
  • 语音互动
  • 接收某些 HDMI CEC 消息,例如一键式播放
  • 开始新的投射会话

自定义

如果启用此功能,设备将在指定的设备闲置时间过后显示屏幕警告。如果不执行任何操作,屏幕将关闭。您可以使用以下配置选项来自定义该功能。

配置超时时间

如需配置超时时间,请更新 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 (30s).

在 TvSettings 中显示超时偏好设置

如需显示超时偏好设置,请更新 packages/apps/TvSettings/Settings/res/values/config.xml 中的以下元素:

  • config_show_standby_timeout
    • 显示是否允许在媒体播放期间关闭屏幕。
    • 默认值:false

警告界面的资源

  • 警告对话框的布局在 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 包含默认警告界面实现。
  • 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. 验证屏幕是否会在设置的超时时间过后关闭。