Le bolle consentono agli utenti di visualizzare e partecipare più facilmente alle conversazioni.
Le bolle sono integrate nel sistema di notifica. Fluttuano sopra i contenuti di altre app e seguono l'utente ovunque vada. Gli utenti possono espandere le bolle per visualizzare e interagire con i contenuti dell'app e possono comprimerle quando non le utilizzano.
Quando il dispositivo è bloccato o la funzionalità Display sempre acceso è attiva, le bolle vengono visualizzate come le notifiche normali.
Le bolle sono una funzionalità disattivabile. Quando un'app presenta la sua prima bolla, una finestra di dialogo per le autorizzazioni offre due opzioni:
- Blocca tutti i fumetti della tua app. Le notifiche non vengono bloccate, ma non vengono mai visualizzate come fumetti.
- Consenti tutti i fumetti della tua app. Tutte le notifiche inviate con
BubbleMetaData
vengono visualizzate come fumetti.
API Bubble
Le bolle vengono create utilizzando l'API Notification, quindi invia la notifica come di consueto. Se vuoi che la notifica venga visualizzata come bolla, allega dati aggiuntivi.
La visualizzazione espansa di una bolla viene creata a partire da un'attività che scegli. Configura l'attività in modo che venga visualizzata correttamente come bolla. L'attività deve essere ridimensionabile e incorporata. Se non soddisfa uno di questi requisiti, viene visualizzato 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, in quanto il sistema imposta automaticamente tutte le conversazioni
documentLaunchMode
su "always"
.
Per inviare una bolla:
- Crea una notifica come faresti normalmente.
- Chiama
BubbleMetadata.Builder(PendingIntent, Icon)
oBubbleMetadata.Builder(String)
per creare un oggettoBubbleMetadata
. - Utilizza
setBubbleMetadata()
per aggiungere i metadati alla notifica. - Se il targeting è Android 11 o versioni successive, assicurati che i metadati della bolla o i riferimenti alle notifiche facciano riferimento a una scorciatoia di condivisione.
- Modifica l'app in modo che non annulli le notifiche visualizzate come fumetti.
Per verificare se l'attività di notifica viene avviata come bolla, chiama
Activity#isLaunchedFromBubble()
. Se annulli una notifica, la bolla viene rimossa dallo schermo. L'apertura di una bolla nasconde automaticamente la notifica associata.
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 le bolle o le notifiche della tua app.
Creare una bolla espansa
Puoi configurare la bolla in modo che venga visualizzata 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, è opportuno anche eliminare la notifica iniziale inviata quando viene creata una bolla.
Esistono metodi che puoi utilizzare per impostare i flag che attivano questi comportamenti:
setAutoExpandBubble()
e
setSuppressNotification()
.
L'esempio seguente mostra come configurare una bolla in modo che venga visualizzata 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, facendo sì che l'applicazione diventi un processo in primo piano, se non lo è già.
Quando la bolla viene compressa o chiusa, l'attività viene eliminata. Ciò potrebbe comportare la memorizzazione nella cache e la successiva interruzione del processo, 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 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 bolla solo se si verifica una o più delle seguenti condizioni:
- La notifica utilizza
MessagingStyle
e ha unPerson
aggiunto. - La notifica riguarda una chiamata a
Service.startForeground
, ha unacategory
diCATEGORY_CALL
e ha unPerson
aggiunto. - L'app è in primo piano quando viene inviata la notifica.
Se nessuna di queste condizioni è soddisfatta, la notifica viene mostrata anziché una bolla.
Avviare attività dalle bolle
Quando una bolla avvia una nuova attività, questa viene avviata nella stessa attività e nella stessa finestra a 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. Utilizza il contesto dell'attività quando avvii intent,
activity.startActivity(intent)
e
1. Non impostare il flag FLAG_ACTIVITY_NEW_TASK
nell'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 di 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 occupano spazio sullo schermo e coprono i contenuti di altre app.
- Assicurati che la notifica a bolla funzioni anche come notifica normale. Quando l'utente disattiva la bolla, la notifica a bolla viene visualizzata come una normale notifica.
- Chiama
super.onBackPressed
quando esegui l'override dionBackPressed
nell'attività a bolle. In caso contrario, la bolla potrebbe non funzionare correttamente.
Quando una bolla compressa riceve un messaggio aggiornato, viene visualizzata un'icona badge per indicare un messaggio non letto. Quando l'utente apre il messaggio nell'app associata, segui questi passaggi:
- Aggiorna
BubbleMetadata
per eliminare la notifica. ChiamaBubbleMetadata.Builder.setSuppressNotification()
. In questo modo, l'icona del badge viene rimossa per indicare che l'utente ha interagito con il messaggio. - Imposta
Notification.Builder.setOnlyAlertOnce()
sutrue
per eliminare il suono o la vibrazione che accompagnano l'aggiornamento diBubbleMetadata
.
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 delle persone.