(已弃用) 在 Wear OS 上公开供表盘复杂功能使用的数据

1. 向复杂功能公开您的数据

此代码实验室将教您如何构建复杂功能数据源。

概念和设置

完成此代码实验室后,您将了解如何在 Wear OS 上向表盘复杂功能提供您的数据。

概念

复杂功能是表盘的一个功能 超越了时和分。例如,下图中的表盘包含四个复杂功能。

39f4ebe8dc4800b0.png

复杂功能 API 适用于表盘和数据源应用

  • 复杂功能数据源提供数据,例如电池电量、天气、步数等。
  • 表盘开发者可以在其表盘上的复杂功能中显示这些数据。
  • 用户选择他们希望用于复杂功能的数据源。

Screen Shot 2016-05-17 at 5.14.50 PM.png

在此代码实验室中,我们将介绍如何创建复杂功能数据源。如果您也对向表盘添加复杂功能感兴趣,请查看 我们的表盘示例

让我们开始吧!

克隆入门项目仓库

为了帮助您快速入门,我们已 为您准备了一个项目 供您构建。它包含一些基本的代码和代码实验室所需的应用设置。

如果您已安装 Git,请运行以下命令。(您可以通过在终端/命令行中键入 git --version 并验证其是否正确执行来检查是否已安装 Git。)

 git clone https://github.com/android/codelab-complications-data-source.git

如果您没有 Git,可以将项目下载为 zip 文件

导入项目

启动 Android Studio,然后从欢迎屏幕中选择“打开现有 Android Studio 项目”。打开项目目录,然后双击complications-data-source目录中的build.gradle文件。

如果您处于Android视图中,则应该在项目窗口的左上角看到一组类似于下面屏幕截图中的文件夹图标。(如果您处于Project视图中,请展开complications-data-source项目以查看文件夹图标集。)

786caabc75caee70.png

有两个文件夹图标。它们都代表一个模块。请注意,Android Studio 首次编译项目可能需要几秒钟。在此期间,您将在 Android Studio 底部的状态栏中看到一个旋转器。

27f04b5598a2f95e.png

在进行代码更改之前,请等待这些进程完成,以允许 Android Studio 获取所有必要的组件。

了解入门项目

您已设置好并准备开始将您的数据公开给复杂功能。我们将从base模块开始。您将把每个步骤的代码添加到base中。

您可以使用代码实验室中的complete模块作为参考点来检查您的工作(或者如果您遇到问题,也可以作为参考)。

数据源关键组件概述

  • ComplicationTapBroadcastReceiver - 用于通过PendingIntent更新我们的复杂功能数据的类。
  • CustomComplicationDataSourceService - 用于将我们的数据公开给复杂功能的类。该文件位于base/java/com/example/android/wearable/complicationsdatasource目录中。在 Android Studio 中,它位于base/java/com.example.android.wearable.complicationsdatasource下。在类中,我们将主要处理四种方法
  • onComplicationActivated - 当使用您的数据激活复杂功能时调用。
  • getPreviewData - 编辑器 UI 中使用的复杂功能预览数据(通常只是静态内容)。
  • onComplicationRequest - 我们的大部分工作都将在此方法中进行。每当活动的复杂功能需要来自您的来源的更新数据时,都会调用此方法。
  • onComplicationDeactivated - 当复杂功能被停用时调用。

模拟器设置

如果您需要帮助设置 Wear OS 模拟器,请参考“创建和运行可穿戴应用”页面的 “启动模拟器并运行您的 Wear 应用” 部分。

运行入门项目

让我们在手表上运行该应用。

  • 连接您的 Wear OS 设备或启动模拟器。
  • 在工具栏中,从下拉选择器中选择“base”配置,然后单击其旁边的绿色三角形(运行)按钮。

a04699aa4cf2ca12.png

  • 如果您收到如下所示的错误(启动 Activity 失败),请更改默认启动Activity(如下所示)。6ea74bcba8278349.png

相反,如果提示您在启动应用时使用Activity,请选择“不启动 Activity”。

  • 要更改默认启动Activity(如有必要,来自上一步),请单击绿色箭头左侧的下拉选择器,然后单击“编辑配置”。

1e3e1dc73655ccd8.png

选择“base”,您将看到类似于下面的窗口。在启动选项部分下选择“无”,然后单击运行。稍后,如果您想尝试启动其他模块,也需要执行此操作。

