Opções de ponte para notificações

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Por padrão, as notificações são transmitidas em ponte (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, é possível que os usuários recebam notificações duplicadas: uma gerada pelo app para smartphone (em ponte) 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, o app para wearables precisa desativar a ponte de forma programática.

1. No app para dispositivos móveis, usar tags de ponte quando aplicável

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.

Definir uma tag de ponte

Defina uma tag de ponte 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("foo")
    )
    .build()

2. No app para wearables, desativar a ponte

Desativar a ponte para algumas notificações

Você pode desativar dinamicamente a ponte e, se quiser, permitir algumas notificações dependendo da tag delas. Por exemplo, se quiser desativar a ponte para todas as notificações, exceto aquelas marcadas como foo, bar ou baz, use o objeto BridgingConfig conforme mostrado nesta seção.

BridgingManager.fromContext(context).setConfig(
    BridgingConfig.Builder(context, false)
        .addExcludedTags(listOf("foo", "bar", "baz"))
        .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.

3. Definir um ID de dispensa para sincronizar notificações semelhantes no Wear OS e em dispositivos móveis

Se você impedir a ponte com o recurso modo bridge, as dispensas de notificações não vão ser sincronizadas nos dispositivos do usuário.

No entanto, se notificações semelhantes forem criadas tanto no dispositivo móvel quanto no relógio, ainda vai 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 NotificationCompat.WearableExtender tem métodos que permitem usar IDs de dispensa, como 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 com o mesmo ID também são dispensadas nos relógios e no smartphone. Para recuperar um ID de dispensa, use getDismissalId().

No exemplo a seguir, a sincronização de dispensas é ativada porque um ID globalmente exclusivo foi especificado para uma nova notificação:

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

As notificações não são transmitidas em ponte quando são:

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 poderia enviar um dos intents pendentes nessa notificação. Por isso, seu app precisa receber intents pendentes de notificações canceladas. Sendo assim, ao cancelar notificações, garanta que os receptores de intents pendentes dessas notificações continuem 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 garante que o impacto do seu app na duração da bateria seja mínimo.

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.