The Android Developer Challenge is back! Submit your idea before December 2.

"Modo bridge" para notificações no Wear

Por padrão, é aplicada ponte (compartilhamento) das notificações de um app em um smartphone complementar para um smartwatch pareado. Se você criar um app de smartwatch independente e tiver um app de smartphone complementar, os apps podem duplicar as notificações. O Wear OS by Google inclui recursos para processar esse problema de notificações duplicadas.

Confira os seguintes recursos relacionados:

Observação: você pode usar o Firebase Cloud Messaging (FCM) para enviar alertas de notificação aos dispositivos. Consulte Envolva seus usuários no Android, no iOS e no Chrome.

Os desenvolvedores podem alterar o comportamento de notificações com um ou mais dos seguintes procedimentos:

  • Especificar uma configuração de ponte no arquivo manifest.
  • Especificar uma configuração de ponte no tempo de execução.
  • Definir um código de dispensa para que o ato de dispensar notificações seja sincronizado nos dispositivos.

Especificar uma configuração de ponte no arquivo manifest

O arquivo manifest de um app Android pode indicar que as notificações do app de smartphone correspondente não podem ser ligadas por ponte ao smartwatch. Mais especificamente, para impedir a ponte de notificações de um app de smartphone, você pode usar uma entrada <meta-data> no arquivo manifest do app de smartwatch (por exemplo, o app de smartwatch independente), da seguinte maneira:

    com.google.android.wearable.notificationBridgeMode
    

Adicione a entrada <meta-data> como filha do elemento <application>. Defina a entrada como NO_BRIDGING para impedir a ponte:

    <application>
    ...
      <meta-data
        android:name="com.google.android.wearable.notificationBridgeMode"
        android:value="NO_BRIDGING" />
    ...
    </application>
    

O comportamento de ponte padrão ocorre se você não incluir a entrada <meta-data> ou se você especificar um valor de BRIDGING em vez de NO_BRIDGING.

A configuração de ponte que é definida no arquivo manifest entra em vigor assim que o app de smartwatch é instalado.

Especificar uma configuração de ponte no tempo de execução

Você pode usar o recurso "modo bridge" para especificar uma configuração de ponte no tempo de execução. Mais especificamente, use a classe BridgingManager.

Você pode definir um "modo bridge" e, se quiser, definir tags para notificações isentas desse modo, usando um objeto BridgingManager. Mais especificamente, criar um objeto BridgingConfig e defini-lo como exibido nessa seção.

Especificar uma configuração de ponte no tempo de execução modifica uma configuração relacionada à ponte no arquivo manifesto do Android.

Desativar a ponte para todas as notificações

Você pode desativar a ponte para todas as notificações da seguinte maneira:

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false).build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .build());
    

Se a configuração acima não for definida, o modo bridge será definido por padrão como verdadeiro.

Notificações isentas que são marcadas com tag

Você pode desativar a ponte para todas as notificações, exceto as que tenham tags específicas.

Por exemplo, você pode desativar a ponte para todas as notificações que não estejam marcadas com as tags foo, bar ou baz.

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTags(listOf("foo", "bar", "baz"))
                    .build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTags(Arrays.asList("foo", "bar", "baz"))
        .build());
    

Ou você pode excluir notificações com tags específicas (como foo ou bar):

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTag("foo")
                    .addExcludedTag("bar")
                    .build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTag("foo")
        .addExcludedTag("bar")
        .build());
    

Definir uma tag de ponte

Uma tag de ponte pode ser definida em uma notificação por meio do método setBridgeTag(String), da seguinte maneira:

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setBridgeTag("foo")
            )
            .build()
    

Java

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId)
    // ... set other fields ...
      .extend(
        new NotificationCompat.WearableExtender()
          .setBridgeTag("foo"));
      Notification notification = notificationBuilder.build();
    

Impedir a ponte em um app existente

Em um app já existente, pode ser que você já tenha desativado a ponte para quando um smartphone não está conectado no momento em que o alerta é recebido. Nesse caso, você ainda pode querer dispensar a notificação nos outros dispositivos quando ela for dispensada em um app de smartwatch.

