始终在线应用和系统环境模式

关键词:wear,ambient,alwayson

当用户不再使用手表时,Wear OS 会自动将活动应用切换到低功耗模式。这称为系统环境模式。如果用户在一定时间范围内再次与手表互动,Wear OS 会将用户带回到他们离开时的应用位置。

对于特定用例(例如,用户希望在跑步时查看心率和配速),您还可以控制低功耗环境模式中显示的内容。在环境模式和交互模式下运行的 Wear OS 应用称为始终在线应用

使应用始终可见会影响电池续航时间,因此在向应用添加此功能时请考虑其影响。

配置您的项目

要支持环境模式,请按照以下步骤操作

  1. 根据创建和运行可穿戴应用页面上的配置创建或更新您的项目。
  2. WAKE_LOCK权限添加到 Android 清单文件中
<uses-permission android:name="android.permission.WAKE_LOCK" />

启用始终在线模式

要使用 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 并注册观察者。通常,这会在使用 Wear OS 的 Compose 时在 onCreate() 或顶级可组合函数中使用,以允许在活动的生命周期内启用常亮显示行为。

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. 当不再需要常亮显示行为时,通过调用 removeObserver() 来移除观察者。例如,您可以在活动的 onDestroy() 方法中调用此方法。

常亮显示应用可以移至后台

从 Wear OS 5 开始,系统会在常亮显示应用在环境模式下可见一段时间后将其移至后台。用户可以在系统设置中配置超时时间。

如果您的常亮显示应用显示有关正在进行的用户任务的信息(例如音乐播放或锻炼会话),您可能希望保持正在进行的活动可见,直到任务结束。为此,请使用 正在进行的活动 API 发布与您的常亮显示活动关联的正在进行的通知。

为了让系统识别正在进行的活动,正在进行的通知的触摸意图必须指向您的常亮显示活动,如下面的代码片段所示。

// 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 中的方法来修改此行为。

为了节省电量,请执行以下操作

  • 减少亮起的像素数量,并使屏幕大部分区域保持黑色。考虑仅在环境模式下显示关键信息,并在用户进入交互模式时提供更多详细信息。
  • 调整任何内容以减少更新频率。例如,将计时器显示到最近的分钟,而不是最近的秒。
  • 在传递给 onEnterAmbient()AmbientDetails 对象中
    • 如果设置了 deviceHasLowBitAmbient,则尽可能禁用抗锯齿。
    • 如果设置了 burnInProtectionRequired,则定期移动可视化内容,并避免纯白色区域。

在使用 Wear OS 的 Compose 时,我们建议使用这些回调方法来更新状态,这允许系统适当地重新组合您的 UI。

有关如何实现此目标的示例,请查看基于 Compose 的 GitHub 上的 锻炼示例,它使用了来自 Horologist 库的 AmbientAware 可组合函数。