Wear 上的通知桥接模式

默认情况下,通知会从配套手机上的应用桥接(共享)到配对手表。如果您构建了独立手表应用,并且还有配套手机应用,这些应用可能会创建重复的通知。Wear OS by Google 谷歌包含处理这一重复通知问题的功能。

请参阅以下相关资源:

注意:您可以使用 Firebase 云消息传递 (FCM) 向设备发送通知提醒。请参阅跨 Android、iOS 和 Chrome 平台与用户互动

开发者可以通过以下一种或多种方式改变通知的行为:

  • 在清单文件中指定桥接配置
  • 在运行时指定桥接配置
  • 设置关闭 ID 以便在各设备间同步通知关闭行为

在清单文件中指定桥接配置

应用的 Android 清单文件可以指明,不应将来自对应手机应用的通知桥接到手表。具体来说,要阻止桥接来自手机应用的通知,您可以在手表应用(例如,独立手表应用)的清单文件中使用 <meta-data> 条目,如下所示:

    com.google.android.wearable.notificationBridgeMode
    

将该 <meta-data> 条目添加为 <application> 元素的子元素。将该条目设为 NO_BRIDGING 即可阻止桥接:

    <application>
    ...
      <meta-data
        android:name="com.google.android.wearable.notificationBridgeMode"
        android:value="NO_BRIDGING" />
    ...
    </application>
    

如果您不添加 <meta-data> 条目,或者您指定的值是 BRIDGING 而不是 NO_BRIDGING,则会发生默认的桥接行为。

一旦安装了手表应用,在清单中设置的桥接配置会立即生效。

在运行时指定桥接配置

您可以使用桥接模式功能在运行时指定桥接配置。具体来说,您应使用 BridgingManager 类。

您可以使用 BridgingManager 对象设置桥接模式,还可以为免于进入桥接模式的通知设置标记。具体来说,创建一个 BridgingConfig 对象,并按照本部分所示对其进行设置。

在运行时指定桥接配置会替换 Android 清单文件中与桥接有关的设置。

针对所有通知停用桥接功能

您可以针对所有通知停用桥接功能,如下所示:

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false).build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .build());
    

如果未设置上述配置,则桥接模式默认设为 true。

豁免带标记的通知

您可以针对除了带某些标记的通知以外的所有通知停用桥接功能。

例如,您可以针对除了带 foobarbaz 标记的通知以外的所有通知停用桥接功能。

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTags(listOf("foo", "bar", "baz"))
                    .build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTags(Arrays.asList("foo", "bar", "baz"))
        .build());
    

再如,您可以排除带特定标记(如 foobar)的通知:

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTag("foo")
                    .addExcludedTag("bar")
                    .build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTag("foo")
        .addExcludedTag("bar")
        .build());
    

设置桥接标记

您可以使用 setBridgeTag(String) 方法为通知设置桥接标记,如下所示:

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setBridgeTag("foo")
            )
            .build()
    

Java

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId)
    // ... set other fields ...
      .extend(
        new NotificationCompat.WearableExtender()
          .setBridgeTag("foo"));
      Notification notification = notificationBuilder.build();
    

在现有应用中阻止桥接

在现有应用中,您可能已针对收到提醒时手机未连接的情况停用了桥接功能。在这种情况下,在手表应用中关闭通知后,您可能仍需要在其他设备上关闭通知。

阻止桥接的一种现有方式是使用 Notification.Builder 类;需要在 setLocalOnly 方法中指定 true

不过,这种阻止桥接的方式可能并不可取。例如,如果用户安装了手机应用,但未安装对应的手表应用,则 setLocalOnly 方法可能会阻止桥接有用的通知。此外,用户可能有多块配对手表,不一定所有手表上都安装了手表应用。

使用关闭 ID 同步通知关闭行为

如果您使用桥接模式功能阻止桥接功能,则通知关闭(取消)行为不会在用户的各设备间同步。不过,您可以通过 NotificationCompat.WearableExtender 类的以下方法来使用关闭 ID:

Kotlin

    fun setDismissalId(dismissalId: String): WearableExtender
    fun getDismissalId(): String
    

Java

    public WearableExtender setDismissalId(String dismissalId)
    public String getDismissalId()
    

要同步关闭行为,请使用 setDismissalId() 方法。当您调用 setDismissalId() 方法时,为每条通知传递一个字符串形式的全局唯一 ID。相应通知关闭后,手表和配套手机上的其他所有具有同一关闭 ID 的通知也会关闭。要检索关闭 ID,请使用 getDismissalId()

在以下示例中,由于为新通知指定了全局唯一 ID,因此关闭行为的同步功能处于启用状态:

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setDismissalId("abc123")
            )
            .build()
    

Java

    NotificationCompat.WearableExtender wearableExtender =
      new NotificationCompat.WearableExtender().setDismissalId("abc123");
    Notification notification = new NotificationCompat.Builder(context)
    // ... set other fields ...
      .extend(wearableExtender)
      .build();
    

如果手表与 Android 手机配对,关闭 ID 能起作用;但如果手表与 iPhone 配对,关闭 ID 不起作用。

桥接通知最佳做法

从穿戴式设备推送或移除桥接通知需要花费一定时间。在设计通知时,请确保避免由这一延迟造成的意外行为。以下准则将帮助您确保桥接通知可与异步通知一起使用:

  • 如果您取消了手机上的某条通知,手表上的对应通知可能需要过一段时间才会取消。在此期间,用户可能会发送该通知上的某个待定 intent。出于此原因,您的应用应准备好接收来自它已取消的通知的待定 intent。因此,取消通知时,您应确保让这些通知的待定 intent 接收器保持有效。
  • 请勿一次取消和重新触发整个堆栈的通知。只修改或移除已实际发生修改的通知。这样可以避免在更新穿戴式设备时出现延迟,并确保您的应用对电池续航时间造成的影响最小。

设计注意事项

Wear OS 通知有自己的设计准则。如需了解详情,请查阅 Material Design 页面。

  • 从配对手机桥接到 Wear 设备的所有通知都使用展开式通知。
  • 要了解何时使用 Wear OS 支持的不同通知模板,请阅读通知模式设计指南。
  • 要了解如何设置 Wear 通知的样式,请阅读通知样式设计指南。
  • 如果您有聊天短信应用,您的通知应使用 NotificationCompat.MessagingStyle。Wear 使用 MessagingStyle 通知中包含的聊天消息(请参阅 addMessage())在展开式通知中提供类似聊天应用的丰富体验。
  • 在通知流中添加内嵌操作 (setHintDisplayActionInline(true)),使其包含用户可以对通知快速执行的主要操作。例如,适合在通知流中内嵌操作的用例包括回复短信、停止健身运动或归档电子邮件。
  • MessagingStyle 通知启用智能回复 (setAllowGeneratedReplies(true))。