默认情况下,通知会从手机上的应用桥接到任何配对的手表,或与其共享。如果您构建了一个手表应用,并且您的应用也存在于配对的手机上,用户可能会收到重复的通知——一个由手机应用生成并桥接,另一个由手表应用生成。Wear OS 包含控制如何以及何时桥接通知的功能。
避免重复通知
当您从外部来源创建通知时(例如,来自 Firebase Cloud Messaging),您的移动应用和您的可穿戴应用都可以在手表上显示其自己的通知。为了避免这种重复,请在您的可穿戴应用中以编程方式禁用桥接。
使用桥接标签
如果在安装可穿戴应用时,您希望将手机应用上创建的一些通知桥接到手表,请设置桥接标签。
通过使用 setBridgeTag(String)
方法在通知上设置桥接标签,如下面的代码示例所示
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setBridgeTag("tagOne") ) .build()
禁用桥接
您可以禁用某些通知或所有通知的桥接。我们建议您有选择地禁用桥接。
禁用某些通知的桥接
您可以动态地禁用桥接,并根据其标签选择允许某些通知通过。例如,要禁用除标记为 tagOne
、tagTwo
或 tagThree
的通知之外的所有通知的桥接,请使用 BridgingConfig
对象,如下例所示
BridgingManager.fromContext(context).setConfig( BridgingConfig.Builder(context, false) .addExcludedTags(listOf("tagOne", "tagTwo", "tagThree")) .build() )
禁用所有通知的桥接(不推荐)
注意:不建议禁用所有通知的桥接功能,因为清单中设置的桥接配置会在手表应用安装后立即生效。如果用户需要在收到通知之前打开并设置手表应用,这可能会导致通知丢失。
要阻止手机应用的所有通知桥接,请在手表应用的清单文件中使用<meta-data>
条目,如下例所示
<application> ... <!-- Beware, this can have unintended consqequences before the user is signed-in --> <meta-data android:name="com.google.android.wearable.notificationBridgeMode" android:value="NO_BRIDGING" /> ... </application>
注意:在运行时指定桥接配置会覆盖 Android 清单文件中的桥接相关设置。
设置关闭 ID 以同步类似的通知
当您使用桥接模式功能阻止桥接时,通知的关闭操作不会在用户的设备之间同步。
但是,如果在移动设备和手表上都创建了类似的通知,当用户关闭其中一个通知时,您希望这两个通知都关闭。
在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()
注意:如果手表与 Android 手机配对,则关闭 ID 有效,但如果手表与 iPhone 配对,则无效。
当通知未桥接时
以下类型的通知不会被桥接
- 使用
Notification.Builder.setLocalOnly(boolean)
设置的仅限本地通知。 - 使用
Notification.Builder.setOngoing(boolean)
或Notification.FLAG_ONGOING_EVENT
设置的正在进行的通知。 - 使用
Notification.FLAG_NO_CLEAR
设置的不可清除通知。 - 对应可穿戴应用已禁用通知桥接的通知(如前所述)。
桥接通知的最佳实践
将桥接通知推送到可穿戴设备或从可穿戴设备中删除需要时间。在设计通知时,请确保避免由此延迟引起的意外行为。以下指南有助于确保您的桥接通知与异步通知一起使用
- 如果您在手机上取消通知,则取消手表上相应的通知可能需要一些时间。在此期间,用户可能会发送该通知上的待处理意图之一。因此,请继续在您的应用中接收来自其已取消通知的待处理意图:在取消通知时,请保持这些通知的待处理意图接收器有效。
- 不要一次取消并重新触发整个通知堆栈。仅修改或删除实际已修改的通知。这避免了更新可穿戴设备的延迟,并减少了应用对电池寿命的影响。
设计注意事项
Wear OS 通知有其自身的设计指南。有关更多信息,请查看Wear OS 设计指南。