Os balões permitem que os usuários vejam e participem de conversas com mais facilidade.
Os balões são integrados ao sistema de notificações. Eles flutuam sobre o conteúdo do app e seguem o usuário em qualquer lugar. Os usuários podem expandir os balões para revelar e interagir com o conteúdo do app. Eles podem ser recolhidos quando não estão sendo usados.
Quando o dispositivo está bloqueado ou a tela sempre ativada está ativa, os balões aparecem da mesma forma que as notificações aparecem normalmente.
Os balões são um recurso que pode ser desativado. Quando um app apresenta o primeiro balão, uma caixa de diálogo de permissões oferece duas opções:
- Bloqueie todos os balões do app. As notificações não são bloqueadas, mas nunca aparecem como balões.
- Permitir todos os balões do app. Todas as notificações enviadas com
BubbleMetaData
vão aparecer como balões.
API de balão
Os balões são criados usando a API de notificação. Portanto, envie a notificação normalmente. Se você quiser que sua notificação seja exibida como um balão, anexe dados extras a ela.
A exibição expandida de uma bolha é criada a partir de uma atividade escolhida por você. Configure a atividade para ser exibida corretamente como um balão. A atividade precisa ser redimensionável e incorporada. Se algum desses requisitos não for cumprido, ela será exibida 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"
/>
Caso seu app mostre vários balões do mesmo tipo, como várias conversas
de chat com diferentes contatos, a atividade precisará ser capaz de iniciar
várias instâncias. Em dispositivos com o Android 10 e versões anteriores,
as notificações não aparecem como balões, a menos que você defina explicitamente
documentLaunchMode
como
"always"
. A partir do Android 11, não é necessário definir explicitamente
esse valor, já que o sistema define automaticamente documentLaunchMode
de todas as conversas
como "always"
.
Para enviar uma bolha, siga estas etapas:
- Crie uma notificação como de costume.
- Chame
BubbleMetadata.Builder(PendingIntent, Icon)
ouBubbleMetadata.Builder(String)
para criar um objetoBubbleMetadata
. - Use
setBubbleMetadata()
para adicionar os metadados à notificação. - Se você estiver segmentando o Android 11 ou versões mais recentes, verifique se os metadados do balão ou a notificação fazem referência a um atalho de compartilhamento.
Essas etapas são mostradas no exemplo a seguir:
Kotlin
// 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(mContext, 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)
Java
// Create a bubble intent. Intent target = new Intent(mContext, BubbleActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0 /* flags */); private val CATEGORY_TEXT_SHARE_TARGET = "com.example.category.IMG_SHARE_TARGET" Person chatPartner = new Person.Builder() .setName("Chat partner") .setImportant(true) .build(); // Create a sharing shortcut. private String shortcutId = generateShortcutId(); ShortcutInfo shortcut = new ShortcutInfo.Builder(mContext, shortcutId) .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.getName()) .build(); // Create a bubble metadata. Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create a notification, referencing the sharing shortcut. Notification.Builder builder = new Notification.Builder(mContext, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .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 exibido, a menos que o usuário bloqueie os balões ou as 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 sinalizações que ativam esses comportamentos:
setAutoExpandBubble()
e
setSuppressNotification()
.
O exemplo abaixo mostra como configurar um balão para apresentar automaticamente em um estado expandido:
Kotlin
val bubbleMetadata = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Java
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
Ciclo de vida do conteúdo do balão
Quando um balão é expandido, a atividade de conteúdo passa pelo ciclo de vida do processo normal, resultando em um processo em primeiro plano, caso ainda não esteja.
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 os balões aparecem
Para reduzir as interrupções para o usuário, os balões aparecem apenas em determinadas circunstâncias.
Se um app for direcionado ao Android 11 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 direcionado ao Android 10 ou versões anteriores, a notificação aparecerá como um balão somente se uma ou mais das seguintes condições forem atendidas:
- A notificação usa
MessagingStyle
e tem umPerson
adicionado. - A notificação é de uma chamada para
Service.startForeground
, tem umcategory
deCATEGORY_CALL
e umPerson
foi adicionado. - 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 de balões
Quando um balão inicia uma nova atividade, ela é iniciada dentro da mesma tarefa e da mesma janela em balão ou em uma nova tarefa em tela cheia, fechando 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.
Lembre-se de que um balão representa uma conversa específica. Portanto, as atividades iniciadas dentro dele precisam estar relacionadas a essa conversa. Além disso, iniciar uma atividade dentro do balão aumenta a pilha de tarefas do balão e pode complicar a experiência do usuário, especificamente em relação à navegação.
Práticas recomendadas
- Envie uma notificação no formato de balão somente se ela for importante, por exemplo, quando ela fizer parte de uma comunicação em andamento ou se o usuário solicitar explicitamente um balão de conteúdo. Os balões usam o espaço da tela e cobrem o conteúdo de outros aplicativos.
- 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 aparece como uma notificação normal.
- Chame
super.onBackPressed
ao substituironBackPressed
na atividade do balão. Caso contrário, seu balão pode não se comportar corretamente.
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
BubbleMetadata
para suprimir a notificação. ChameBubbleMetadata.Builder.setSuppressNotification()
. Isso remove o ícone do selo para indicar que o usuário interagiu com a mensagem. - Defina
Notification.Builder.setOnlyAlertOnce()
comotrue
para suprimir o som ou a vibração que acompanha a atualização doBubbleMetadata
.
App de exemplo
O app de exemplo People é 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 enviadas por humanos.