始终开启的应用与系统氛围模式

当用户不再使用手表时,Wear OS 会自动使处于活跃状态的应用进入低功耗模式。这称为“系统氛围模式”。如果满足以下任一条件,应用会在用户与手表互动后恢复:

  • 用户互动发生在特定时间范围内(超时之前)。
  • 应用声明并启动了持续性 activity

对于特定用例,例如用户想在跑步期间查看心率和步速,您还可以控制在系统氛围模式下显示哪些内容。在氛围模式和互动模式下均处于运行状态的 Wear OS 应用称为始终开启的应用。

让应用始终可见会影响电池续航时间,因此在为应用添加这项功能时,应该考虑这个影响。

配置项目

如需支持氛围模式,请按以下步骤操作:

  1. 根据创建和运行穿戴式应用页面上的配置,创建或更新您的项目。
  2. (仅在 Wear OS 4 或更低版本中需要)向 Android 清单文件添加 WAKE_LOCK 权限:
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

启用始终开启模式

从 Wear OS 6 开始,将 targetSdkVersion 设置为 36 或更高值的应用默认处于开启状态。 这些应用在系统氛围模式下会在有限的时间内保持可见状态,而无需任何配置。 如果应用的 targetSdkVersion 低于 36,或者应用需要在 Wear OS 5 或更低版本上运行,请使用 AmbientLifecycleObserver 类让应用始终开启。

使用 AmbientLifecycleObserver 类响应氛围模式事件

应用还可以使用 AmbientLifecycleObserver 类直接响应氛围模式事件:

  1. 实现 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.
        }
    }
  2. 创建一个 AmbientLifecycleObserver 并注册 observer。通常,如果使用 Compose for Wear OS,此 observer 将用在 onCreate() 或顶级可组合项中,以允许在 activity 的整个生命周期内启用始终开启行为。

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. 当不再需要始终开启行为时,请通过调用 removeObserver() 移除 observer。例如,您可以在 activity 的 onDestroy() 方法中调用此方法。

使用 TimeText widget 更新时间文本

从 Wear OS 6 开始,TimeText 微件支持氛围模式。如果您的应用在氛围模式下只需每分钟更新一次时间文本,则只需使用 TimeText 微件,而无需使用 AmbientLifecycleObserver

始终开启的应用可以移至后台

从 Wear OS 5 开始,系统会在始终开启的应用在氛围模式下显示一段时间后将其移至后台。用户可以在系统设置中配置超时设置。

如果您的始终开启型应用显示有关正在进行的用户任务(例如音乐播放或锻炼时段)的信息,您可能希望在任务结束之前让正在进行的活动保持可见状态。为此,请使用 Ongoing Activity API 发布与始终开启的 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 开始,动画在氛围模式下可能会停止运行。

确保不间断展示的核对清单

在某些情况下,您可能希望在设备切换不同状态时最大限度地控制显示屏,例如,当锻炼应用想要避免在锻炼期间显示表盘时。在这些情况下,请执行以下操作:

  1. 实现 AmbientLifecycleObserver.AmbientLifecycleCallback 接口。
  2. 创建新的低功耗布局,以便在设备处于系统氛围模式时使用。
  3. 在锻炼期间,实现一个持续性活动

如需查看实现此功能的示例,请参阅 GitHub 上基于 Compose 的 锻炼示例,该示例采用了 Horologist 库中的 AmbientAware 可组合项。