Por padrão, as notificações são transmitidas em ponte, ou compartilhadas, de um app no smartphone para todos os relógios pareados. Se você criar um app para smartwatch e ele também for instalado em um smartphone pareado, os usuários poderão receber notificações duplicadas: uma gerada e transmitida em ponte pelo app para smartphone e outra pelo app para smartwatch. O Wear OS inclui recursos para controlar como e quando as notificações são conectadas em ponte.
Evitar notificações duplicadas
Quando você cria notificações de uma fonte externa, como o Firebase Cloud Messaging, tanto seu app para dispositivos móveis quanto o para wearables podem mostrar notificações no relógio. Para evitar esse tipo de duplicação, desative a ponte de forma programática no app para wearables.
Usar tags de ponte
Se você quiser transmitir em ponte algumas das notificações criadas no app para dispositivos móveis ao relógio quando o app para wearables estiver instalado, defina tags de ponte.
Defina esse tipo de tag em uma notificação usando o método
setBridgeTag(String)
,
conforme mostrado no exemplo de código a seguir:
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setBridgeTag("tagOne") ) .build()
Desativar a ponte
É possível desativar a ponte para algumas ou todas as notificações. Recomendamos que você faça essa desativação de forma seletiva.
Desativar a ponte para algumas notificações
Você pode desativar dinamicamente a ponte e, se quiser, permitir algumas notificações
com base na tag delas. Por exemplo, se quiser desativar a ponte para todas as notificações, exceto aquelas marcadas como
tagOne
, tagTwo
ou tagThree
, use o objeto
BridgingConfig
,
conforme mostrado no exemplo a seguir:
BridgingManager.fromContext(context).setConfig( BridgingConfig.Builder(context, false) .addExcludedTags(listOf("tagOne", "tagTwo", "tagThree")) .build() )
Desativar a ponte para todas as notificações (não recomendado)
Observação: não é recomendável desativar a ponte para todas as notificações, porque a configuração de ponte definida no manifesto entra em vigor assim que um app para smartwatch é instalado. Isso pode levar à perda de notificações caso o usuário precise abrir e configurar o app para smartwatch antes de receber notificações.
Se quiser evitar a ponte em todas as notificações de um
app para smartphone, use a entrada <meta-data>
no arquivo de manifesto do app para smartwatch, conforme mostrado no exemplo a seguir:
<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>
Observação: especificar uma configuração de ponte durante a execução substitui configurações relacionadas a pontes no arquivo de manifesto do Android.
Definir um ID de dispensa para sincronizar notificações semelhantes
Se você impedir a ponte com o recurso modo bridge, as dispensas de notificações serão sincronizadas nos dispositivos do usuário.
No entanto, se notificações semelhantes forem criadas no dispositivo móvel e no relógio, será necessário dispensar as duas se o usuário dispensar uma delas.
Na classe
NotificationCompat.WearableExtender
,
você pode definir um ID exclusivo global para que, quando uma notificação for dispensada, outras
com o mesmo ID em relógios pareados também sejam.
A classe
NotificationCompat.WearableExtender
tem métodos que permitem usar IDs de dispensa, conforme mostrado no exemplo a seguir:
fun setDismissalId(dismissalId: String): WearableExtender fun getDismissalId(): String
Para sincronizar uma dispensa, use o
método
setDismissalId()
. Para cada notificação, transmita um ID globalmente exclusivo, como uma string, quando você chamar o
método setDismissalId()
.
Quando a notificação é dispensada, todas as outras notificações com o mesmo ID são
dispensadas no smartwatch e no smartphone. Para recuperar um ID de dispensa, use
getDismissalId()
No exemplo a seguir, um ID globalmente exclusivo é especificado para uma nova notificação. Portanto, as dispensas são sincronizadas:
val notification = NotificationCompat.Builder(context, channelId) // Set other fields ... .extend( NotificationCompat.WearableExtender() .setDismissalId("abc123") ) .build()
Observação: os IDs de dispensa funcionam quando um relógio está pareado com um smartphone Android, mas não com um iPhone.
Quando as notificações não são transmitidas em ponte
Os seguintes tipos de notificação não são transmitidos em ponte:
- Somente locais e definidas usando
Notification.Builder.setLocalOnly(boolean)
. - Contínuas e definidas usando
Notification.Builder.setOngoing(boolean)
ouNotification.FLAG_ONGOING_EVENT
. - Não removíveis e definidas usando
Notification.FLAG_NO_CLEAR
. - Aquelas em que o app para wearables está com a ponte de notificação desativada, como descrito anteriormente.
Práticas recomendadas para notificações em ponte
Leva tempo para enviar ou remover notificações em ponte de um dispositivo wearable. Ao projetar suas notificações, evite comportamentos inesperados causados por essa latência. As diretrizes a seguir garantem que suas notificações em ponte funcionem com as assíncronas:
- Se você cancelar uma notificação no smartphone, talvez leve algum tempo para que ela seja cancelada no relógio. Durante esse período, o usuário pode enviar uma das intents pendentes nessa notificação. Por isso, continue recebendo intents pendentes no app de notificações canceladas. Ao cancelar notificações, mantenha os receptores de intents pendentes dessas notificações válidos.
- Não cancele e acione novamente uma pilha inteira de notificações de uma só vez. Só modifique ou remova as notificações que realmente tiverem sido modificadas. Isso evita a latência na atualização do dispositivo wearable e reduz o impacto do app sobre a duração da bateria.
Considerações sobre design
As notificações do Wear OS têm as próprias diretrizes de design. Para mais informações, leia as Diretrizes de design do Wear OS.