通知的桥接模式

默认情况下,通知从配套手机上的应用桥接(共享)至配对手表。如果您构建了独立手表应用,并且还有配套手机应用,这些应用可能会创建重复的通知。Android Wear 提供了处理这个重复通知问题的功能。

:您可以使用 Firebase 云消息传递 (FCM) 向设备发送通知提醒。请参阅通过 Android、iOS 和 Chrome 吸引您的用户

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

  • 在 manifest 文件中指定桥接配置
  • 在运行时指定桥接配置
  • 设置关闭 ID,以将通知关闭同步到所有设备

在 manifest 文件中指定桥接配置

应用的 Android manifest 文件可能指示,不应将来自对应手机应用的通知桥接至手表。具体地讲,要防止桥接来自手机应用的通知,您可以在手表应用(例如独立手表应用)的 manifest 文件中使用 <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,则会默认发生桥接行为。

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

在运行时指定桥接配置

您可以使用桥接模式功能在运行时指定桥接配置。具体地讲,就是使用 BridgingManager 类。

您可以使用 BridgingManager 对象设置桥接模式,以及为豁免于桥接模式的通知设置标记(可选步骤)。具体地讲,创建一个 BridgingConfig 对象,并按此部分所示进行设置。

在运行时指定桥接配置会重写 Android manifest 文件中与桥接有关的设置。

停用所有通知的桥接

您可以按如下方式停用所有通知的桥接:

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

如果未设置以上配置,则默认启用桥接模式。

带标记的豁免通知

您可以为所有不带特定标记的通知停用桥接。

例如,您可以为所有不带 foobarbaz 标记的通知停用桥接。

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

另举一例,您可以将带有特定标记(例如 foobar)的通知排除在外:

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

设置桥接标记

可按如下方式使用 setBridgeTag(String) 函数在通知上设置桥接标记:

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

防止桥接的现有方法

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

防止桥接的现有方式是使用 Notification.Builder 类;需要在 setLocalOnly 函数中指定 true

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

使用关闭 ID 同步通知关闭

如果您使用桥接模式功能防止桥接,通知的关闭(取消)不会同步到用户的所有设备。不过,您可以通过 NotificationCompat.WearableExtender 类的下列函数使用关闭 ID:

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

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

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

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

关闭 ID 在手表与 Android 手机配对时有效,但在手表与 iPhone 配对时无效。

桥接通知最佳做法

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

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

设计注意事项

Android Wear 通知具有自己的设计宗旨。如需了解详细信息,请查阅 Material Design 页面。

  • 所有从配对手机桥接至 Wear 设备的通知都使用扩展通知。
  • 要了解 Android Wear 上支持的不同通知模板的使用时机,请阅读通知模式设计指南。
  • 要了解如何为 Wear 通知设置样式,请阅读通知样式设计指南。
  • 如果您有聊天消息传递应用,您的通知应使用 NotificationCompat.MessagingStyle。Wear 使用 MessagingStyle 通知中包含的聊天消息(请参阅 addMessage())在扩展通知中提供丰富的类聊天应用体验。
  • 在通知卡片信息流内添加一个内联操作 ( setHintDisplayActionInline(true)),以加入用户可迅速对通知执行的主要操作。举例来说,适合在通知卡片信息流内使用内联操作的用例包括:回复短信、停止健身 Activity 或存档电子邮件。
  • 为您的 MessagingStyle 通知启用智能回复 (setAllowGeneratedReplies(true))。