默认情况下,通知会从手机上的应用桥接(共享)到配对手表。如果您构建的手表应用也同时存在于配对手机上,用户可能会收到重复的通知:一个由电话应用生成和桥接,另一个由手表应用生成。您可以利用 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()
)
为所有通知停用桥接功能(不推荐)
注意:不建议为所有通知停用桥接功能,因为清单中设置的桥接配置会在安装手表应用后立即生效。如果用户需要先打开并设置手表应用,然后才能收到通知,则此配置可能会导致通知丢失。
为了避免桥接来自手机应用的所有通知,请在手表应用的清单文件中使用 条目,如以下示例所示:
<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()
注意:关闭 ID 在手表与 Android 手机配对的情况下有效,但在手表与 iPhone 配对的情况下无效。
不桥接通知的情况
以下类型的通知不会被桥接:
使用 Notification.Builder.setLocalOnly(boolean) 设置的仅限本机通知。
使用 Notification.Builder.setOngoing(boolean) 或 Notification.FLAG_ONGOING_EVENT 设置的持续性通知。
使用 Notification.FLAG_NO_CLEAR 设置的不可清除通知。
在对应穿戴式应用已停用通知桥接功能的情况下显示的通知,如上文所述。
桥接通知最佳实践
从穿戴式设备推送或移除桥接通知需要花费一定时间。在设计通知时,一定要避免由这一延迟造成的意外行为。以下准则有助于确保桥接通知能与异步通知一起使用:
如果您取消了手机上的某条通知,手表上的对应通知可能需要过一段时间才会取消。在此期间,用户可能会发送该通知上的某个待处理 intent。因此,请继续在应用中接收其已取消的通知的待处理 intent:取消通知时,请保证这些通知的待处理 intent 接收器有效。
请勿一次取消并重新触发堆叠的所有通知。只修改或移除已实际发生修改的通知。这样可以避免在更新穿戴式设备时出现延迟,并降低应用对电池续航时间的影响。
设计注意事项
Wear OS 通知有自己的设计准则。如需了解详情,请参阅 Wear OS 设计指南。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-13。