Le bolle consentono agli utenti di vedere e partecipare più facilmente alle conversazioni.
Le bolle sono integrate nel sistema di notifica. Fluttuano sopra gli altri contenuti dell'app e seguono l'utente ovunque vada. Gli utenti possono espandere le bolle per visualizzare e interagire con i contenuti dell'app e possono chiuderle quando non le utilizzano.
Quando il dispositivo è bloccato o il display sempre attivo è attivo, le bolle vengono visualizzate come accade normalmente per le notifiche.
Le bolle sono una funzionalità che può essere disattivata. Quando un'app presenta la sua prima bolla, viene visualizzata una finestra di dialogo per le autorizzazioni che offre due opzioni:
- Blocca tutte le bolle dall'app. Le notifiche non sono bloccate, ma non vengono mai visualizzati sotto forma di 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 utilizzando l'API di notifica, quindi invia la notifica come normale. Se vuoi che la notifica venga visualizzata come una bolla, allega 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 ridimensionabili e incorporati. Se manca 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 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 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:
- Crea una notifica come faresti normalmente.
- Chiama il numero
BubbleMetadata.Builder(PendingIntent, Icon)
oBubbleMetadata.Builder(String)
per creare un oggettoBubbleMetadata
. - Utilizza
setBubbleMetadata()
per aggiungere i metadati alla notifica. - Se scegli come target Android 11 o versioni successive, assicurati che la bolla o la notifica fa riferimento a una scorciatoia per la condivisione.
- Modifica l'app in modo che non annulli le notifiche visualizzate come fumetti.
Per verificare se l'attività di notifica viene avviata sotto forma di 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 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.
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 tocca un pulsante per avviare una nuova chat. In questo caso, è anche opportuno 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 visualizzata automaticamente in 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. Ciò potrebbe portare alla memorizzazione nella cache del processo e alla sua eliminazione successiva, a seconda che nell'app siano 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:
- La notifica utilizza
MessagingStyle
e ha unPerson
aggiunto. - La notifica proviene da una chiamata a
Service.startForeground
, ha uncategory
diCATEGORY_CALL
e ha unPerson
aggiunto. - L'app è in primo piano quando viene inviata la notifica.
Se nessuna di queste condizioni è soddisfatta, viene visualizzata la notifica anziché un fumetto.
Avvio di attività dalle bolle
Quando un fumetto avvia una nuova attività, viene avviata la nuova attività 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. Utilizza il contesto dell'attività quando avvii 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, pertanto le attività avviate al suo interno devono essere correlate a quella conversazione. Inoltre, l'avvio di un'attività all'interno della bolla aumenta la pila di attività della bolla e potrebbe potenzialmente complicare l'esperienza utente, in particolare per quanto riguarda la navigazione.
Best practice
- Invia una notifica sotto forma di fumetto solo se è importante, ad esempio quando è parte di una comunicazione continua 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 popup funzioni anche come una normale notifica. Quando l'utente disattiva la bolla, viene visualizzata una notifica a fumetto notifica.
- Chiama
super.onBackPressed
quando sostituiscionBackPressed
nell'attività della bolla. 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 nell'app associata, segui questi passaggi:
- Aggiorna
il
BubbleMetadata
per eliminare la notifica. ChiamaBubbleMetadata.Builder.setSuppressNotification()
L'icona del badge viene rimossa per indicare che l'utente ha interagito con il messaggio. - Imposta
Notification.Builder.setOnlyAlertOnce()
atrue
per eliminare il suono o la vibrazione che accompagnanoBubbleMetadata
aggiornamento.
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.