Mit Bubbles können Nutzer an Unterhaltungen teilnehmen

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

Abbildung 1. Eine Chatbubble.

Bubbles sind in das Benachrichtigungssystem integriert. Sie schweben über anderen App-Inhalten und folgen dem Nutzer, wohin er auch geht. Nutzer können Bubbles maximieren, um die App-Inhalte zu sehen 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 bei normalen Benachrichtigungen angezeigt.

Bubbles sind eine optionale Funktion. Wenn eine App die erste Bubble anzeigt, haben Sie in einem Berechtigungsdialogfeld zwei Möglichkeiten:

  • Blockieren Sie alle Bubbles von Ihrer App. Benachrichtigungen werden nicht blockiert, aber sie werden nie als Bubbles angezeigt.
  • Lassen Sie alle Bubbles von Ihrer App zu. Alle mit BubbleMetaData gesendeten Benachrichtigungen werden als Bubbles angezeigt.

Bubble API

Bubbles werden mit der Notification API erstellt. Senden Sie Ihre Benachrichtigung also wie gewohnt. Wenn Sie möchten, dass Ihre Benachrichtigung als Bubble angezeigt wird, hängen Sie zusätzliche Daten an.

Die erweiterte Ansicht eines Infofelds wird aus einer von Ihnen ausgewählten Aktivität erstellt. Konfigurieren Sie die Aktivität so, dass sie richtig als Blase angezeigt wird. Die Aktivität muss veränderbar und eingebettet sein. Wenn eine dieser Anforderungen nicht erfüllt ist, wird die Karte stattdessen als Benachrichtigung angezeigt.

Im folgenden Code wird gezeigt, wie eine Blase 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 Sie documentLaunchMode explizit auf "always" festlegen. Ab Android 11 müssen Sie diesen Wert nicht mehr explizit festlegen, da das System die documentLaunchMode aller Unterhaltungen automatisch auf "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. Verwenden Sie setBubbleMetadata(), um der Benachrichtigung die Metadaten hinzuzufügen.
  4. Wenn Sie Ihre Anzeigen auf Android 11 oder höher ausrichten, müssen die Bubble-Metadaten oder die Benachrichtigung auf einen Freigabe-Shortcut verweisen.
  5. Ändern Sie Ihre App so, dass Benachrichtigungen, die als Bubbles angezeigt werden, nicht abgebrochen werden. Wenn Sie prüfen möchten, ob die Benachrichtigungsaktivität als Bubble gestartet wird, rufen Sie Activity#isLaunchedFromBubble() auf. Wenn Sie eine Benachrichtigung schließen, wird die Bubble vom Display entfernt. Wenn Sie eine Blase öffnen, wird die zugehörige Benachrichtigung automatisch ausgeblendet.

Diese Schritte sind im folgenden Beispiel dargestellt:

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 das Infofeld so konfigurieren, dass es automatisch maximiert 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 den Flags setAutoExpandBubble() und setSuppressNotification() können Sie diese Funktionen aktivieren.

Das folgende Beispiel zeigt, wie eine Blase so konfiguriert wird, dass sie 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 von Bubble-Inhalten

Wenn eine Blase maximiert wird, durchläuft die Inhaltsaktivität den normalen Prozesslebenszyklus. Dadurch wird die Anwendung zu einem Prozess im Vordergrund, falls dies noch nicht der Fall ist.

Wenn die Blase 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 App andere Komponenten im Vordergrund ausgeführt werden.

Wenn Blasen angezeigt werden

Um Unterbrechungen für Nutzer zu minimieren, 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 an Unterhaltungen erfüllt. Wenn eine App auf Android 10 oder niedriger ausgerichtet ist, 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 über Bubbles starten

Wenn eine Bubble eine neue Aktivität startet, wird diese entweder in derselben Aufgabe und im selben Bubble-Fenster oder in einer neuen Aufgabe im Vollbildmodus gestartet. Die Bubble, über die die Aktivität gestartet wurde, wird dabei minimiert.

So starten Sie eine neue Aktivität in derselben Aufgabe wie die Bubble: 1. Verwenden Sie den Aktivitätskontext, wenn Sie Intents, activity.startActivity(intent) und 1 starten. 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.

Denken Sie daran, dass eine Bubble eine bestimmte Unterhaltung darstellt. Daher sollten Aktivitäten, die in der Bubble gestartet werden, sich auf diese Unterhaltung beziehen. Außerdem erhöht das Starten einer Aktivität innerhalb der Blase den Aufgabenstapel der Blase und könnte die Nutzerfreundlichkeit beeinträchtigen, insbesondere in Bezug auf die Navigation.

Best Practices

  • Senden Sie eine Benachrichtigung nur als Bubble, wenn sie wichtig ist, z. B. wenn sie Teil einer laufenden Kommunikation ist oder der Nutzer ausdrücklich eine Bubble für Inhalte anfordert. Bubbles belegen Displayfläche und verdecken andere App-Inhalte.
  • Achten Sie darauf, dass Ihre Bubble-Benachrichtigung 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 Bubble-Aktivität überschreiben. Andernfalls funktioniert die Bubble möglicherweise nicht richtig.

Wenn für eine minimierte Bubble eine aktualisierte Nachricht eingeht, wird in der Bubble ein Symbol angezeigt, das auf eine ungelesene Nachricht hinweist. Wenn der Nutzer die Nachricht in der verknüpften App öffnet, gehen Sie so vor:

Beispielanwendung

Die Beispiel-App SociaLite ist eine Unterhaltungs-App, die Bubbles verwendet. Zu Demonstrationszwecken werden in dieser App Chatbots verwendet. Verwenden Sie in der Praxis Bubbles für Nachrichten von Menschen.