По умолчанию система передает уведомления из приложений на телефоне на все подключенные часы. Если у вас есть приложение для часов и оно также установлено на подключенном телефоне, пользователи могут получать дублирующиеся уведомления: одно от приложения на телефоне, а другое от приложения на часах. В Wear OS есть функции, позволяющие управлять тем, как и когда уведомления передаются на часы.
Как избежать дублирования уведомлений
Когда вы создаете уведомления из внешнего источника, например из Firebase Cloud Messaging, приложение для телефона и приложение для часов могут показывать на часах собственные уведомления. Чтобы избежать дублирования, отключите синхронизацию уведомлений в приложении для часов программным способом.
Как использовать теги-мосты
Чтобы пересылать на часы некоторые уведомления, созданные приложением на телефоне, когда установлено приложение для часов, задайте теги bridge.
Чтобы добавить тег-мост в уведомление, используйте метод setBridgeTag(String), как показано в следующем примере кода:
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setBridgeTag("tagOne") ) .build()
Как отключить мост
Вы можете отключить синхронизацию уведомлений для некоторых или всех уведомлений. Мы рекомендуем отключать мосты выборочно.
Как отключить объединение для некоторых уведомлений
Вы можете динамически отключать синхронизацию уведомлений и при необходимости разрешать передачу некоторых уведомлений на основе их тега. Например, чтобы отключить синхронизацию уведомлений для всех уведомлений, кроме тех, которые помечены как tagOne, tagTwo или tagThree, используйте объект BridgingConfig, как показано в следующем примере:
// In this example, bridging is only enabled for tagOne, tagTwo and tagThree. BridgingManager.fromContext(context).setConfig( BridgingConfig.Builder(context, isBridgingEnabled = false) .addExcludedTags(listOf("tagOne", "tagTwo", "tagThree")) .build() )
Как отключить пересылку для всех уведомлений (не рекомендуется)
Чтобы запретить синхронизацию всех уведомлений из приложения для телефона, используйте запись <meta-data> в файле манифеста приложения для часов, как показано в следующем примере:
<!-- Beware, this can have unintended consequences before the user is signed-in --> <meta-data android:name="com.google.android.wearable.notificationBridgeMode" android:value="NO_BRIDGING" />
Как задать идентификатор закрытия для синхронизации похожих уведомлений
Если вы запретите синхронизацию уведомлений с помощью функции режима моста, уведомления не будут синхронизироваться между устройствами пользователя.
Однако если похожие уведомления создаются и на телефоне, и на часах, то при закрытии одного из них должны закрываться оба.
В элементе NotificationCompat.WearableExtender можно задать глобальный уникальный идентификатор, чтобы при закрытии уведомления на одном из подключенных устройств оно также закрывалось на других.
В классе NotificationCompat.WearableExtender есть методы, позволяющие использовать идентификаторы закрытия, как показано в следующем примере:
Когда пользователь закрывает уведомление, все остальные уведомления с тем же идентификатором закрываются на часах и телефоне. Чтобы получить идентификатор закрытия, используйте метод getDismissalId().
В приведенном ниже примере для нового уведомления задан глобально уникальный идентификатор, поэтому уведомления будут синхронизироваться.
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setDismissalId("abc123") ) .build()
Локальные уведомления
Чтобы избежать дублирования уведомлений, можно также использовать setLocalOnly(), чтобы уведомления приходили только на телефон.
Однако используйте этот метод, только если уведомление должно появляться только на устройстве, на котором оно было создано. Это касается не только устройств Wear OS, но и других носимых устройств и любых подключенных устройств. Уведомление, предназначенное только для локального устройства, не будет передано на другое устройство, даже если приложение не установлено на часах.
При создании приложений для Wear OS и телефона, которые отправляют уведомления, не используйте этот подход, чтобы избежать дублирования уведомлений. Вместо этого используйте варианты перехода.
Например, если пользователь скачивает файл на телефон, уведомление о завершении скачивания должно быть локальным.
Когда уведомления не передаются
Система не пересылает следующие типы уведомлений:
- Уведомления, которые показываются только на устройстве, задаются с помощью
Notification.Builder.setLocalOnly(boolean). - Текущие уведомления, заданные с помощью
Notification.Builder.setOngoing(boolean)илиNotification.FLAG_ONGOING_EVENT. - Уведомления, которые нельзя закрыть, задаются с помощью
Notification.FLAG_NO_CLEAR. - Уведомления, для которых в приложении для носимого устройства отключена передача уведомлений.
Особенности реализации уведомлений с переходом
Передача уведомлений на носимое устройство и их удаление занимает некоторое время. При разработке уведомлений учитывайте эту задержку, чтобы избежать неожиданного поведения. Чтобы переданные уведомления работали с асинхронными уведомлениями, следуйте приведенным ниже рекомендациям.
- Если вы отмените уведомление на телефоне, соответствующее уведомление на часах может быть отменено не сразу. В этот период пользователь может отправить один из ожидающих намерений в этом уведомлении. По этой причине продолжайте получать в приложении отмененные уведомления с ожидающими намерениями: при отмене уведомлений сохраняйте действительными получателей ожидающих намерений.
- Не отменяйте и не запускайте повторно сразу все уведомления. Изменяйте или удаляйте только те уведомления, которые были изменены. Это позволяет избежать задержки при обновлении данных на носимом устройстве и снизить влияние приложения на время работы от батареи.
Рекомендации по дизайну
Уведомления Wear OS имеют собственные рекомендации по дизайну. Дополнительную информацию можно найти в рекомендациях по дизайну для Wear OS.