通知的桥接选项

默认情况下,通知会从手机上的应用桥接(共享)到配对手表。如果您构建了手表应用,配对手机上也安装了这个应用,它可能会创建重复的通知。利用 Wear OS 的功能可解决此问题。

避免显示重复的通知

如果您使用外部来源(例如 Firebase Cloud Messaging)来创建通知,您的移动应用和穿戴式应用就可能会各自在手表上显示自己的通知。若要避免此类重复通知,请在安装穿戴式应用后停用相应桥接功能。

1. 在移动应用中,适时使用桥接标记

如果您想在穿戴式应用安装后,将移动应用中创建的部分通知桥接到手表,请设置桥接标记。

设置桥接标记

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

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

2. 在穿戴式应用中,停用桥接功能

如果您使用的是桥接标记,请在运行时停用桥接功能。

停用桥接功能,但有例外情况

您可以使用 BridgingManager 对象设置桥接模式,还可以视需要为免于进入桥接模式的通知设置标记。请按照本部分的说明创建一个 BridgingConfig 对象。

您可以停用所有通知停用的桥接功能,只留下带特定标记的通知。例如,您可以停用除了标记 foobarbaz 之外所有通知的桥接功能,如以下示例所示:

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

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

如果您使用的不是来自移动设备的桥接标记,请避免桥接来自手机应用的所有通知。您可以在手表应用的清单文件中使用 <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),则会发生默认的桥接行为。

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

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

3. 设置关闭 ID,以在 Wear OS 和移动设备上同步类似通知

如果您使用桥接模式功能阻止桥接功能,通知关闭行为就不会在用户的各设备间同步。

不过,如果在移动设备和手表上都创建了类似的通知,则建议您在用户关闭其中任一设备上的通知后,让系统同时关闭两边的通知。

您可以在 NotificationCompat.WearableExtender 中设置全局唯一 ID,以便在其中一条通知关闭后,配对手表上具有相同 ID 的其他通知也会关闭。

NotificationCompat.WearableExtender 类备有可让您使用关闭 ID 的方法,如以下示例所示:

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

如需同步关闭行为,请使用 setDismissalId() 方法。当您调用 setDismissalId() 方法时,为每条通知传递一个字符串形式的全局唯一 ID。

相应通知关闭后,手表和手机上的其他所有具有同一关闭 ID 的通知也会关闭。如需检索关闭 ID,请使用 getDismissalId()

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

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

注意:关闭 ID 在手表与 Android 手机配对的情况下有效,但在手表与 iPhone 配对的情况下无效。

不桥接通知的情况

在以下情况下,系统不会桥接通知:

桥接通知最佳实践

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

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

设计须知

Wear OS 通知有自己的设计准则。如需了解详情,请参阅 Wear OS 设计指南