Benachrichtigungs-Bubbles für Unterhaltungen verwenden

Mit Benachrichtigungs-Bubbles können Nutzer Unterhaltungen leichter sehen und daran teilnehmen.

Abbildung 1. Eine Chat-Bubble.

Sie werden über anderen App-Inhalten angezeigt. Nutzer können sie 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.

Infofelder mit Benachrichtigungen sind vom Nutzer aktiviert. Dazu tippen sie in Benachrichtigungen, die Bubbles unterstützen, auf die Bubble-Schaltfläche. So wird dieser bestimmte Chat immer oben angezeigt. In den Einstellungen können Nutzer anpassen, welche Chats sie als Blase anzeigen lassen, oder die Einstellungen für die gesamte App ändern.

Nutzer können Folgendes tun:

  • Alle Benachrichtigungsblasen aus Ihrer App blockieren. Benachrichtigungen werden nicht blockiert, aber nie als Blasen angezeigt.
  • Lassen Sie ausgewählte Infofelder mit Benachrichtigungen aus Ihrer App zu. Benachrichtigungen, die über die Schaltfläche „Infofeld“ angezeigt werden, sind „ausgewählt“.
  • Alle Infofelder mit Benachrichtigungen von Ihrer App zulassen. Alle Benachrichtigungen, die mit BubbleMetadata gesendet werden, werden als Infofelder angezeigt.

Die Notification Bubble API

Benachrichtigungsblasen werden mit der Notification API erstellt. Wenn Sie möchten, dass Ihre Benachrichtigung als Blase angezeigt wird, hängen Sie zusätzliche Daten an sie an.

Die erweiterte Ansicht der Blase 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 in der Größe anpassbar und eingebettet sein. Wenn eine dieser Anforderungen nicht erfüllt ist, wird sie 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 nicht als Blasen angezeigt, es sei denn, Sie legen documentLaunchMode explizit auf "always" fest. Ab Android 11 müssen Sie diesen Wert nicht explizit festlegen, da das System automatisch alle documentLaunchMode von Unterhaltungen auf "always" setzt.

So senden Sie eine Benachrichtigungs-Bubble:

  1. Erstellen Sie eine Benachrichtigung wie gewohnt.
  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 auf Android 11 (API-Level 30) oder höher ausgerichtet sind, 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. Wenn Sie eine Benachrichtigung schließen, 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:

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent =
    PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* 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 =
    ShortcutInfoCompat.Builder(context, shortcutId)
        .setCategories(setOf(category))
        .setIntent(Intent(Intent.ACTION_DEFAULT))
        .setLongLived(true)
        .setShortLabel("Chat partner name")
        .build()
// Publish the shortcut, otherwise the bubble metadata will not apply.
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

// Create a bubble metadata.
val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent,
    IconCompat.createWithResource(context, R.drawable.ic_logo))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.chat)
    .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.

Erweiterte Bubble 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:

val bubbleMetadata = NotificationCompat.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 (API‑Level 30) 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 (API‑Level 29) oder niedriger ausgerichtet ist, wird die Benachrichtigung nur dann als Blase angezeigt, wenn eine oder mehrere der folgenden Bedingungen erfüllt sind:

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

Aktivitäten über Bubbles starten

Wenn eine Blase eine neue Aktivität startet, wird die neue Aktivität entweder innerhalb derselben Aufgabe und desselben Blasenfensters oder in einer neuen Aufgabe im Vollbildmodus gestartet, wodurch die Blase, die sie gestartet hat, minimiert wird.

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 Intention fest.

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

Eine Blase steht für eine bestimmte Unterhaltung. 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, insbesondere bei der Navigation, beeinträchtigen kann.

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.
  • Verwenden Sie die zusammensetzbare Funktion BackHandler und verknüpfen Sie ihren Parameter enabled mit Ihrem UI-Zustand, damit sie nur bei Bedarf das Zurückdrücken abfängt. Sobald sich der Handler deaktiviert, wird die Blase geschlossen.

Wenn in einer minimierten Bubble eine aktualisierte Nachricht eingeht, wird in der Bubble ein Benachrichtigungssymbol angezeigt, um auf eine 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, die Blasen verwendet. Zu Demonstrationszwecken werden in dieser App Chatbots verwendet. In der Praxis sollten Sie Bubbles für Nachrichten von Menschen verwenden.