Benachrichtigungs-Bubbles für Unterhaltungen verwenden

Mit Infofeldern mit Benachrichtigungen können Nutzer Unterhaltungen leichter sehen und daran teilnehmen.

Abbildung 1 Ein Infofeld mit einer Chatnachricht.

Sie werden über anderen App-Inhalten angezeigt. Nutzer können sie maximieren, um die App-Inhalte zu sehen und mit ihnen zu interagieren, und sie können sie minimieren, wenn sie sie nicht verwenden.

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

Infofelder mit Benachrichtigungen werden vom Nutzer aktiviert. Dazu tippt er in Benachrichtigungen, die Infofelder unterstützen, auf die Schaltfläche für Infofelder. So wird für diesen bestimmten Chat immer ein Infofeld angezeigt. In den Einstellungen können Nutzer anpassen, für welche Chats Infofelder angezeigt werden sollen, oder die Einstellungen für die gesamte App ändern.

Nutzer haben folgende Möglichkeiten:

  • Alle Infofelder mit Benachrichtigungen aus Ihrer App blockieren. Benachrichtigungen werden nicht blockiert, aber sie werden nie als Infofelder angezeigt.
  • Ausgewählte Infofelder mit Benachrichtigungen aus Ihrer App zulassen. Benachrichtigungen, für die die Schaltfläche für Infofelder verwendet wird, werden als „ausgewählt“ betrachtet.
  • Alle Infofelder mit Benachrichtigungen aus Ihrer App zulassen. Alle Benachrichtigungen, die mit BubbleMetadata gesendet werden, werden als Infofelder angezeigt.

Die Notification Bubble API

Infofelder mit Benachrichtigungen werden mit der Notification API erstellt. Wenn Ihre Benachrichtigung als Infofeld angezeigt werden soll, fügen Sie ihr zusätzliche Daten hinzu.

Die maximierte Ansicht des Infofelds wird aus einer von Ihnen ausgewählten Aktivität erstellt. Konfigurieren Sie die Aktivität so, dass sie richtig als Infofeld angezeigt wird. Die Größe der Aktivität muss geändert werden können und sie muss eingebettet sein. Wenn eine dieser Anforderungen nicht erfüllt ist, wird sie vom System stattdessen als Benachrichtigung angezeigt.

Der folgende Code zeigt, 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 Infofelder 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 nicht als Infofelder 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 documentLaunchMode für alle Unterhaltungen automatisch 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. Fügen Sie der Benachrichtigung mit setBubbleMetadata() die Metadaten hinzu.
  4. Wenn Sie auf Android 11 (API-Level 30) oder höher ausgerichtet sind, muss in den Metadaten des Infofelds oder in der Benachrichtigung ein Verknüpfung zum Teilen enthalten sein.
  5. Ändern Sie Ihre App so, dass Benachrichtigungen, die als Infofelder angezeigt werden, nicht abgebrochen werden. Wenn Sie eine Benachrichtigung abbrechen, wird das Infofeld vom Bildschirm entfernt. Wenn Sie ein Infofeld öffnen, wird die zugehörige Benachrichtigung automatisch ausgeblendet.

Diese Schritte werden im folgenden Beispiel gezeigt:

// 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 ein Infofeld gesendet wird, wird die Wichtigkeit ignoriert und Ihr Infofeld wird immer angezeigt, es sei denn, der Nutzer blockiert Infofelder oder Benachrichtigungen von Ihrer App.

Maximiertes 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 einem Infofeld 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 eines Infofelds 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 ein Infofeld so konfigurieren, dass es automatisch im maximierten Zustand angezeigt wird:

val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(true)
    .build()

Lebenszyklus von Infofeldinhalten

Wenn ein Infofeld maximiert wird, durchläuft die Inhaltsaktivität den normalen Prozess Lebenszyklus. Dadurch wird die Anwendung zu einem Vordergrundprozess, falls sie es nicht bereits ist.

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

Wann Infofelder angezeigt werden

Um Unterbrechungen für den Nutzer zu minimieren, werden Infofelder 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 Infofeld 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 Infofeld angezeigt, wenn eine oder mehrere der folgenden Bedingungen erfüllt sind:

Wenn keine dieser Bedingungen erfüllt ist, wird die Benachrichtigung anstelle eines Infofelds angezeigt.

Aktivitäten aus Infofeldern starten

Wenn ein Infofeld eine neue Aktivität startet, wird die neue Aktivität entweder in derselben Aufgabe und demselben Infofeld-Fenster oder in einer neuen Aufgabe im Vollbildmodus gestartet, wobei das Infofeld, das sie gestartet hat, minimiert wird.

So starten Sie eine neue Aktivität in derselben Aufgabe wie das Infofeld: 1. Verwenden Sie den Aktivitätskontext, wenn Sie Intents starten, 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 wird minimiert.

Ein Infofeld stellt eine bestimmte Unterhaltung dar. Aktivitäten, die im Infofeld gestartet werden, sollten sich daher auf diese Unterhaltung beziehen. Außerdem erhöht das Starten einer Aktivität im Infofeld den Aufgabenstapel des Infofelds und kann die Nutzerfreundlichkeit beeinträchtigen, insbesondere in Bezug auf die Navigation.

Best Practices

  • Senden Sie eine Benachrichtigung nur dann als Infofeld, wenn sie wichtig ist, z. B. wenn sie Teil einer laufenden Kommunikation ist oder wenn der Nutzer explizit ein Infofeld für Inhalte anfordert. Infofelder nehmen Platz auf dem Bildschirm ein und verdecken andere App-Inhalte.
  • Ihre Infofeld-Benachrichtigung muss auch als normale Benachrichtigung funktionieren. Wenn der Nutzer das Infofeld deaktiviert, wird eine Infofeld-Benachrichtigung als normale Benachrichtigung angezeigt.
  • Verwenden Sie die BackHandler zusammensetzbare Funktion und verknüpfen Sie ihren enabled Parameter mit dem UI-Status, damit sie nur dann Rückschritte abfängt, wenn es erforderlich ist. Sobald sich der Handler deaktiviert, wird das Infofeld minimiert.

Wenn in einem minimierten Infofeld eine aktualisierte Nachricht eingeht, wird im Infofeld ein Badge-Symbol 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 Infofelder verwendet. Zu Demonstrationszwecken verwendet diese App Chatbots. In realen Anwendungen sollten Sie Infofelder für Nachrichten von Menschen verwenden.