Utiliser des bulles pour permettre aux utilisateurs de participer aux conversations

Les bulles permettent aux utilisateurs de voir les conversations et d'y participer plus facilement.

Figure 1. Bulle de chat

Les bulles sont intégrées au système de notification. Elles flottent au-dessus des autres contenus de l'application et suivent l'utilisateur partout où il va. Les utilisateurs peuvent développer les bulles pour afficher les fonctionnalités et informations de l'application, et les réduire lorsqu'ils ne les utilisent pas.

Lorsque l'appareil est verrouillé ou que le mode Always-on est actif, des bulles apparaissent comme les notifications normalement.

Il n'est pas possible d'utiliser les bulles. Lorsqu'une application présente sa première info-bulle, une boîte de dialogue d'autorisation propose deux options:

  • Bloquez toutes les bulles de votre application. Les notifications ne sont pas bloquées, mais elles n'apparaissent jamais sous forme de bulles.
  • Autorisez toutes les bulles de votre appli. Toutes les notifications envoyées avec BubbleMetaData s'affichent sous forme de bulles.

API Bubble

Les bulles sont créées via l'API de notification. Vous devez donc envoyer votre notification normalement. Si vous souhaitez que la notification s'affiche sous forme d'info-bulle, joignez-y des données supplémentaires.

La vue développée d'une bulle est créée à partir d'une activité de votre choix. Configurez l'activité pour qu'elle s'affiche correctement sous forme d'info-bulle. L'activité doit être redimensionnable et intégrée. Si elle ne respecte pas l'une de ces exigences, elle s'affiche sous la forme d'une notification.

Le code suivant montre comment implémenter une bulle simple:

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>

Si votre application affiche plusieurs bulles du même type, par exemple plusieurs conversations de chat avec des contacts différents, l'activité doit pouvoir lancer plusieurs instances. Sur les appareils équipés d'Android 10 ou version antérieure, les notifications ne s'affichent pas sous forme de bulles, sauf si vous définissez explicitement documentLaunchMode sur "always". À partir d'Android 11, il n'est pas nécessaire de définir explicitement cette valeur, car le système définit automatiquement l'élément documentLaunchMode de toutes les conversations sur "always".

Pour envoyer une bulle, procédez comme suit:

  1. Créez une notification selon la procédure habituelle.
  2. Appelez BubbleMetadata.Builder(PendingIntent, Icon) ou BubbleMetadata.Builder(String) pour créer un objet BubbleMetadata.
  3. Utilisez setBubbleMetadata() pour ajouter les métadonnées à la notification.
  4. Si vous ciblez Android 11 ou une version ultérieure, assurez-vous que les métadonnées de la bulle ou la notification font référence à un raccourci de partage.

Ces étapes sont présentées dans l'exemple suivant :

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);

Si votre application est exécutée au premier plan lorsqu'une bulle est envoyée, l'importance est ignorée et votre bulle est toujours affichée, sauf si l'utilisateur bloque les bulles ou les notifications de votre application.

Créer une bulle développée

Vous pouvez configurer votre info-bulle pour qu'elle s'affiche automatiquement en grand format. Nous vous recommandons de n'utiliser cette fonctionnalité que si l'utilisateur effectue une action qui entraîne une bulle (par exemple, appuyer sur un bouton pour démarrer une nouvelle discussion). Dans ce cas, il est également judicieux de supprimer la notification initiale envoyée lors de la création d'une bulle.

Il existe des méthodes que vous pouvez utiliser pour définir des indicateurs qui activent ces comportements : setAutoExpandBubble() et setSuppressNotification().

L'exemple suivant montre comment configurer une info-bulle pour qu'elle s'affiche automatiquement dans un état développé:

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();

Cycle de vie du contenu des bulles

Lorsqu'une bulle est développée, l'activité du contenu suit le cycle de vie de processus normal, ce qui fait que l'application devient un processus de premier plan, si ce n'est pas déjà fait.

Lorsque l'info-bulle est réduite ou ignorée, l'activité est détruite. Cela peut entraîner la mise en cache du processus, puis sa fermeture, selon que d'autres composants de premier plan sont en cours d'exécution ou non dans l'application.

Quand des bulles apparaissent

Pour réduire les interruptions pour l'utilisateur, les bulles n'apparaissent que dans certaines circonstances.

Si une application cible Android 11 ou une version ultérieure, une notification n'apparaît sous forme de bulle que si elle répond aux exigences concernant les conversations. Si une application cible Android 10 ou une version antérieure, la notification n'apparaît sous forme de bulle que si une ou plusieurs des conditions suivantes sont remplies:

Si aucune de ces conditions n'est remplie, la notification s'affiche à la place d'une info-bulle.

Bonnes pratiques

  • N'envoyez une notification sous forme de bulle que si c'est important, par exemple lorsqu'elle fait partie d'une communication en cours ou si l'utilisateur demande explicitement une bulle de contenu. Les bulles utilisent l'espace disponible à l'écran et recouvrent d'autres contenus de l'application.
  • Assurez-vous que votre notification via bulle fonctionne aussi comme une notification normale. Lorsque l'utilisateur désactive la bulle, une notification par bulle s'affiche comme une notification normale.
  • Faites en sorte que les fonctionnalités soient aussi spécifiques et légères que possible. Les processus lancés à partir d'une bulle, tels que les activités et les boîtes de dialogue, apparaissent dans le conteneur de bulle. Cela signifie qu'une bulle peut avoir une pile de tâches. Les choses peuvent se compliquer s'il y a beaucoup de fonctionnalités ou de navigation dans votre bulle.
  • Appelez super.onBackPressed lors du remplacement de onBackPressed dans l'activité de bulle. Sinon, votre bulle risque de ne pas se comporter correctement.

Lorsqu'une bulle réduite reçoit un message mis à jour, elle affiche une icône de badge pour indiquer qu'un message n'est pas lu. Lorsque l'utilisateur ouvre le message dans l'application associée, procédez comme suit:

Application exemple

L'application exemple People est une application de conversation simple qui utilise des bulles. À des fins de démonstration, cette application utilise des chatbots. Dans les applications réelles, les bulles ne doivent être utilisées que pour les messages humains, et non par des bots.