Usar balões de notificação para conversas

Os balões de notificação facilitam a participação e a visualização das conversas.

Figura 1. Um balão de conversa.

Elas flutuam sobre o conteúdo de outros apps, e os usuários podem expandir os balões para revelar e interagir com o conteúdo do app, além de recolhê-los quando não estiverem usando.

Quando o dispositivo estiver bloqueado ou a tela estiver no modo sempre ativada, as bolhas vão aparecer como notificações normalmente aparecem.

Os balões de notificação são ativados pelo usuário. Para isso, toque no botão de balão nas notificações que oferecem suporte a esse recurso. Assim, essa conversa específica sempre vai aparecer. Nas configurações, os usuários podem ajustar quais chats foram transformados em balões ou modificar as configurações do app em geral.

Os usuários podem:

  • Bloquear todos os balões de notificação do seu app. As notificações não são bloqueadas, mas nunca aparecem como balões.
  • Permitir balões de notificação selecionados do app. As notificações que aparecem usando o botão de balão são "selecionadas".
  • Permitir todos os balões de notificação do seu app. Todas as notificações enviadas com BubbleMetadata aparecem como balões.

API Notification Bubble

Os balões de notificação são criados usando a API Notification. Se você quiser que sua notificação apareça como um balão, anexe dados extras a ela.

A exibição expandida da bolha é criada a partir de uma atividade escolhida por você. Configure a atividade para que ela apareça corretamente como um balão. A atividade precisa ser redimensionável e incorporada. Se algum desses requisitos não for atendido, o sistema vai mostrar como uma notificação.

O código a seguir demonstra como implementar uma bolha:

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>

Se o app mostrar várias bolhas do mesmo tipo, como várias conversas de chat com contatos diferentes, a atividade precisa ser capaz de iniciar várias instâncias. Em dispositivos com Android 10 e versões anteriores, as notificações não são mostradas como balões, a menos que você defina documentLaunchMode explicitamente como "always". A partir do Android 11, não é necessário definir explicitamente esse valor, já que o sistema define de forma automática todas as conversas de documentLaunchMode para "always".

Para enviar uma bolha de notificação, siga estas etapas:

  1. Crie uma notificação como de costume.
  2. Chame BubbleMetadata.Builder(PendingIntent, Icon) ou BubbleMetadata.Builder(String) para criar um objeto BubbleMetadata.
  3. Use setBubbleMetadata() para adicionar os metadados à notificação.
  4. Se o app for direcionado ao Android 11 (nível 30 da API) ou versões mais recentes, verifique se os metadados ou a notificação do balão se referem a um atalho de compartilhamento.
  5. Modifique o app para não cancelar notificações que aparecem como balões. Ao cancelar uma notificação, o balão é removido da tela. Abrir uma bolha oculta automaticamente a notificação associada a ela.

Essas etapas são mostradas no exemplo a seguir:

  // Create a bubble intent.
  val target = Intent(context, BubbleActivity::class.java)
  val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)
  val category = "com.example.category.IMG_SHARE_TARGET"

  val chatPartner = Person.Builder()
      .setName("Chat partner")
      .setImportant(true)
      .build()

  // Create a sharing shortcut.
  val shortcutId = generateShortcutId()
  val shortcut =
     ShortcutInfo.Builder(context, shortcutId)
         .setCategories(setOf(category))
         .setIntent(Intent(Intent.ACTION_DEFAULT))
         .setLongLived(true)
         .setShortLabel(chatPartner.name)
         .build()

  // Create a bubble metadata.
  val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent,
              Icon.createWithResource(context, R.drawable.icon))
      .setDesiredHeight(600)
      .build()

  // Create a notification, referencing the sharing shortcut.
  val builder = Notification.Builder(context, CHANNEL_ID)
      .setContentIntent(contentIntent)
      .setSmallIcon(smallIcon)
      .setBubbleMetadata(bubbleData)
      .setShortcutId(shortcutId)
      .addPerson(chatPartner)

