默认情况下,通知会从配套手机上的应用桥接(共享)到配对手表。如果您构建了独立手表应用,并且还有配套手机应用,这些应用可能会创建重复的通知。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。
豁免带标记的通知
您可以针对除了带某些标记的通知以外的所有通知停用桥接功能。
例如,您可以针对除了带 foo
、bar
或 baz
标记的通知以外的所有通知停用桥接功能。
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());
再如,您可以排除带特定标记(如 foo
或 bar
)的通知:
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)
)。