Le bolle di notifica consentono agli utenti di vedere e partecipare più facilmente alle conversazioni.
Le bolle fluttuano sopra i contenuti di altre app e gli utenti possono espanderle per visualizzare e interagire con i contenuti dell'app, nonché comprimerle quando non le utilizzano.
Quando il dispositivo è bloccato o il display sempre attivo è attivo, le bolle vengono visualizzate come normali notifiche.
Le bolle di notifica sono attivate dall'utente. Per farlo, devono toccare il pulsante della bolla nelle notifiche che supportano le bolle. In questo modo, la chat specifica viene sempre visualizzata come bolla. Nelle impostazioni, gli utenti possono scegliere quali chat inserire in una bolla o modificare le impostazioni dell'intera app.
Gli utenti possono:
- Blocca tutte le bolle di notifica della tua app. Le notifiche non vengono bloccate, ma non vengono mai visualizzate come bolle.
- Consenti le bolle di notifica selezionate dalla tua app. Le notifiche con bolla utilizzando il pulsante della bolla sono "selezionate".
- Consenti tutte le bolle di notifica dalla tua app. Tutte le notifiche inviate con
BubbleMetadatavengono visualizzate come bolle.
L'API bolla di notifica
Le bolle di notifica vengono create utilizzando l'API Notification. Se vuoi che la notifica venga visualizzata come bolla, allega dati aggiuntivi.
La visualizzazione espansa della bolla viene creata da un'attività scelta da te. Configura l'attività in modo che venga visualizzata correttamente come fumetto. L'attività deve essere ridimensionabile e incorporata. Se non soddisfa 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 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 esplicitamente
questo valore, poiché il sistema imposta automaticamente documentLaunchMode di tutte le conversazioni
su "always".
Per inviare una bolla di notifica, segui questi passaggi:
- 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 target è Android 11 (livello API 30) o versioni successive, assicurati che i metadati della bolla o la notifica facciano riferimento a una scorciatoia di condivisione.
- Modifica l'app in modo che non annulli le notifiche visualizzate come bolle. 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:
// Create a bubble intent. val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* 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 = ShortcutInfoCompat.Builder(context, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel("Chat partner name") .build() // Publish the shortcut, otherwise the bubble metadata will not apply. ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) // Create a bubble metadata. val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent, IconCompat.createWithResource(context, R.drawable.ic_logo)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.chat) .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 visualizzata 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, ha senso 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:
val bubbleMetadata = NotificationCompat.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, per cui l'applicazione diventa un processo in primo piano, se non lo è già.
Quando la bolla viene compressa o ignorata, l'attività viene eliminata. Ciò potrebbe comportare la memorizzazione nella cache del processo e la sua successiva interruzione, 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 (livello API 30) o versioni successive, una notifica non viene visualizzata come bolla, a meno che non soddisfi i requisiti per le conversazioni. Se un'app ha come target Android 10 (livello API 29) o versioni precedenti, la notifica viene visualizzata come bolla solo se vengono soddisfatte una o più delle seguenti condizioni:
- La notifica utilizza
MessagingStylee ha unPersonaggiunto. - La notifica proviene da una chiamata a
Service.startForeground, ha uncategorydiCATEGORY_CALLe unPersonaggiunto. - L'app è in primo piano quando viene inviata la notifica.
Se nessuna di queste condizioni è soddisfatta, viene mostrata la notifica anziché una bolla.
Avvio di attività dalle bolle
Quando un fumetto avvia una nuova attività, questa viene avviata nello stesso task e nella stessa finestra del fumetto o in un nuovo task a schermo intero, comprimendo il fumetto 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 un nuovo task e la bolla viene compressa.
Tieni presente che una bolla rappresenta una conversazione specifica, quindi le attività avviate al suo interno 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 fumetto funzioni anche come una notifica normale. Quando l'utente disattiva la bolla, una notifica a bolla viene mostrata come una normale notifica.
- Utilizza il composable
BackHandlere associa il relativo parametroenabledallo stato della UI in modo che intercetti le pressioni del tasto Indietro solo quando necessario. Una volta che il gestore si disattiva, la bolla si comprime.
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:
- Aggiorna
BubbleMetadataper 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()sutrueper disattivare il suono o la vibrazione che accompagna 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 i fumetti per i messaggi inviati da persone.