5e98572969d8228.png

  • 选择您的 Android 设备或模拟器,然后单击确定。这将在 Wear OS 设备或模拟器上安装服务。
  • 几秒钟后,您的服务将构建并准备好部署。您将在 Android Studio 底部的状态栏中看到一个旋转器。
  • 如果它尚未位于 Android Studio 左下角的“构建”选项卡中,请选择该选项卡,您就可以看到安装进度。安装过程结束时,您应该会看到消息“构建:已成功完成”。

5ea92276833c0446.png

  • 选择一个允许您选择复杂功能的表盘。在本例中,我们选择了Elements Digital,但这可能在您的手表上不可用。

a5cf2c605206efe2.png

请注意,由于这是您第一次运行此表盘,您需要从“添加更多表盘”中选择它。选择一次后,它将作为此选项旁边的选项之一显示。

  • 现在您应该在收藏夹菜单中以您选择的表盘为中心(见下图)。单击底部的齿轮图标。

f17fb6b4cfe06182.png

  • 对于此表盘,您应该选择数据。对于您正在使用的自定义表盘,UI 可能有所不同。

aef4fca32751a15a.png

  • 选择任何位置,即任何“+”(复杂功能)。

461f8a704fbc6496.png

  • 最后,向下滚动并选择服务Complications Data Source Codelab。(选择后,您可能需要向左滑动几次或用手掌触摸设备才能退出。)

b4d0d14140ce0120.png

  • 在您的输出中,您应该会看到onComplicationActivated()onComplicationRequest ()日志消息(尽管复杂功能位置中不会显示任何内容)。
  • 如果您没有看到日志消息,请尝试通过按工具栏中的绿色三角形按钮重新部署表盘。
  • 如果您不熟悉如何查看Log数据,请单击 Android Studio 底部标记为“6: Logcat”的选项卡。将下拉菜单设置为您的设备/模拟器和包名com.example.android.wearable.complicationsdatasource(如下面的屏幕截图所示)。

af9cf164f9c598fc.png

“但是等等!我选择的资料栏中没有显示任何内容!”别担心,我们还没有提供任何数据。我们将在下一步中添加它。

在某些手表上,Elements Watch Face启用了复杂功能,因此您可能会在手表上看到已填充的复杂功能。此外,如果您的模拟器在飞机图标的位置显示带有删除线的云,请勿担心。在此代码实验室中,我们不需要连接到手机或互联网。

52da39817e329e7a.png

摘要

在此步骤中,您学习了以下内容:

  • Wear OS 和向复杂功能公开数据的背后概念
  • 我们起点的基础知识(base模块)
  • 部署和运行表盘

接下来

让我们开始公开一些数据。

2. 公开简短文本数据

代码步骤 2

在此步骤中,我们将开始公开数据。复杂功能接受几种 类型的数据。在此步骤中,我们将返回简短文本数据类型。

如果您在任何时候对此处讨论的概念感到困惑,请参考complete模块,并了解这些步骤是如何实现的。

指定您的数据源支持的数据类型

打开AndroidManifest.xml文件,查看服务CustomComplicationDataSourceService。请注意 intent-filter

<action android:name=
    "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST"/>

这告诉系统您的服务扩展了ComplicationDataSourceServiceSuspendingComplicationDataSourceService(支持 Kotlin 协程的变体),并且可以发送复杂功能的数据。

接下来是meta-data元素,它指定我们支持的数据类型。在本例中,我们支持SMALL_IMAGE,但对于此步骤,请将其更改为SHORT_TEXT。将您的第一个meta-data元素更改为以下内容:

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="SHORT_TEXT"/>

公开您的数据

如前所述,当激活您的数据源时,会调用onComplicationActivated()。这是执行每个激活只需要执行一次的基本设置的好地方/时间。我们在此代码实验室中没有这样做,因为我们的示例相对简单。

当活动的复杂功能请求更新数据时,会调用onComplicationRequest()

会由于各种原因触发方法onComplicationRequest()

  • 活动的表盘复杂功能更改为使用此数据源
  • 使用此数据源的复杂功能变为活动状态
  • 您已通过ComplicationDataSourceUpdateRequester.requestUpdate()ComplicationDataSourceUpdateRequester.requestUpdateAll()触发了来自您自己的类的更新。
  • 您在清单中指定的时间段已过去

