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 un'altra app contenuti e seguire l'utente ovunque vada. Gli utenti possono espandere le bolle per visualizzarle e interagire con i contenuti dell'app, potendo comprimerli quando non a utilizzarli.

Quando il dispositivo è bloccato o il display sempre attivo è attivo, vengono visualizzate delle bolle notifiche normalmente.

Le bolle sono una funzionalità che consente di disattivare la funzionalità. Quando un'app presenta la prima bolla, viene visualizzata una la finestra di dialogo di autorizzazione offre due scelte:

  • Blocca tutte le bolle dall'app. Le notifiche non sono bloccate, ma non vengono mai visualizzati sotto forma di bolle.
  • Consenti tutte le bolle dalla tua app. Tutte le notifiche inviate con BubbleMetaData vengono visualizzati come bolle.

L'API bubble

Le bolle vengono create utilizzando l'API di notifica, quindi invia la notifica come normale. Se vuoi visualizzare la notifica sotto forma di fumetto, allega dati aggiuntivi che le sono assegnati.

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 ridimensionabili e incorporati. Se manca uno di questi requisiti, verrà visualizzata sotto forma di 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ù bolle conversazioni con contatti diversi, l'attività deve poter essere avviata a più istanze. Sui dispositivi con Android 10 e versioni precedenti: le notifiche non vengono mostrate come bolle a meno che non lo imposti esplicitamente Da documentLaunchMode a "always". A partire da Android 11, non è necessario specificare questo valore, perché il sistema imposta automaticamente tutte le conversazioni Da documentLaunchMode a "always".

Per inviare una bolla, procedi nel seguente modo:

  1. Crea una notifica mentre sei cosa succede normalmente.
  2. Chiama il numero BubbleMetadata.Builder(PendingIntent, Icon) o BubbleMetadata.Builder(String) per creare un oggetto BubbleMetadata.
  3. Utilizza le funzionalità di setBubbleMetadata() per aggiungere i metadati alla notifica.
  4. Se scegli come target Android 11 o versioni successive, assicurati che la bolla o la notifica fa 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 il fumetto viene sempre visualizzato, a meno che l'utente non blocchi bolle o notifiche dalla tua app.

Crea una bolla espansa

Puoi configurare la bolla in modo che venga presentata automaticamente nello stato espanso. Me consiglia di utilizzare questa funzione solo se l'utente esegue un'azione che mostra 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 visualizzata una bolla è stato creato.

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 per la presentazione automatica 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 una bolla viene espansa, l'attività dei contenuti passa attraverso la normale procedura. ciclo di vita, con conseguente dell'applicazione diventando un processo in primo piano, se non lo è già.

Quando il fumetto viene compresso o ignorato, l'attività viene eliminata. Questo potrebbe determinare se il processo viene memorizzato nella cache e poi interrotto, a seconda che il all'app sono in esecuzione altri componenti in primo piano.

Quando vengono visualizzate le bolle

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

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

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

Avvio delle attività dalle bolle

Quando un fumetto lancia una nuova attività, quest'ultima viene avviata all'interno della stessa attività e nella stessa finestra con i bolle 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. Usa il contesto dell'attività per avviare gli intent, activity.startActivity(intent) e 1. Non impostare il flag FLAG_ACTIVITY_NEW_TASK per l'intent.

Altrimenti, la nuova attività viene avviata in una nuova attività e il fumetto viene visualizzato compressi.

Tieni presente che una bolla rappresenta una conversazione specifica, quindi le attività nel fumetto devono essere correlati a quella conversazione. Inoltre, l'avvio di un'attività all'interno della bolla ne aumenta lo stack di attività nella bolla e potenzialmente complicare l'esperienza utente, in particolare in relazione per la navigazione.

Best practice

  • Invia una notifica sotto forma di fumetto solo se è importante, ad esempio quando è parte di una comunicazione in corso o se l'utente richiede esplicitamente la bolla 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 la bolla, viene visualizzata una notifica a fumetto notifica.
  • Chiama super.onBackPressed durante l'override onBackPressed nel fumetto attività. In caso contrario, il fumetto potrebbe non comportarsi correttamente.

Quando un fumetto compresso riceve un messaggio aggiornato, il fumetto mostra un badge. per indicare un messaggio da leggere. Quando l'utente apre il messaggio nella associata all'app, procedi nel seguente modo:

App di esempio

La Persone l'app di esempio è 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 umani.