在 Wear OS 上向表盘复杂功能公开数据

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

此 Codelab 将教您如何构建复杂功能数据源。

概念和设置

在 Codelab 结束时,您将了解如何将您的数据提供给 Wear OS 上表盘复杂功能。

概念

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

39f4ebe8dc4800b0.png

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

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

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

在本 Codelab 中,我们介绍了如何创建复杂功能数据源。如果您也对向表盘添加复杂功能感兴趣,请查看我们的表盘示例

让我们开始吧!

克隆入门项目仓库

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

如果您已安装 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

您可以使用 Codelab 中的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(以下说明)。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 表盘启用了复杂功能,因此您可能会在手表上看到已填充的复杂功能。此外,如果您的模拟器在飞机图标的位置显示带删除线的云,请不要担心。在本 Codelab 中,我们不需要连接到手机或互联网。

52da39817e329e7a.png

总结

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

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

下一步

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

2. 公开简短文本数据

代码步骤 2

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

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

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

打开AndroidManifest.xml文件,并查看服务CustomComplicationDataSourceService。请注意 intent 过滤器

<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()方法从意图中提取数据源和复杂功能 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"/>

添加对长文本的支持。

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

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"/>

添加对范围值的支持。

范围值不仅可以显示文本,还可以显示视觉效果,显示您的值在最小值和最大值之间有多远。这种类型的复杂功能非常适合显示设备剩余的电量或您为实现目标而剩下的步数。

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 的部分。

总结

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

  • 更改和支持不同的复杂功能数据类型。

下一步

我们将通过启用所有数据类型变体来结束本代码实验。

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

代码步骤 6

现在我们的复杂功能数据源支持我们数据的三个变体(RANGED_VALUE、SHORT_TEXTLONG_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