打开 CustomComplicationDataSourceService .kt 文件,并将光标移至 onComplicationRequest() 方法。删除“return null”这一行,然后将下面的代码复制粘贴到初始 Log.d() 调用下方。

// Retrieves your data, in this case, we grab an incrementing number from Datastore.
val number: Int = applicationContext.dataStore.data
    .map { preferences ->
        preferences[TAP_COUNTER_PREF_KEY] ?: 0
    }
    .first()

val numberText = String.format(Locale.getDefault(), "%d!", number)

在本例中,我们从 DataStore 中检索一个存储的 int 值来表示我们的数据。这很容易改为调用您的数据库。

DataStore 交互需要一个协程来处理它生成的 Flow 的收集。您可能会注意到 onComplicationRequest() 是一个 suspend 函数,因此我们可以通过 Flow 收集我们的数据,而无需专门启动协程。

检索到整数值后,我们将它转换为简单的字符串,准备将其转换为 ComplicationData 对象,这是一种复杂组件可以理解的数据类型。

接下来,将下面的代码复制粘贴到您刚刚添加的代码下方。

return when (request.complicationType) {

    ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = numberText).build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Short Text version of Number.").build()
    )
        .build()

    else -> {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Unexpected complication type ${request.complicationType}")
        }
        null
    }
}

在此代码中,我们根据复杂组件类型返回一个 ComplicationData 对象,也就是说,对于数据类型 SHORT_TEXT,我们将返回一个 ShortTextComplicationDataComplicationData 的子类)。

给定的数据类型可能包含不同的字段。例如,SHORT_TEXT 可能只是一个文本片段,也可能是标题和文本,或者是一个单色图像和文本(所有这些都应该包含内容描述以实现辅助功能)。

在本例中,我们只设置了必需字段,没有设置可选字段。要了解有关这些类型和字段的更多信息,请查看我们的 文档

您可能会问,为什么我们要使用 when 语句来创建数据。稍后,我们将根据系统请求的类型支持各种形式的数据。通过现在使用 when 语句,我们可以轻松地添加新的数据类型(LONG_TEXTRANGED_VALUE 等)。

最后,如果我们不支持该数据类型,则返回 null。

您的最终方法应该如下所示

override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
    Log.d(TAG, "onComplicationRequest() id: ${request.complicationInstanceId}")

    // Retrieves your data, in this case, we grab an incrementing number from Datastore.
    val number: Int = applicationContext.dataStore.data
        .map { preferences ->
            preferences[TAP_COUNTER_PREF_KEY] ?: 0
        }
        .first()

    val numberText = String.format(Locale.getDefault(), "%d!", number)

    return when (request.complicationType) {

        ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text = numberText).build(),
            contentDescription = PlainComplicationText
                .Builder(text = "Short Text version of Number.").build()
        )
            .build()

        else -> {
            if (Log.isLoggable(TAG, Log.WARN)) {
                Log.w(TAG, "Unexpected complication type ${request.complicationType}")
            }
            null
        }
    }
}

再次运行应用程序。

在第一步中,您学习了如何在设备或模拟器上安装您的复杂组件数据服务。现在是再次执行此操作的时候了!安装您的应用程序并**重新选择复杂组件**,即滑动表盘,选择齿轮图标,导航到相同的复杂组件,然后选择“复杂组件数据源 Codelab”。您应该会看到类似以下内容

caae484f1f2508fd.png

摘要

在此步骤中,您学习了

  • 如何指定您的数据源可以支持的数据类型
  • 当活动复杂组件正在使用数据时,应多久请求一次数据
  • 在哪里向 Wear OS 公开您的数据

接下来

让我们尝试支持不同的数据类型。

3. 触发复杂组件数据更新

代码步骤 3

在此步骤中,当用户点击我们的复杂组件时,我们将触发数据的更新。

如果您在任何时候对此处讨论的概念感到困惑,请参考complete模块,并了解这些步骤是如何实现的。

指定复杂组件应多久刷新一次您的数据

打开 AndroidManifest.xml 文件,再次查看服务 CustomComplicationDataSourceService

请注意 meta-data 元素中的 **UPDATE_PERIOD_SECONDS** 字段。这指定了当您的数据源处于活动状态时,您希望系统多久检查一次数据的更新。

目前,它设置为 600 秒(10 分钟)。因为我们希望响应用户操作来更新我们的复杂组件,所以我们希望更频繁地更新。虽然我们可以缩短此时间段,但系统可能不会触发短于几分钟的时间段的更新。