Se o app estiver em primeiro plano quando uma bolha for enviada, a importância será ignorada, e a bolha será sempre mostrada, a menos que o usuário bloqueie bolhas ou notificações do app.

Criar um balão expandido

Você pode configurar sua bolha para que ela seja automaticamente exibida no estado expandido. Recomendamos que esse recurso só seja usado se o usuário executar uma ação que resulte em uma bolha, como tocar em um botão para iniciar um novo chat. Nesse caso, também faz sentido suprimir a notificação inicial enviada quando um balão é criado.

Há métodos que podem ser usados para definir flags que ativem esses comportamentos: setAutoExpandBubble() e setSuppressNotification().

O exemplo a seguir mostra como configurar uma bolha para que ela seja automaticamente apresentada em um estado expandido:

  val bubbleMetadata = Notification.BubbleMetadata.Builder()
      .setDesiredHeight(600)
      .setIntent(bubbleIntent)
      .setAutoExpandBubble(true)
      .setSuppressNotification(true)
      .build()

Ciclo de vida do conteúdo do balão

Quando uma bolha é expandida, a atividade de conteúdo passa pelo ciclo de vida de processo normal, resultando na transformação do app em um processo em primeiro plano, se esse ainda não for o caso.

Quando o balão é recolhido ou dispensado, a atividade é destruída. Isso pode fazer com que o processo seja armazenado em cache e, posteriormente, interrompido se o app tiver outros componentes sendo executados em primeiro plano.

Quando as bolhas aparecem

Para reduzir as interrupções do usuário, os balões só aparecem em determinadas circunstâncias.

Se um app for direcionado ao Android 11 (nível 30 da API) ou a versões mais recentes, uma notificação não aparecerá como um balão a menos que atenda aos requisitos de conversa. Se um app for direcionado ao Android 10 (nível 29 da API) ou versões anteriores, a notificação vai aparecer como um balão somente se uma ou mais das seguintes condições forem atendidas:

Se nenhuma dessas condições for atendida, a notificação será exibida em vez de um balão.

Como iniciar atividades em balões

Quando um balão inicia uma nova atividade, ela é iniciada na mesma tarefa e na mesma janela de balão ou em uma nova tarefa em tela cheia, recolhendo o balão que a iniciou.

Para iniciar uma nova atividade na mesma tarefa do balão: 1. Use o contexto de atividade ao iniciar intents, activity.startActivity(intent) e 1. Não defina a flag FLAG_ACTIVITY_NEW_TASK na intent.

Caso contrário, a nova atividade será iniciada em uma nova tarefa e o balão será encolhido.

Um balão representa uma conversa específica. Portanto, as atividades iniciadas nele precisam estar relacionadas a essa conversa. Além disso, iniciar uma atividade dentro da bolha aumenta a pilha de tarefas dela e pode complicar a experiência do usuário, principalmente em relação à navegação.

Práticas recomendadas

  • Envie uma notificação como um balão apenas se ela for importante, como quando ela faz parte de uma comunicação em andamento ou se o usuário pedir explicitamente um balão para um conteúdo. Os balões ocupam espaço na tela e cobrem o conteúdo de outros apps.
  • Verifique se a notificação em balão também funciona como uma notificação normal. Quando o usuário desativa o balão, uma notificação em balão é mostrada como uma notificação normal.
  • Use o elemento combinável BackHandler e vincule o parâmetro enabled ao estado da interface para que ele intercepte as ações de voltar apenas quando necessário. Quando o manipulador se desativa, o balão se recolhe.

Quando um balão recolhido recebe uma mensagem atualizada, ele mostra um ícone de selo para indicar uma mensagem não lida. Quando o usuário abrir a mensagem no app associado, siga estas etapas:

App de exemplo

O app de exemplo SociaLite é um app de conversa que usa balões. Para fins de demonstração, este app usa chatbots. Em aplicativos reais, use balões para mensagens enviadas por humanos.