Utilizzare le bolle di notifica per le conversazioni

I fumetti di notifica consentono agli utenti di visualizzare e partecipare più facilmente alle conversazioni.

Figura 1. Un fumetto di chat.

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

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

I fumetti di notifica vengono attivati dall'utente. Per farlo, può toccare il pulsante del fumetto sulle notifiche che supportano i fumetti. In questo modo, la chat specifica viene sempre visualizzata come fumetto. Nelle impostazioni, gli utenti possono modificare le chat che hanno visualizzato come fumetti o le impostazioni dell'app in generale.

Gli utenti possono:

  • Bloccare tutti i fumetti di notifica della tua app. Le notifiche non vengono bloccate, ma non vengono mai visualizzate come fumetti.
  • Consentire i fumetti di notifica selezionati della tua app. Le notifiche visualizzate come fumetti utilizzando il pulsante del fumetto sono "selezionate".
  • Consentire tutti i fumetti di notifica della tua app. Tutte le notifiche inviate con BubbleMetadata vengono visualizzate come fumetti.

L'API dei fumetti di notifica

I fumetti di notifica vengono creati utilizzando l'API delle notifiche. Se vuoi che la notifica venga visualizzata come fumetto, devi allegare dati aggiuntivi.

La visualizzazione espansa del fumetto viene creata da un'attività che scegli. Configura l'attività in modo che venga visualizzata correttamente come fumetto. 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 un fumetto:

<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ù fumetti 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 fumetti 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, segui questi passaggi:

  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 (livello API 30) o versioni successive, assicurati che i metadati del fumetto o la notifica facciano riferimento a una scorciatoia per la condivisione.
  5. Modifica l'app in modo che non annulli le notifiche visualizzate come fumetti. L'annullamento di una notifica rimuove la bolla dallo schermo. L'apertura di un fumetto nasconde automaticamente la notifica associata.

Questi passaggi sono illustrati nell'esempio seguente:

  // 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(context, 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)

Se la tua app è in primo piano quando viene inviato un fumetto, l'importanza viene ignorata e il fumetto viene sempre mostrato, a meno che l'utente non blocchi i fumetti o le notifiche della tua app.

Creare un fumetto espanso

Puoi configurare il fumetto in modo che venga presentato automaticamente in stato espanso. Ti consigliamo di utilizzare questa funzionalità solo se l'utente esegue un'azione che genera un fumetto, ad esempio toccando un pulsante per avviare una nuova chat. In questo caso, è anche opportuno eliminare la notifica iniziale inviata quando viene creato un fumetto.

Esistono metodi che puoi utilizzare per impostare i flag che abilitano questi comportamenti: setAutoExpandBubble() e setSuppressNotification().

L'esempio seguente mostra come configurare un fumetto in modo che venga presentato automaticamente in stato espanso:

  val bubbleMetadata = Notification.BubbleMetadata.Builder()
      .setDesiredHeight(600)
      .setIntent(bubbleIntent)
      .setAutoExpandBubble(true)
      .setSuppressNotification(true)
      .build()

Ciclo di vita dei contenuti dei fumetti

Quando un fumetto viene espanso, 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 il fumetto viene compresso o chiuso, l'attività viene eliminata. A seconda che l'app abbia altri componenti in primo piano in esecuzione, il processo potrebbe essere memorizzato nella cache e successivamente terminato.

Quando vengono visualizzati i fumetti

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 fumetto a meno che non soddisfi i requisiti della conversazione. Se un'app ha come target Android 10 (livello API 29) o versioni precedenti, la notifica viene visualizzata come fumetto solo se sono soddisfatte una o più delle seguenti condizioni:

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

Avviare attività dai fumetti

Quando un fumetto avvia una nuova attività, quest'ultima viene avviata nella stessa attività e nella stessa finestra del fumetto oppure in una nuova attività a schermo intero, comprimendo il fumetto che l'ha avviata.

Per avviare una nuova attività nella stessa attività del fumetto: 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 il fumetto viene compresso.

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

Best practice

  • Invia una notifica come fumetto solo se è importante, ad esempio se fa parte di una comunicazione in corso o se l'utente richiede esplicitamente un fumetto per i contenuti. Le bolle utilizzano lo spazio sullo schermo e coprono altri contenuti dell'app.
  • Assicurati che la notifica del fumetto funzioni anche come notifica normale. Quando l'utente disattiva il fumetto, una notifica del fumetto viene visualizzata come notifica normale.
  • Utilizza il BackHandler composable e collega il relativo parametro enabled allo stato dell' UI in modo che intercetti le pressioni del tasto Indietro solo quando necessario. Una volta che il gestore si disattiva, il fumetto viene compresso.

Quando un fumetto compresso 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 i fumetti. A scopo dimostrativo, questa app utilizza i chatbot. Nelle applicazioni reali, utilizza i fumetti per i messaggi inviati da persone.