更好的方法是“推送式”,我们告诉系统在数据发生更改时精确更新。

将更新频率从 600 更改为 0,这表示我们将直接在数据更改时 ping 系统,而不是依赖定期更新。请注意,元数据是必需的。

<meta-data
    android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
    android:value="0"/>

告知系统新的复杂组件数据可用

打开 ComplicationTapBroadcastReceiver.kt。此 BroadcastReceiver 类将在触发时更新我们的复杂组件数据。(请记住,我们只是将数据保存到 DataStore 中。)

该类还提供了一个辅助方法,用于构造 PendingIntent(将其作为 BroadcastReceiver 触发)。

目前,onReceive() 方法从 intent 中提取数据源和复杂组件 ID,并更新 DataStore 中的整数。我们需要告诉我们的复杂组件数据已更新。

移至 onReceive() 方法的底部。在 finally 块上方,您应该会看到一条注释“请求更新……”。将下面的代码复制粘贴到该注释下方。

// Request an update for the complication that has just been tapped, that is,
// the system call onComplicationUpdate on the specified complication data
// source.
val complicationDataSourceUpdateRequester =
    ComplicationDataSourceUpdateRequester.create(
        context = context,
        complicationDataSourceComponent = dataSource
    )
complicationDataSourceUpdateRequester.requestUpdate(complicationId)


这指示 Wear OS 我们的复杂组件的数据已更新。我们需要三条数据才能使其正常工作

  • context - Context 可作为此方法的参数使用:onReceive()
  • complicationDataSourceComponent - 您的复杂组件的 DataSource 作为 Extra 从触发此 BroadcastReceiverPendingIntent 传入。
  • complicationId - 表盘为复杂组件位置分配的唯一整数。该 int 作为 Extra 从触发此 BroadcastReceiverPendingIntent 传入。

我们完成了此步骤,您的最终方法应该如下所示

override fun onReceive(context: Context, intent: Intent) {

    // Retrieve complication values from Intent's extras.
    val extras = intent.extras ?: return
    val dataSource = extras.getParcelable<ComponentName>(EXTRA_DATA_SOURCE_COMPONENT) ?: return
    val complicationId = extras.getInt(EXTRA_COMPLICATION_ID)

    // Required when using async code in onReceive().
    val result = goAsync()

    // Launches coroutine to update the DataStore counter value.
    scope.launch {
        try {
            context.dataStore.edit { preferences ->
                val currentValue = preferences[TAP_COUNTER_PREF_KEY] ?: 0

                // Update data for complication.
                val newValue = (currentValue + 1) % MAX_NUMBER

                preferences[TAP_COUNTER_PREF_KEY] = newValue
            }

            // Request an update for the complication that has just been tapped, that is,
            // the system call onComplicationUpdate on the specified complication data
            // source.
            val complicationDataSourceUpdateRequester =
                ComplicationDataSourceUpdateRequester.create(
                    context = context,
                    complicationDataSourceComponent = dataSource
                )
            complicationDataSourceUpdateRequester.requestUpdate(complicationId)
        } finally {
            // Always call finish, even if cancelled
            result.finish()
        }
    }
}

向我们的复杂组件添加点击操作

我们的 BroadcastReceiver 不仅更新数据,还告知系统新的数据可用(请参阅上一步)。我们需要向我们的复杂组件添加点击操作以触发 BroadcastReceiver

打开 CustomComplicationDataSourceService.kt 并向下移动到 onComplicationRequest() 方法。

在第一个 Log.d() 语句下方以及从 DataStore 检索整数的位置上方,复制/粘贴下面的代码

// Create Tap Action so that the user can trigger an update by tapping the complication.
val thisDataSource = ComponentName(this, javaClass)
// We pass the complication id, so we can only update the specific complication tapped.
val complicationPendingIntent =
    ComplicationTapBroadcastReceiver.getToggleIntent(
        this,
        thisDataSource,
        request.complicationInstanceId
    )

回想上一步,我们的 BroadcastReceiver 需要这两条数据才能正常工作(数据源和复杂组件 ID)。我们将两者都作为附加数据与 PendingIntent 一起传递。

接下来,我们需要将 PendingIntent 分配给我们的复杂组件的点击事件。

找到 ST 的 when 语句,并在 .build() 调用上方添加此行。

    .setTapAction(complicationPendingIntent)

