当用户不再使用手表时,Wear OS 会自动将正在运行的应用切换到低功耗模式。这称为“系统微光模式”。如果满足以下任一条件,在用户与手表互动后,应用会恢复
- 用户互动在特定时间范围内发生(在超时之前)。
- 应用声明并已启动正在进行中的 activity。
对于特定用例(例如,用户在跑步时想查看心率和配速),您还可以控制系统微光模式下显示的内容。在微光模式和互动模式下均可运行的 Wear OS 应用称为“常亮应用”。
让应用持续可见会影响电池续航时间,因此在将此功能添加到应用时,请考虑其影响。
配置您的项目
要支持微光模式,请按以下步骤操作
- 根据创建和运行可穿戴设备应用页面上的配置创建或更新您的项目。
- (仅在 Wear OS 4 或更低版本中需要)将
WAKE_LOCK
权限添加到 Android 清单文件中
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>
启用常亮模式
从 Wear OS 6 开始,targetSdkVersion
设置为 36 或更高的应用默认处于常亮状态。这些应用在系统微光模式下会在有限的时间段内保持可见,而无需任何配置。如果您的应用的 targetSdkVersion
低于 36,或者您的应用需要在 Wear OS 5 或更低版本上运行,请使用 AmbientLifecycleObserver
类使您的应用保持常亮。
使用 AmbientLifecycleObserver 类响应微光模式事件
应用还可以使用 AmbientLifecycleObserver
类直接响应微光模式事件
- 实现
AmbientLifecycleObserver.AmbientLifecycleCallback
接口,如以下示例所示。在此阶段,方法为空,但在本指南的后面部分,会详细介绍您应该确保在进入和退出微光模式时对可视化所做的更改。Kotlin
val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. } override fun onUpdateAmbient() { // ... Called by the system in order to allow the app to periodically // update the display while in ambient mode. Typically the system will // call this every 60 seconds. } }
- 创建
AmbientLifecycleObserver
并注册观察器。通常,这会在onCreate()
或顶级可组合项(如果使用 Compose for Wear OS)中使用,以允许在 Activity 的整个生命周期中启用常亮行为。Kotlin
private val ambientObserver = AmbientLifecycleObserver(activity, callback) override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) lifecycle.addObserver(observer) // ... }
- 当不再需要常亮行为时,通过调用
removeObserver()
来移除观察器。例如,您可以在 Activity 的onDestroy()
方法中调用此方法。
使用 TimeText 微件更新时间文本
从 Wear OS 6 开始,TimeText
微件支持微光模式。如果您的应用只需要在微光模式下每分钟更新一次时间文本,则只需使用 TimeText
微件,而无需使用 AmbientLifecycleObserver
。
常亮应用可转到后台
从 Wear OS 5 开始,系统会在常亮应用在微光模式下可见一段时间后将其转到后台。用户可以在系统设置中配置超时时间。
如果您的常亮应用显示有关正在进行的用户任务(例如音乐播放或锻炼会话)的信息,您可能需要将正在进行的 activity 保持可见,直到任务结束。为此,请使用 Ongoing Activity API 发布一个与您的常亮 activity 关联的正在进行中的通知。
为了让系统识别正在进行的 activity,正在进行的通知的触摸 intent 必须指向您的常亮 activity,如以下代码段所示
// Create a pending intent that point to your always-on activity
val touchIntent =
PendingIntent.getActivity(
context,
0,
Intent(context, MyAlwaysOnActivity::class.java),
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
val notificationBuilder =
NotificationCompat.Builder(this, CHANNEL_ID)
// ...
.setOngoing(true)
val ongoingActivity =
OngoingActivity.Builder(
applicationContext, NOTIFICATION_ID, notificationBuilder
)
// ...
.setTouchIntent(touchIntent)
.build()
ongoingActivity.apply(applicationContext)
notificationManager.notify(
NOTIFICATION_ID,
notificationBuilder.build()
)
修改微光模式下的用户体验
默认情况下,在实现常亮功能时,当手表进入微光模式时,屏幕的外观不会改变。您可以通过重写 AmbientLifecycleCallback
中的方法来修改此行为。
为了帮助节约电量,请执行以下操作
- 点亮更少的像素。考虑在微光模式下仅显示关键信息,并在用户进入互动模式时提供更多详细信息。
- 保持屏幕至少 85% 为黑色,移除填充,并为按钮和大型图标使用轮廓。
- 避免显示多余信息,例如非功能性品牌和背景图片。
- 在活动模式和常亮模式下,元素保持在相同位置,并始终显示时间。
- 调整任何内容以减少更新频率。例如,将计时器显示到最近的分钟,而不是最近的秒。
- 移除或显示频繁更新的字母数字内容的占位符界面,例如距离或时间。
- 移除频繁更新的进度指示器,例如倒计时环和媒体会话。
- 进入常亮模式时,如果用户之前曾停留在您应用的配置或设置屏幕上,请考虑改为显示您应用中更相关的屏幕。
- 在传递给
onEnterAmbient()
的AmbientDetails
对象中- 如果设置了
deviceHasLowBitAmbient
,请尽可能禁用抗锯齿。 - 如果设置了
burnInProtectionRequired
,请定期移动可视化内容,并避免出现纯白色区域。
- 如果设置了
- 避免在微光模式下运行连续动画。从 Wear OS 5.1 开始,动画器可能会在微光模式下停止运行。
不间断显示清单
在某些情况下,您可能希望在设备在不同状态之间移动时对显示进行最大程度的控制,例如当锻炼应用希望在锻炼期间避免表盘显示时。在这些情况下,请执行以下操作
- 实现 AmbientLifecycleObserver.AmbientLifecycleCallback 接口。
- 为设备处于系统微光模式时创建新的低功耗布局。
- 在锻炼期间,实现正在进行中的 activity。
有关如何实现此目的的示例,请查看 GitHub 上基于 Compose 的锻炼示例,其中使用了 AmbientAware
可组合项来自 Horologist 库。