(已弃用) 在 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),请更改默认启动 Activity(说明如下)。 6ea74bcba8278349.png

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

  • 要更改默认启动 Activity(如果需要,从上一步开始),请点击绿色箭头左侧的下拉选择器,然后点击“编辑配置”。

1e3e1dc73655ccd8.png

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

5e98572969d8228.png

  • 选择您的 Android 设备或模拟器,然后点击确定。这将在 Wear OS 设备或模拟器上安装服务。
  • 几秒钟后,您的服务将构建完成并准备好部署。您将在 Android Studio 底部的状态栏中看到一个加载指示器。
  • 如果它不在 Android Studio 左下角的“Build”(构建)选项卡中,请选择该选项卡,您可以看到安装进度。在安装过程结束时,您应该会看到消息“Build: completed successfully”(构建:成功完成)。

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 已启用复杂功能,因此您可能会在手表上看到一个已填充的复杂功能。此外,如果您的模拟器显示带有删除线的云图标而不是飞机图标,请不要担心。本次 Codelab 我们不需要连接手机或互联网。

52da39817e329e7a.png

总结

在此步骤中,您学习了

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

下一步

我们开始提供一些数据吧。

2. 提供短文本数据

代码步骤 2

在此步骤中,我们将开始提供数据。复杂功能接受多种数据类型。在此步骤中,我们将返回 Short Text 数据类型。

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

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

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

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

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

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

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

提供您的数据

如前所述,当您的数据源被激活时,会调用 onComplicationActivated()。这是执行每次激活只需完成一次的基本设置的好地方/时机。在本 Codelab 中我们不做此操作,因为我们的示例相对简单。

活动的复杂功能请求更新数据的地方是 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 可能只是单个文本片段,或者标题和文本,或者单色图像和文本(所有这些都应包含用于辅助功能的 Content Description)。

对于我们的情况,我们只设置了必填字段,没有设置可选字段。要了解更多关于这些类型和字段的信息,请查阅我们的文档

您可能会问,为什么我们使用 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
        }
    }
}

再次运行应用

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

caae484f1f2508fd.png

总结

在此步骤中,您学习了

  • 如何指定您的数据源可以支持的数据类型
  • 当活动的复杂功能正在使用您的数据时,应该多久请求一次您的数据
  • 在哪里将您的数据提供给 Wear OS

下一步

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

3. 触发复杂功能数据更新

代码步骤 3

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

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

指定复杂功能刷新您的数据的频率

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

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

现在,它设置为 600 秒(10 分钟)。由于我们希望响应用户操作更新复杂功能,因此我们希望更频繁地更新。虽然我们可以缩短此周期,但系统可能不会触发短于几分钟的周期的更新。

更好的方法是“推送式”更新,即当数据发生变化时,我们精确地告知系统进行更新。

将更新频率从 600 更改为 0,这表示当数据发生更改时,我们将直接通知系统进行更新,而不是依赖于周期性更新。请注意,此 meta-data 是一项要求。

<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...”。在该注释下方复制代码并粘贴。

// 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)。我们在这里将两者作为 extras 与 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
        }
    }
}

再次运行应用

安装您的应用并重新选择复杂功能,即滑动表盘,选择齿轮图标,导航到相同的复杂功能,然后选择 Complications Data Source Codelab 数据源。您应该看到与之前相同的内容。但是,现在您可以点按复杂功能,数据将更新。

a9d767e37161e609.png

总结

在此步骤中,您学习了

  • 如何通知系统您的复杂功能数据已更新
  • 如何将 PendingIntent 绑定到复杂功能上的点按操作

下一步

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

4. 提供长文本数据

代码步骤 4

随着我们向复杂功能提供数据,支持更多数据类型并了解不同数据类型在复杂功能中的显示效果可能会很有用。

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

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

meta-data 元素 SUPPORTED_TYPESSHORT_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. 完成了!下一步是什么?

复杂功能中还有许多其他您可以支持的数据类型(包括小图片、大图片和图标)。尝试自己实现其中一些类型来扩展本 Codelab。

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

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