代码块现在应该如下所示。

ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
    text = PlainComplicationText.Builder(text = numberText).build(),
    contentDescription = PlainComplicationText
        .Builder(text = "Short Text version of Number.").build()
)
    .setTapAction(complicationPendingIntent)
    .build()

这只会添加一行,即 .setTapAction() 方法,它将我们的新 PendingIntent 分配给复杂组件的点击操作。

我们完成了此步骤。您的最终方法应该如下所示

override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
    Log.d(TAG, "onComplicationRequest() id: ${request.complicationInstanceId}")

    // Create Tap Action so that the user can trigger an update by tapping the complication.
    val thisDataSource = ComponentName(this, javaClass)
    // We pass the complication id, so we can only update the specific complication tapped.
    val complicationPendingIntent =
        ComplicationTapBroadcastReceiver.getToggleIntent(
            this,
            thisDataSource,
            request.complicationInstanceId
        )

    // Retrieves your data, in this case, we grab an incrementing number from Datastore.
    val number: Int = applicationContext.dataStore.data
        .map { preferences ->
            preferences[TAP_COUNTER_PREF_KEY] ?: 0
        }
        .first()

    val numberText = String.format(Locale.getDefault(), "%d!", number)

    return when (request.complicationType) {

        ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text = numberText).build(),
            contentDescription = PlainComplicationText
                .Builder(text = "Short Text version of Number.").build()
        )
            .setTapAction(complicationPendingIntent)
            .build()

        else -> {
            if (Log.isLoggable(TAG, Log.WARN)) {
                Log.w(TAG, "Unexpected complication type ${request.complicationType}")
            }
            null
        }
    }
}

再次运行应用程序。

安装您的应用程序并**重新选择复杂组件**,即滑动表盘,选择齿轮图标,导航到相同的复杂组件,然后选择**复杂组件数据源 Codelab** 源。您应该会看到与之前相同的内容。但是,现在您可以点击复杂组件,数据将被更新。

a9d767e37161e609.png

摘要

在此步骤中,您学习了

  • 如何告知系统您的复杂组件数据已更新
  • 如何将 PendingIntent 绑定到复杂组件上的点击操作

接下来

让我们尝试支持不同的数据类型。

4. 公开长文本数据

代码步骤 4

当我们将数据公开给复杂组件时,支持更多类型的数据并查看不同数据类型在复杂组件中的外观可能很有用。

指定不同的受支持数据类型

再次打开 AndroidManifest.xml 文件,查看服务 CustomComplicationDataSourceService 的声明。

meta-data 元素 **SUPPORTED_TYPES** 从 **SHORT_TEXT** 更改为 **LONG_TEXT**。您的更改应如下所示

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="LONG_TEXT"/>

添加对 LONG TEXT 的支持

打开 CustomComplicationDataSourceService.kt,向下移动到 onComplicationRequest() 方法中的 when 语句,并在 TYPE_SHORT_TEXT case 的末尾和 default case 的上方添加以下代码。

ComplicationType.LONG_TEXT -> LongTextComplicationData.Builder(
    text = PlainComplicationText.Builder(text = "Number: $numberText").build(),
    contentDescription = PlainComplicationText
        .Builder(text = "Long Text version of Number.").build()
)
    .setTapAction(complicationPendingIntent)
    .build()

when 语句应该类似于以下内容

return when (request.complicationType) {

    ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = numberText).build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Short Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    ComplicationType.LONG_TEXT -> LongTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = "Number: $numberText").build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Long Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    else -> {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Unexpected complication type ${request.complicationType}")
        }
        null
    }
}

您可能已经注意到,我们只是以新的格式重新打包相同的数据。让我们看看它是什么样的。

如何检查您的进度并进行调试

安装您的服务,但这次在选择复杂组件服务源之前选择**底部槽**复杂组件

518b646d3c3f3305.png

您应该会看到如下所示的图像。请注意,每个复杂组件都存储在单独的键下,因此如果您在多个位置设置了复杂组件,您可能会看到不同的值

17ec0506f1412676.png

摘要

在此步骤中,您学习了以下内容:

  • 更改和支持不同的复杂组件数据类型

接下来

在我们整合所有内容之前,我们想支持一种额外的数据类型。

5. 公开范围文本数据

代码步骤 5

当我们将数据公开给复杂组件时,让我们继续探索如何支持更多类型的数据。

指定不同的受支持数据类型

再次打开 AndroidManifest.xml 文件,查看服务 CustomComplicationDataSourceService

