Utilizzare le bolle per consentire agli utenti di partecipare alle conversazioni

Grazie alle bolle, per gli utenti è più facile vedere le conversazioni e partecipare.

Figura 1. Un fumetto per la chat.

Le bolle sono integrate nel sistema di notifica. Galleggiano sopra altri contenuti dell'app e seguono l'utente ovunque si trovi. Gli utenti possono espandere i fumetti per mostrare funzionalità e informazioni sull'app e possono comprimerli quando non li utilizzano.

Quando il dispositivo è bloccato o la modalità schermo sempre acceso è attiva, vengono visualizzate le bolle come normalmente avviene per le notifiche.

Le bolle sono una funzionalità che consente di disattivare gli annunci. Quando un'app presenta il primo fumetto, la finestra di dialogo delle autorizzazioni offre due opzioni:

  • Blocca tutte le bolle dell'app. Le notifiche non sono bloccate, ma non vengono mai visualizzate come bolle.
  • Consenti tutte le bolle della tua app. Tutte le notifiche inviate con BubbleMetaData vengono visualizzate come bolle.

L'API bubble

Le bolle vengono create tramite l'API di notifica, quindi invia le notifiche normalmente. Se desideri che la notifica venga visualizzata come fumetto, allega eventuali dati aggiuntivi.

La visualizzazione espansa di una bolla viene creata da un'attività scelta da te. Configura l'attività in modo che venga visualizzata correttamente come fumetto. L'attività deve essere ridimensionabile e incorporata. Se non ha uno di questi requisiti, viene visualizzata una notifica.

Il seguente codice mostra come implementare un fumetto semplice:

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

Se la tua app mostra più bolle dello stesso tipo, ad esempio più conversazioni in chat con contatti diversi, l'attività deve poter avviare più istanze. Sui dispositivi con Android 10 e versioni precedenti, le notifiche non vengono visualizzate come bolle, a meno che non imposti esplicitamente documentLaunchMode su "always". A partire da Android 11, non è necessario impostare esplicitamente questo valore, poiché il sistema imposta automaticamente documentLaunchMode di tutte le conversazioni su "always".

Per inviare una bolla:

  1. Crea una notifica come fai normalmente.
  2. Chiama BubbleMetadata.Builder(PendingIntent, Icon) o BubbleMetadata.Builder(String) per creare un oggetto BubbleMetadata.
  3. Utilizza setBubbleMetadata() per aggiungere i metadati alla notifica.
  4. Se scegli come target Android 11 o versioni successive, assicurati che i metadati delle bolle o la notifica facciano riferimento a una scorciatoia per la condivisione.

Questi passaggi sono mostrati nell'esempio seguente:

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 la tua app è in primo piano quando viene inviata una bolla, l'importanza viene ignorata e la bolla viene sempre mostrata, a meno che l'utente non blocchi bolle o notifiche dalla tua app.

Creare una bolla espansa

Puoi configurare il fumetto in modo che venga presentato automaticamente in stato espanso. Ti consigliamo di utilizzare questa funzionalità solo se l'utente esegue un'azione che genera una bolla, ad esempio toccare un pulsante per avviare una nuova chat. In questo caso, ha senso anche eliminare la notifica iniziale inviata quando viene creata una bolla.

Puoi utilizzare dei metodi per impostare flag che attivano questi comportamenti: setAutoExpandBubble() e setSuppressNotification().

L'esempio seguente mostra come configurare una bolla in modo che venga presentata automaticamente in uno stato espanso:

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 di vita dei contenuti delle bolle

Quando una bolla si espande, l'attività relativa ai contenuti passa attraverso il normale ciclo di vita del processo e, se non lo è già, l'applicazione diventa un processo in primo piano.

Quando la bolla viene compressa o chiusa, l'attività viene eliminata. Di conseguenza, il processo potrebbe essere memorizzato nella cache e successivamente interrotto, a seconda che l'app abbia altri componenti in primo piano in esecuzione.

Quando vengono visualizzate le bolle

Per ridurre le interruzioni per l'utente, le bolle vengono visualizzate solo in determinate circostanze.

Se un'app ha come target Android 11 o versioni successive, una notifica non viene visualizzata come fumetto a meno che non soddisfi i requisiti per le conversazioni. Se un'app ha come target Android 10 o versioni precedenti, la notifica viene visualizzata come fumetto solo se vengono soddisfatte una o più delle seguenti condizioni:

Se nessuna di queste condizioni è soddisfatta, viene visualizzata la notifica anziché un bolla.

Best practice

  • Invia una notifica come fumetto solo se è importante, ad esempio se fa parte di una comunicazione in corso o se l'utente richiede esplicitamente un fumetto per i contenuti. Le bolle sfruttano lo spazio sullo schermo e coprono altri contenuti dell'app.
  • Assicurati che la notifica a bolle funzioni anche come notifica normale. Quando l'utente disattiva la bolla, viene visualizzata una notifica a bolle come normale notifica.
  • Mantieni la funzionalità più specifica e leggera possibile. I processi che vengono avviati da una bolla, ad esempio attività e finestre di dialogo, vengono visualizzati all'interno del contenitore delle bolle. Ciò significa che una bolla può avere uno stack di attività. Le cose possono complicarsi se il fumetto contiene molte funzionalità o molte opzioni di navigazione.
  • Richiama super.onBackPressed quando esegui l'override di onBackPressed nell'attività bolla. In caso contrario, il fumetto potrebbe non comportarsi correttamente.

Quando una bolla compressa riceve un messaggio aggiornato, mostra un'icona a forma di badge per indicare un messaggio da leggere. Quando l'utente apre il messaggio nell'app associata, segui questi passaggi:

App di esempio

L'app di esempio Persone è una semplice app di conversazione che utilizza le bolle. A scopo dimostrativo, questa app utilizza i chatbot. In applicazioni reali, le bolle devono essere usate solo per i messaggi da persone, non dai bot.