Utilizzare le bolle di notifica per le conversazioni

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

Figura 1. Una bolla di chat.

Fluttuano sopra gli altri contenuti dell'app e gli utenti possono espandere le bolle per visualizzare e interagire con i contenuti dell'app, nonché comprimerle quando non le utilizzano.

Quando il dispositivo è bloccato o la funzionalità Always On Display è attiva, le bolle vengono visualizzate come le notifiche normali.

Le bolle di notifica vengono attivate dall'utente. Per farlo, può toccare il pulsante della bolla nelle notifiche che le supportano. In questo modo, la chat specifica viene sempre visualizzata come bolla. Nelle impostazioni, gli utenti possono modificare le chat che hanno visualizzato come bolle o le impostazioni dell'app in generale.

Gli utenti possono:

  • Bloccare tutte le bolle di notifica della tua app. Le notifiche non vengono bloccate, ma non vengono mai visualizzate come bolle.
  • Consentire le bolle di notifica selezionate della tua app. Le notifiche visualizzate come bolle utilizzando il pulsante della bolla sono "selezionate".
  • Consentire tutte le bolle di notifica della tua app. Tutte le notifiche inviate con BubbleMetadata vengono visualizzate come bolle.

L'API delle bolle di notifica

Le bolle di notifica vengono create utilizzando l'API delle notifiche. Se vuoi che la notifica venga visualizzata come una bolla, devi allegare dati aggiuntivi.

La visualizzazione espansa della bolla viene creata da un'attività che scegli. Configura l'attività in modo che venga visualizzata correttamente come una bolla. L'attività deve essere ridimensionabile e incorporata. Se manca uno di questi requisiti, il sistema la visualizza come notifica.

Il seguente codice mostra come implementare una bolla:

<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 di 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 visualizzate come bolle, a meno che tu 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 di notifica:

  1. Crea una notifica come di consueto.
  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 hai come target Android 11 o versioni successive, assicurati che i metadati della bolla o la notifica facciano riferimento a una scorciatoia per la condivisione.
  5. Modifica l'app in modo che non annulli le notifiche visualizzate come bolle. Per verificare se l'attività di notifica viene avviata come una bolla, chiama Activity#isLaunchedFromBubble(). L'annullamento di una notifica rimuove la bolla dallo schermo. L'apertura di una bolla nasconde automaticamente la notifica associata.

Questi passaggi sono illustrati 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 le bolle o le notifiche della tua app.

Creare 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 toccando un pulsante per avviare una nuova chat. In questo caso, è anche opportuno eliminare la notifica iniziale inviata quando viene creata una bolla.

Esistono 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 delle bolle

Quando una bolla viene espansa, l'attività dei contenuti segue il normale ciclo di vita del processo, di conseguenza l' applicazione diventa un processo in primo piano, se non lo è già.

Quando la bolla viene compressa o chiusa, l'attività viene eliminata. Di conseguenza, il processo potrebbe essere memorizzato nella cache e successivamente terminato, 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 una bolla a meno che non soddisfi i requisiti della conversazione. Se un'app ha come target Android 10 o versioni precedenti, la notifica viene visualizzata come una bolla solo se è soddisfatta una o più delle seguenti condizioni:

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

Avviare attività dalle bolle

Quando una bolla avvia una nuova attività, quest'ultima viene avviata nella stessa attività e nella stessa finestra della bolla oppure in una nuova attività a schermo intero, comprimendo la bolla che l'ha avviata.

Per avviare una nuova attività nella stessa attività della bolla: 1. Utilizza il contesto dell'attività quando avvii gli intent, activity.startActivity(intent), e 1. Non impostare il flag FLAG_ACTIVITY_NEW_TASK sull'intent.

In caso contrario, la nuova attività viene avviata in una nuova attività e la bolla viene compressa.

Tieni presente che una bolla rappresenta una conversazione specifica, quindi le attività avviate all'interno della bolla devono essere correlate a quella conversazione. Inoltre, l'avvio di un'attività all'interno della bolla aumenta lo stack delle attività della bolla e potrebbe potenzialmente complicare l'esperienza utente, in particolare per quanto riguarda la navigazione.

Best practice

  • Invia una notifica come bolla solo se è importante, ad esempio se fa parte di una comunicazione in corso o se l'utente richiede esplicitamente una bolla per i contenuti. Le bolle utilizzano lo spazio sullo schermo e coprono altri contenuti dell'app.
  • Assicurati che la notifica della bolla funzioni anche come una notifica normale. Quando l'utente disattiva la bolla, una notifica della bolla viene visualizzata come una notifica normale.
  • Chiama super.onBackPressed quando esegui l'override di onBackPressed nell'attività della bolla. In caso contrario, la bolla potrebbe non comportarsi correttamente.

Quando una bolla compressa riceve un messaggio aggiornato, mostra un'icona badge per indicare un messaggio non letto. Quando l'utente apre il messaggio nell'app associata, segui questi passaggi:

App di esempio

L' app di esempio SociaLite è un'app di conversazione che utilizza le bolle. A scopo dimostrativo, questa app utilizza i chatbot. Nelle applicazioni reali, utilizza le bolle per i messaggi inviati da persone.