Os balões de notificação facilitam a visualização e a participação dos usuários em conversas.
Eles 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 poderem recolhê-los quando não estiverem em uso.
Quando o dispositivo está bloqueado ou a tela sempre ativada está ativa, os balões aparecem como notificações normalmente.
Os balões de notificação são ativados pelo usuário. Para isso, basta tocar no botão de balão nas notificações que oferecem suporte a esse recurso. Isso permite que esse chat específico sempre apareça como balão. 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:
- Bloqueia todos os balões de notificação do app. As notificações não são bloqueadas, mas nunca aparecem como balões.
- Permita balões de notificação selecionados do seu app. As notificações em balão 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
BubbleMetadataaparecem como balões.
API Balão de Notificação
Os balões de notificação são criados usando a API de notificação. Se você quiser que a notificação apareça como um balão, anexe dados extras a ela.
A visualização expandida do balão é criada com base em uma atividade que você escolhe. Configure a atividade para que ela apareça corretamente como um balão. A atividade precisa ser redimensionável e incorporada. Se não tiver um desses requisitos, o sistema vai mostrar o alerta como uma notificação.
O código a seguir demonstra como implementar um balão:
<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ários balões 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 o Android 10 e versões anteriores,
as notificações não são mostradas como balões, a menos que você defina explicitamente
documentLaunchMode como
"always". A partir do Android 11, não é necessário definir esse valor explicitamente, já que o sistema define automaticamente o documentLaunchMode de todas as conversas
como "always".
Para enviar um balão de notificação, siga estas etapas:
- Crie uma notificação como você faria normalmente.
- Chame
BubbleMetadata.Builder(PendingIntent, Icon)ouBubbleMetadata.Builder(String)para criar um objetoBubbleMetadata. - Use
setBubbleMetadata()para adicionar os metadados à notificação. - Se o app for direcionado ao Android 11 (nível 30 da API) ou versões mais recentes, verifique se os metadados do balão ou a notificação fazem referência a um atalho de compartilhamento.
- Modifique o app para não cancelar as notificações que aparecem como balões. O cancelamento de uma notificação remove o balão da tela. Abrir um balão oculta automaticamente a notificação associada a ele.
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, PendingIntent.FLAG_IMMUTABLE /* 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 = ShortcutInfoCompat.Builder(context, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel("Chat partner name") .build() // Publish the shortcut, otherwise the bubble metadata will not apply. ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) // Create a bubble metadata. val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent, IconCompat.createWithResource(context, R.drawable.ic_logo)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.chat) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Se o app estiver em primeiro plano quando um balão for enviado, a importância será ignorada e o balão será sempre mostrado, a menos que o usuário bloqueie balões 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 usar esse recurso apenas se o usuário realizar uma ação que resulte em um balão, 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 ativam esses comportamentos:
setAutoExpandBubble()
e
setSuppressNotification().
O exemplo a seguir mostra como configurar um balão para que ele seja apresentado automaticamente em um estado expandido:
val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Ciclo de vida do conteúdo do balão
Quando um balão é aberto, a atividade de conteúdo passa pelo ciclo de vida do processo normal, resultando no aplicativo se tornando um processo em primeiro plano, caso ainda não seja.
Quando o balão é recolhido ou dispensado, a atividade é destruída. Isso pode fazer com que o processo seja armazenado em cache e encerrado posteriormente, dependendo se o app tem outros componentes em primeiro plano em execução.
Quando as bolhas aparecem
Para reduzir as interrupções para o 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 versões mais recentes, uma notificação não vai aparecer como um balão, a menos que atenda aos requisitos de conversa. Se um app for destinado ao Android 10 (nível 29 da API) ou versões anteriores, a notificação vai aparecer como um balão apenas se uma ou mais das seguintes condições forem atendidas:
- A notificação usa
MessagingStylee tem umPersonadicionado. - A notificação é de uma chamada para
Service.startForeground, tem umcategorydeCATEGORY_CALLe tem umPersonadicionado. - O app está em primeiro plano quando a notificação é enviada.
Se nenhuma dessas condições for atendida, a notificação será mostrada 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 do balão ou em uma nova tarefa em tela cheia, o que fecha o balão que a iniciou.
Para iniciar uma nova atividade na mesma tarefa que o balão:
1. Use o contexto da 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á recolhido.
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 do balão aumenta a pilha de tarefas dele e pode complicar a experiência do usuário, especificamente em relação à navegação.
Práticas recomendadas
- Envie uma notificação como um balão apenas se ela for importante, como quando faz parte de uma comunicação em andamento ou se o usuário solicitar explicitamente um balão para o conteúdo. Os balões usam 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 de balão é mostrada como uma notificação normal.
- Use o elemento combinável
BackHandlere vincule o parâmetroenabledao estado da interface para que ele intercepte os gestos de voltar apenas quando necessário. Depois que o gerenciador se desativa, o balão é recolhido.
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:
- Atualize o
BubbleMetadatapara suprimir a notificação. ChameBubbleMetadata.Builder.setSuppressNotification(). Isso remove o ícone de selo para indicar que o usuário interagiu com a mensagem. - Defina
Notification.Builder.setOnlyAlertOnce()comotruepara suprimir o som ou a vibração que acompanha a atualização deBubbleMetadata.
App de exemplo
O app de exemplo SociaLite é um app de conversação que usa balões. Para fins de demonstração, este app usa chatbots. Em aplicativos reais, use balões para mensagens de humanos.