Mit Bubbles können Nutzer an Unterhaltungen teilnehmen

Bubbles erleichtern es den Nutzern, Unterhaltungen zu sehen und daran teilzunehmen.

Abbildung 1. Eine Sprechblase.

Infofelder sind im Benachrichtigungssystem integriert. Sie schweben über anderen App-Inhalten und folgen dem Nutzer, egal wo er sich befindet. Nutzer können Bubbles maximieren, um App-Inhalte einzublenden und mit ihnen zu interagieren. Sie können sie minimieren, wenn sie sie nicht verwenden.

Wenn das Gerät gesperrt oder das Always-on-Display aktiv ist, werden Bubbles wie für Benachrichtigungen angezeigt.

Infofelder können deaktiviert werden. Wenn eine App das erste Infofeld anzeigt, bietet ein Berechtigungsdialogfeld zwei Auswahlmöglichkeiten:

  • Sie können alle Bubbles in Ihrer App blockieren. Benachrichtigungen werden nicht blockiert, aber sie werden nie als Bubbles angezeigt.
  • Alle Bubbles von deiner App zulassen. Alle mit BubbleMetaData gesendeten Benachrichtigungen werden als Bubbles angezeigt.

Die Bubble API

Infofelder werden mit der Notification API erstellt. Senden Sie Ihre Benachrichtigung daher wie gewohnt. Wenn Ihre Benachrichtigung als Bubble angezeigt werden soll, können Sie zusätzliche Daten anhängen.

Die maximierte Ansicht einer Blase wird auf der Grundlage einer von Ihnen ausgewählten Aktivität erstellt. Konfigurieren Sie die Aktivität so, dass sie korrekt als Bubble angezeigt wird. Die Aktivität muss in der Größe veränderbar und eingebettet sein. Wenn eine dieser Voraussetzungen nicht erfüllt ist, wird stattdessen eine Benachrichtigung angezeigt.

Im folgenden Code sehen Sie, wie ein Infofeld implementiert wird:

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

Wenn Ihre App mehrere Bubbles desselben Typs anzeigt, z. B. mehrere Chatunterhaltungen mit verschiedenen Kontakten, muss die Aktivität mehrere Instanzen starten können. Auf Geräten mit Android 10 und niedriger werden Benachrichtigungen nur dann als Bubbles angezeigt, wenn du documentLaunchMode ausdrücklich auf "always" gesetzt hast. Ab Android 11 müssen Sie diesen Wert nicht explizit festlegen, da das System für die documentLaunchMode von Unterhaltungen automatisch den Wert "always" festlegt.

So senden Sie eine Bubble:

  1. Erstellen Sie wie gewohnt eine Benachrichtigung.
  2. Rufen Sie BubbleMetadata.Builder(PendingIntent, Icon) oder BubbleMetadata.Builder(String) auf, um ein BubbleMetadata-Objekt zu erstellen.
  3. Mit setBubbleMetadata() fügen Sie der Benachrichtigung die Metadaten hinzu.
  4. Wenn deine App auf Android 11 oder höher ausgerichtet ist, achte darauf, dass die Bubble-Metadaten oder die Benachrichtigung auf eine Freigabeverknüpfung verweisen.

Diese Schritte werden im folgenden Beispiel gezeigt:

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

Wenn Ihre App beim Senden eines Infofelds im Vordergrund ausgeführt wird, wird die Wichtigkeit ignoriert und das Infofeld wird immer angezeigt, es sei denn, der Nutzer blockiert Bubbles oder Benachrichtigungen von Ihrer App.

Maximierte Bubble erstellen

Sie können das Infofeld so konfigurieren, dass es automatisch maximiert angezeigt wird. Wir empfehlen, diese Funktion nur zu verwenden, wenn der Nutzer eine Aktion ausführt, die zu einer Bubble führt, z. B. wenn er auf eine Schaltfläche tippt, um einen neuen Chat zu starten. In diesem Fall ist es auch sinnvoll, die erste Benachrichtigung zu unterdrücken, die beim Erstellen einer Bubble gesendet wird.