Uma forma de evitar a ponte é com a classe Notification.Builder. Especifique true no método setLocalOnly.

No entanto, essa forma de impedir a ponte pode não ser a mais indicada. Por exemplo, se o usuário instalar um app de smartphone, mas não o app de smartwatch correspondente, o método setLocalOnly pode impedir a ponte de notificações úteis. Além disso, os usuários podem ter vários smartwatches pareados, e o app de pode não estar instalado em todos eles.

Usar o código de dispensa para sincronizar as dispensas de notificação

Se você impedir a ponte com o Recurso "modo bridge", as dispensas (cancelamentos) de notificações não serão sincronizadas nos dispositivos do usuário. Porém, os seguintes métodos da classe NotificationCompat.WearableExtender permitem que você use IDs de dispensa:

Kotlin

    fun setDismissalId(dismissalId: String): WearableExtender
    fun getDismissalId(): String
    

Java

    public WearableExtender setDismissalId(String dismissalId)
    public String getDismissalId()
    

Para permitir que uma dispensa seja sincronizada, use o método setDismissalId(). Para cada notificação, passe um ID globalmente exclusivo, como uma string, ao chamar o método setDismissalId(). Quando a notificação é dispensada, todas as outras notificações com o mesmo ID são dispensadas nos smartwatches e no smartphone complementar. 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:

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setDismissalId("abc123")
            )
            .build()
    

Java

    NotificationCompat.WearableExtender wearableExtender =
      new NotificationCompat.WearableExtender().setDismissalId("abc123");
    Notification notification = new NotificationCompat.Builder(context)
    // ... set other fields ...
      .extend(wearableExtender)
      .build();
    

Os códigos de dispensa funcionam se um smartwatch estiver pareado com um smartphone Android, mas não se estiver pareado com um iPhone.

Práticas recomendadas para notificações em ponte

Notificações em ponte demoram algum tempo para serem enviadas ou removidas de um dispositivo wearable. Ao projetar suas notificações, evite comportamentos inesperados causados por essa latência. As instruções abaixo ajudarão você a garantir que as notificações em ponte funcionem com notificações assíncronas:

  • Se você cancelar uma notificação pelo smartphone, pode levar algum tempo para que a notificação correspondente seja cancelada no smartwatch. Durante esse período, o usuário poderia enviar um dos intents pendentes nessa notificação. Por isso, o app precisa estar preparado para receber intents pendentes de notificações canceladas. Assim, ao cancelar notificações, você precisa manter válidos os destinatários do intent pendente dessas notificações.
  • Não cancele nem reative uma pilha inteira de notificações de uma só vez. Só modifique ou remova as notificações que realmente foram 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 o design

As notificações do Wear OS têm as próprias diretrizes de design. Para mais informações, consulte a página do Material Design (link em inglês).

  • Todas as notificações em ponte do smartphone pareado ao dispositivo Wear usam notificações expandidas.
  • Para saber quando usar os diferentes modelos de notificação compatíveis com o Wear OS, leia o guia de design Padrões de notificação (link em inglês).
  • Para saber como mudar o estilo das notificações do Wear, leia o guia de design Estilo de notificações (link em inglês).
  • Se você tem um app de mensagens de chat, as notificações precisam usar NotificationCompat.MessagingStyle. O Wear usa as mensagens de chat incluídas em uma notificação MessagingStyle (consulte addMessage()) para oferecer uma boa experiência de app de chat na notificação expandida.
  • Adicione uma ação in-line (setHintDisplayActionInline(true)) dentro do stream de notificações para incluir uma ação principal em que o usuário possa aceitar rapidamente uma notificação. Exemplos de bons casos de uso para uma ação in-line em um stream de notificações incluem responder a uma mensagem de texto, interromper uma atividade de condicionamento físico ou arquivar uma mensagem de e-mail.
  • Ative o recurso "Resposta inteligente" (setAllowGeneratedReplies(true)) para suas notificações MessagingStyle.