meta-data 元素 **SUPPORTED_TYPES** 更改为 **RANGED_VALUE**。您的更改应如下所示

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="RANGED_VALUE"/>

添加对 RANGED VALUES 的支持

范围值不仅可以显示文本,还可以显示一个视觉效果,显示您的值在最小值和最大值之间有多远。这种类型的复杂组件非常适合显示设备上剩余的电量或您还有多少步才能达到目标。

1fe1943a5ad29076.png

打开 CustomComplicationDataSourceService .kt,将光标向下移动到 onComplicationRequest() 方法中的 when 语句,并在 TYPE_LONG_TEXT case 下方和 default case 上方添加此代码

ComplicationType.RANGED_VALUE -> RangedValueComplicationData.Builder(
    value = number.toFloat(),
    min = 0f,
    max = ComplicationTapBroadcastReceiver.MAX_NUMBER.toFloat(),
    contentDescription = PlainComplicationText
        .Builder(text = "Ranged Value version of Number.").build()
)
    .setText(PlainComplicationText.Builder(text = numberText).build())
    .setTapAction(complicationPendingIntent)
    .build()

您的 when 语句应如下所示

return when (request.complicationType) {

    ComplicationType.SHORT_TEXT -> ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = numberText).build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Short Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    ComplicationType.LONG_TEXT -> LongTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text = "Number: $numberText").build(),
        contentDescription = PlainComplicationText
            .Builder(text = "Long Text version of Number.").build()
    )
        .setTapAction(complicationPendingIntent)
        .build()

    ComplicationType.RANGED_VALUE -> RangedValueComplicationData.Builder(
        value = number.toFloat(),
        min = 0f,
        max = ComplicationTapBroadcastReceiver.MAX_NUMBER.toFloat(),
        contentDescription = PlainComplicationText
            .Builder(text = "Ranged Value version of Number.").build()
    )
        .setText(PlainComplicationText.Builder(text = numberText).build())
        .setTapAction(complicationPendingIntent)
        .build()

    else -> {
        if (Log.isLoggable(TAG, Log.WARN)) {
            Log.w(TAG, "Unexpected complication type ${request.complicationType}")
        }
        null
    }
}

同样,我们只是以新的格式重新打包相同的数据。让我们看看它是什么样的。

如何检查您的进度并进行调试

安装您的服务,然后选择另一个位置。

461f8a704fbc6496.png

您现在应该会看到类似以下内容

ffa6ea8f2ed3eb2a.png

您可以看到数字周围有一个径向圆圈,突出显示 3/20 的等效值。

摘要

在此步骤中,您学习了以下内容:

  • 更改和支持不同的复杂组件数据类型

接下来

我们通过启用所有数据类型变体来结束 Codelab。

6. 公开所有三种数据类型

代码步骤 6

目前我们的复杂功能数据源支持三种数据变体(**RANGED_VALUE、SHORT_TEXT** 和 **LONG_TEXT**)。

在最后一步中,我们将告知系统我们支持所有三种变体。

指定多个支持的数据类型

再次打开 AndroidManifest.xml 文件,查看服务 CustomComplicationDataSourceService

meta-data 元素 **SUPPORTED_TYPES** 更改为 **RANGED_VALUE,SHORT_TEXT,LONG_TEXT**。更改后应如下所示

<meta-data
    android:name="android.support.wearable.complications.SUPPORTED_TYPES"
    android:value="RANGED_VALUE,SHORT_TEXT,LONG_TEXT"/>

检查您的进度

安装您的服务。

b3a7c0c8063c2f60.png

在这种情况下,表盘更偏向于范围数据类型而不是短文本和长文本类型,但如果复杂功能只支持短文本类型,数据仍然会显示,因为表盘支持所有三种数据类型。请记住,表盘本身会指定复杂功能支持的数据类型以及这些类型的优先级顺序。

摘要

在此步骤中,您学习了以下内容:

  • 支持多个复杂功能数据类型

7. 完成!下一步是什么?

您可以在复杂功能中支持更多 数据类型(包括小图像、大图像和图标)。尝试通过自行实现其中一些类型来扩展此代码实验室。

有关为表盘开发复杂功能和创建复杂功能数据源的更多详细信息,请访问 表盘复杂功能

有关开发 Wear OS 表盘的更多详细信息,请访问 https://developer.android.com/training/wearables/watch-faces/index.html