Mit verschiedenen Methoden können Sie Flags festlegen, die diese Verhaltensweisen ermöglichen: setAutoExpandBubble() und setSuppressNotification().

Das folgende Beispiel zeigt, wie Sie ein Infofeld so konfigurieren, dass es automatisch maximiert angezeigt wird:

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

Lebenszyklus des Infofeld-Inhalts

Wenn ein Infofeld maximiert wird, durchläuft die Inhaltsaktivität den normalen Prozesslebenszyklus. Dies führt dazu, dass die Anwendung zu einem Vordergrundprozess wird, falls nicht bereits geschehen.

Wenn das Infofeld minimiert oder geschlossen wird, wird die Aktivität gelöscht. Dies kann dazu führen, dass der Prozess im Cache gespeichert und später beendet wird, je nachdem, ob in der Anwendung andere Komponenten im Vordergrund ausgeführt werden.

Wann werden Bubbles angezeigt?

Um Unterbrechungen für den Nutzer zu reduzieren, werden Bubbles nur unter bestimmten Umständen angezeigt.

Wenn eine App auf Android 11 oder höher ausgerichtet ist, wird eine Benachrichtigung nur dann als Bubble angezeigt, wenn sie die Anforderungen für Unterhaltungen erfüllt. Ist eine App auf Android 10 oder niedriger ausgerichtet, wird die Benachrichtigung nur dann als Bubble angezeigt, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

Wenn keine dieser Bedingungen erfüllt ist, wird die Benachrichtigung anstelle einer Bubble angezeigt.

Aktivitäten aus Bubbles starten

Wenn durch eine Bubble eine neue Aktivität gestartet wird, startet die neue Aktivität entweder in derselben Aufgabe und demselben Infofeldfenster oder wird in einer neuen Aufgabe im Vollbildmodus gestartet. Das Infofeld, über das sie gestartet wurde, wird minimiert.

So starten Sie eine neue Aktivität in derselben Aufgabe wie die Bubble: 1. Verwenden Sie beim Starten von Intents den Aktivitätskontext activity.startActivity(intent) und 1. Legen Sie das Flag FLAG_ACTIVITY_NEW_TASK nicht für den Intent fest.

Andernfalls wird die neue Aktivität in einer neuen Aufgabe gestartet und das Infofeld minimiert.

Denken Sie daran, dass eine Bubble eine bestimmte Unterhaltung darstellt. Aktivitäten, die in der Bubble gestartet werden, sollten sich also auf diese Unterhaltung beziehen. Außerdem wird durch das Starten einer Aktivität innerhalb des Infofelds der Aufgabenstapel der Bubble vergrößert, was die Nutzerfreundlichkeit insbesondere im Bereich der Navigation unter Umständen verkomplizieren kann.

Best Practices

  • Sende eine Benachrichtigung nur dann als Bubble, wenn es wichtig ist, z. B. wenn sie Teil einer laufenden Kommunikation ist oder wenn der Nutzer explizit eine Bubble für Inhalte anfordert. Bubbles nutzen den Platz auf dem Bildschirm und verdecken andere App-Inhalte.
  • Achte darauf, dass die Bubble-Benachrichtigung wie eine normale Benachrichtigung funktioniert. Wenn der Nutzer das Infofeld deaktiviert, wird eine Benachrichtigung als normale Benachrichtigung angezeigt.
  • Rufen Sie super.onBackPressed auf, wenn Sie onBackPressed in der Bubble-Aktivität überschreiben. Andernfalls funktioniert die Blase möglicherweise nicht richtig.

Wenn ein minimiertes Infofeld eine aktualisierte Nachricht erhält, wird im Infofeld ein Badge-Symbol angezeigt, das auf eine ungelesene Nachricht hinweist. Wenn der Nutzer die Nachricht in der zugehörigen App öffnet, gehe so vor:

Beispiel-App

Die Beispiel-App Personen ist eine Unterhaltungs-App mit Bubbles. Zu Demonstrationszwecken verwendet diese App Chatbots. In realen Anwendungen verwenden Sie Blasen für Nachrichten von Menschen.