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 se superposent au contenu de l'application et suivent l'utilisateur partout où il va. Les utilisateurs peuvent développer les bulles pour afficher les fonctionnalités et les 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, les bulles apparaissent comme les notifications habituelles.

Les bulles peuvent être désactivées. Lorsqu'une application présente sa première 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 application. Toutes les notifications envoyées avec BubbleMetaData s'affichent sous forme de bulles.

L'API Bulle

Les bulles sont créées via l'API Notification. Vous devez donc envoyer votre notification normalement. Si vous souhaitez que votre notification s'affiche sous forme de 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 de bulle. L'activité doit être redimensionnable et intégrée. S'il ne respecte pas l'une de ces exigences, une notification s'affiche à la place.

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, comme plusieurs conversations de chat avec différents contacts, 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, vous n'avez pas besoin de définir explicitement cette valeur, car le système définit automatiquement le paramètre documentLaunchMode de toutes les conversations sur "always".

Pour envoyer une info-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 des bulles 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 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 agrandie

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 génère 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 permettant de définir des options permettant ces comportements : setAutoExpandBubble() et setSuppressNotification().

L'exemple suivant montre comment configurer une bulle pour qu'elle s'affiche automatiquement dans son é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é de contenu suit le cycle de vie du processus normal. L'application devient alors un processus de premier plan, si ce n'est pas déjà fait.

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

Affichage des bulles

Afin de limiter 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 de conversation. 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.

pour réussir votre lancement

  • N'envoyez une notification sous forme de bulle que si elle est importante, par exemple lorsqu'elle fait partie d'une communication en cours ou si l'utilisateur demande explicitement une bulle pour le contenu. Les bulles occupent l'espace à l'écran et couvrent le reste du contenu de l'application.
  • Assurez-vous que votre notification sous forme de bulle fonctionne également comme une notification normale. Lorsque l'utilisateur désactive l'info-bulle, une notification s'affiche comme une notification normale.
  • Optez pour une fonctionnalité aussi spécifique et légère 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 cette bulle. Cela signifie qu'une bulle peut avoir une pile de tâches. Les choses peuvent devenir compliquées si votre bulle comporte de nombreuses fonctionnalités ou navigations.
  • Appelez super.onBackPressed lors du remplacement de onBackPressed dans l'activité des bulles. 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'a pas été 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 par des humains, et non par des bots.