Balões

Os balões permitem que os usuários executem várias tarefas no dispositivo com facilidade. Eles foram projetados como uma alternativa ao uso de SYSTEM_ALERT_WINDOW.

Os balões são integrados ao sistema de notificações. Eles flutuam sobre o conteúdo de outros apps e seguem o usuário em qualquer tela que ele abra. Os balões podem ser expandidos para revelar funcionalidades e informações do app e podem ser recolhidos quando não estiverem sendo usados.

Quando o dispositivo estiver bloqueado ou a tela estiver no estado de sempre ativada, os balões serão exibidos da mesma forma que uma notificação seria.

"Balões" é um recurso que pode ser desativado. Quando um app apresenta o primeiro balão, uma caixa de diálogo de permissões é exibida, oferecendo duas opções:

  • Bloquear todos os balões do seu app: as notificações não são bloqueadas, mas nunca aparecerão como balões.
  • Permitir todos os balões do app: todas as notificações enviadas com BubbleMetaData aparecerão como balões.

API Bubble

Os balões são criados por meio da API Notification, e a notificação é enviada normalmente. Se você quiser que ela apareça como um balão, será necessário anexar alguns dados extras à notificação.

A exibição expandida de um balão é criada a partir de uma atividade escolhida por você. A atividade precisa estar configurada para ser exibida corretamente como um balão. A atividade precisa ser redimensionável, incorporada e sempre ser iniciada no modo de IU do documento. Se algum desses requisitos não for atendido, ela será exibida como uma notificação.

O código a seguir demonstra como implementar um balão simples:

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

Se seu app exibe vários balões do mesmo tipo, como várias conversas por chat com diferentes contatos, a atividade precisa ser capaz de iniciar várias instâncias. Defina documentLaunchMode como "sempre".

Para enviar um balão, siga estas etapas:

Kotlin

// Create bubble intent
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)

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

// Create notification
val chatBot = Person.Builder()
    .setBot(true)
    .setName("BubbleBot")
    .setImportant(true)
    .build()

val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .addPerson(chatBot)

Java

// Create bubble intent
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

// Create bubble metadata
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIcon(Icon.createWithResource(context, R.drawable.icon))
        .setIntent(bubbleIntent)
        .build();

// Create notification
Person chatBot = new Person.Builder()
        .setBot(true)
        .setName("BubbleBot")
        .setImportant(true)
        .build();

Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .addPerson(chatBot);

Se seu app estiver em primeiro plano quando um balão for enviado, a importância será ignorada, e seu balão será sempre exibido, a menos que o usuário tenha bloqueado balões ou notificações do app.

Como criar um balão expandido

Você pode configurar sua bolha para que ela seja automaticamente exibida no estado expandido. Recomendamos que essa funcionalidade só seja utilizada se o usuário executar uma ação que resulte na exibição de uma bolha, como tocar em um botão para iniciar um novo bate-papo. 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 ativem esses comportamentos: setAutoExpandBubble() e setSuppressNotification().

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 do 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 os balões são exibidos

Para reduzir a quantidade de interrupções para o usuário, os balões aparecerão apenas se uma ou mais destas condições forem atendidas:

Se nenhuma dessas situações for verdadeira, somente a notificação será exibida.

Práticas recomendadas

  • Os balões ocupam espaço na tela e cobrem o conteúdo de outros apps. Só envie uma notificação como um balão se ela for importante o suficiente, por exemplo, no caso de comunicações em andamento ou se o usuário pedir explicitamente a exibição de um balão para determinado conteúdo.
  • O balão pode ser desativado pelo usuário. Nesse caso, uma notificação em balão será exibida como uma notificação normal. Sempre verifique se a notificação em balão também funciona como uma notificação normal.
  • Os processos iniciados em um balão, como atividades e diálogos, aparecem dentro do contêiner de balão. Isso significa que um balão pode ter uma pilha de tarefas. Os processos poderão se complicar se houver muitas opções de funcionalidades ou navegação dentro do balão. Recomendamos que você mantenha a funcionalidade o mais leve e específica possível.