Utilizzare le bolle per consentire agli utenti di partecipare alle conversazioni

Le bolle consentono agli utenti di vedere e partecipare più facilmente alle conversazioni.

Figura 1. Una bolla della chat.

Le bolle sono integrate nel sistema di notifica. Fluttuano sopra altri contenuti dell'app e seguono l'utente ovunque vada. Gli utenti possono espandere le bolle per visualizzare le funzionalità e le informazioni dell'app e possono comprimerle quando non le usano.

Quando il dispositivo è bloccato o la funzionalità Display sempre attivo è attiva, vengono visualizzate delle bolle come di consueto per le notifiche.

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

  • Blocca tutti i fumetti dall'app. Le notifiche non sono bloccate, ma non vengono mai visualizzate come bolle.
  • Consenti tutte le bolle dalla 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 la notifica come di consueto. Se vuoi visualizzare la notifica sotto forma di fumetto, allegaci altri dati.

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

Il seguente codice mostra come implementare un semplice fumetto:

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

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

Per inviare una bolla, procedi nel seguente modo:

  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 del fumetto 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 inviato un fumetto, l'importanza viene ignorata e il fumetto viene sempre visualizzato, a meno che l'utente non blocchi le bolle o le notifiche dell'app.

Crea una bolla espansa

Puoi configurare la bolla in modo che venga presentata automaticamente nello 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 anche senso eliminare la notifica iniziale inviata quando viene creata una bolla.

Esistono dei metodi che puoi utilizzare per impostare i flag che abilitano 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 in bolle

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

Quando il fumetto viene compresso o ignorato, l'attività viene eliminata. Di conseguenza, il processo potrebbe essere memorizzato nella cache e successivamente arrestato, a seconda che l'app abbia o meno altri componenti in primo piano in esecuzione.

Quando vengono visualizzate le bolle

Per ridurre le interruzioni per l'utente, i fumetti vengono visualizzati solo in determinate circostanze.

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

Se nessuna di queste condizioni è soddisfatta, viene visualizzata la notifica al posto di un fumetto.

best practice

  • Invia una notifica sotto forma di fumetto solo se è importante, ad esempio se fa parte di una comunicazione in corso o se l'utente richiede esplicitamente la bolla per i contenuti. Le bolle utilizzano lo spazio sullo schermo e coprono altri contenuti dell'app.
  • Assicurati che la notifica in bolla funzioni anche come una normale notifica. Quando l'utente disattiva il fumetto, viene visualizzata una notifica a bolle come normale notifica.
  • Fai in modo che le funzionalità siano il più specifiche e leggere possibile. I processi che si avviano da una bolla, come attività e finestre di dialogo, vengono visualizzati all'interno del contenitore a bolle. Ciò significa che una bolla può avere uno stack di attività. Le cose possono complicarsi se il fumetto contiene molte funzionalità o 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 un fumetto compresso riceve un messaggio aggiornato, il fumetto mostra un'icona con un 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 People è una semplice app di conversazione che utilizza le bolle. A scopo dimostrativo, questa app utilizza chatbot. Nelle applicazioni reali, le bolle devono essere utilizzate solo per i messaggi da parte di persone, non di bot.