Mit Bubbles können Nutzer an Unterhaltungen teilnehmen

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

Abbildung 1. Eine Sprechblase.

Bubbles sind in das Benachrichtigungssystem integriert. Sie schweben über anderen App-Inhalten und folgen dem Nutzer überall hin. Nutzer können Blasen maximieren, um App-Inhalte aufzurufen und mit ihnen zu interagieren, und sie minimieren, wenn sie sie nicht verwenden.

Wenn das Gerät gesperrt ist oder das Always-on-Display aktiv ist, werden Blasen wie normale Benachrichtigungen angezeigt.

Blasen sind eine Funktion, die deaktiviert werden kann. Wenn eine App ihre erste Blase präsentiert, bietet ein Berechtigungsdialog zwei Optionen:

  • Alle Infofelder aus Ihrer App blockieren. Benachrichtigungen werden nicht blockiert, aber nie als Infofelder angezeigt.
  • Alle Infofelder aus Ihrer App zulassen. Alle Benachrichtigungen, die mit BubbleMetaData gesendet werden, werden als Infofelder angezeigt.

Die Bubble-API

Blasen werden mit der Notification API erstellt. Senden Sie Ihre Benachrichtigung also wie gewohnt. Wenn Ihre Benachrichtigung als Blase angezeigt werden soll, hängen Sie zusätzliche Daten an.

Die erweiterte Ansicht eines Infofelds wird aus einer Aktivität erstellt, die Sie auswählen. Konfigurieren Sie die Aktivität so, dass sie als Blase angezeigt wird. Die Aktivität muss anpassbar und eingebettet sein. Wenn eine der beiden Voraussetzungen nicht erfüllt ist, wird die Meldung stattdessen als Benachrichtigung angezeigt.

Der folgende Code zeigt, wie Sie eine Blase implementieren:

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

Wenn in Ihrer App mehrere Blasen desselben Typs angezeigt werden, 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 Blasen angezeigt, wenn Sie documentLaunchMode explizit auf "always" festlegen. Ab Android 11 müssen Sie diesen Wert nicht explizit festlegen, da das System automatisch alle documentLaunchMode von Unterhaltungen auf "always" festlegt.

So senden Sie eine Blase:

  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. Verwenden Sie setBubbleMetadata(), um die Metadaten der Benachrichtigung hinzuzufügen.
  4. Wenn Sie Android 11 oder höher als Zielgruppe festlegen, muss in den Blasenmetadaten oder der Benachrichtigung auf eine Freigabeverknüpfung verwiesen werden.
  5. Ändern Sie Ihre App so, dass Benachrichtigungen, die als Infofelder angezeigt werden, nicht abgebrochen werden. Rufen Sie Activity#isLaunchedFromBubble() auf, um zu prüfen, ob die Benachrichtigungsaktivität als Blase gestartet wird. Wenn Sie eine Benachrichtigung abbrechen, wird die Bubble vom Bildschirm entfernt. Wenn Sie eine Blase öffnen, wird die zugehörige Benachrichtigung automatisch ausgeblendet.

Diese Schritte werden im folgenden Beispiel veranschaulicht:

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 im Vordergrund ist, wenn eine Bubble gesendet wird, wird die Wichtigkeit ignoriert und Ihre Bubble wird immer angezeigt, es sei denn, der Nutzer blockiert Bubbles oder Benachrichtigungen von Ihrer App.

Erweitertes Infofeld erstellen

Sie können Ihr Infofeld so konfigurieren, dass es automatisch im maximierten Zustand angezeigt wird. Wir empfehlen, diese Funktion nur zu verwenden, wenn der Nutzer eine Aktion ausführt, die zu einer Blase 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 ursprüngliche Benachrichtigung zu unterdrücken, die beim Erstellen einer Blase gesendet wird.

Es gibt Methoden, mit denen Sie Flags festlegen können, die diese Verhaltensweisen aktivieren: setAutoExpandBubble() und setSuppressNotification().

Das folgende Beispiel zeigt, wie Sie eine Blase so konfigurieren, dass sie automatisch im maximierten Zustand 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 von Bubble-Inhalten

Wenn eine Blase maximiert wird, durchläuft die Inhaltsaktivität den normalen Prozesslebenszyklus. Dadurch wird die Anwendung zu einem Vordergrundprozess, sofern sie es nicht bereits ist.

Wenn die Blase minimiert oder geschlossen wird, wird die Aktivität beendet. Das kann dazu führen, dass der Prozess im Cache gespeichert und später beendet wird, je nachdem, ob in der App andere Vordergrundkomponenten ausgeführt werden.

Wann werden Blasen angezeigt?

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

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

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

Aktivitäten über Infofelder starten

Wenn über eine Blase eine neue Aktivität gestartet wird, wird die neue Aktivität entweder im selben Task und im selben Blasenfenster oder in einem neuen Task im Vollbildmodus gestartet. In diesem Fall wird die Blase, über die die Aktivität gestartet wurde, minimiert.

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

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

Eine Blase stellt eine bestimmte Unterhaltung dar. Aktivitäten, die in der Blase gestartet werden, sollten sich also auf diese Unterhaltung beziehen. Außerdem wird durch das Starten einer Aktivität in der Blase der Aufgabenstapel der Blase vergrößert, was die Nutzerfreundlichkeit beeinträchtigen kann, insbesondere bei der Navigation.

Best Practices

  • Senden Sie Benachrichtigungen nur als Blase, wenn sie wichtig sind, z. B. wenn sie Teil einer laufenden Kommunikation sind oder wenn der Nutzer explizit eine Blase für Inhalte anfordert. Blasen nehmen Platz auf dem Bildschirm ein und verdecken andere App-Inhalte.
  • Achten Sie darauf, dass Ihre Blasenbenachrichtigung auch als normale Benachrichtigung funktioniert. Wenn der Nutzer die Bubble deaktiviert, wird eine Bubble-Benachrichtigung als normale Benachrichtigung angezeigt.
  • Rufen Sie super.onBackPressed auf, wenn Sie onBackPressed in der Blasenaktivität überschreiben. Andernfalls funktioniert die Blase möglicherweise nicht richtig.

Wenn in einer minimierten Bubble eine neue Nachricht eingeht, wird in der Bubble ein Benachrichtigungssymbol angezeigt, um auf die ungelesene Nachricht hinzuweisen. Wenn der Nutzer die Nachricht in der zugehörigen App öffnet, führen Sie die folgenden Schritte aus:

Beispiel-App

Die Beispiel-App SociaLite ist eine Unterhaltungs-App, in der Blasen verwendet werden. Zu Demonstrationszwecken werden in dieser App Chatbots verwendet. In realen Anwendungen sollten Blasen für Nachrichten von Menschen verwendet werden.