Unterstützung für Mehrfenstermodus

Mit dem Mehrfenstermodus können mehrere Apps gleichzeitig denselben Bildschirm teilen. Apps können nebeneinander oder übereinander dargestellt werden (Split-Screen-Modus), eine App in einem kleinen Fenster, die andere Apps überlagert (Bild-im-Bild-Modus) oder einzelne Apps in separaten beweglichen Fenstern mit anpassbarer Größe (Freiformmodus).

Abbildung 1: Zwei Apps nebeneinander im Splitscreen-Modus anzeigen

Die Nutzererfahrung hängt von der Android-Version und dem Gerätetyp ab:

  • Mit Android 7.0 (API-Ebene 24) wird der Splitscreen-Modus auf kleinen Bildschirmen und der Bild-im-Bild-Modus auf ausgewählten Geräten eingeführt.

    Der Splitscreen-Modus füllt den Bildschirm mit zwei Apps, die entweder nebeneinander oder übereinander angezeigt werden. Nutzer können die Trennlinie zwischen den beiden Apps ziehen, um eine größer und die andere kleiner zu machen.

    Mit dem Bild-im-Bild-Modus können Nutzer die Videowiedergabe fortsetzen, während sie mit einer anderen App interagieren (siehe Unterstützung von Bild im Bild).

    Hersteller von Geräten mit großen Bildschirmen können den Freiformmodus aktivieren, in dem Nutzer die Größe der einzelnen Aktivitäten kostenlos anpassen können.

    Du kannst festlegen, wie deine App den Mehrfenstermodus verwendet, indem du die minimal zulässigen Abmessungen deiner Aktivität angibst. Du kannst den Mehrfenstermodus für deine App auch deaktivieren, indem du resizeableActivity="false" festlegst, damit das System deine App immer im Vollbildmodus anzeigt.

  • Android 8.0 (API-Level 26) erweitert den Bild-im-Bild-Modus auf Geräte mit kleinen Bildschirmen.
  • Android 12 (API-Level 31) macht den Mehrfenstermodus zum Standardverhalten.

    Auf großen Bildschirmen (mindestens 600 dp) unterstützt die Plattform alle Apps im Mehrfenstermodus unabhängig von der App-Konfiguration. Wenn resizeableActivity="false", wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen zu berücksichtigen.

    Auf kleinen Bildschirmen (sw < 600 dp) prüft das System die minWidth und minHeight einer Aktivität, um festzustellen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann. Mit resizeableActivity="false" wird die Ausführung der App im Mehrfenstermodus unabhängig von der Mindestbreite und -höhe verhindert.

    Hinweis:Gerätehersteller können diese Verhaltensweisen außer Kraft setzen.

Splitscreen-Modus

So aktivieren Sie den Splitscreen-Modus:

  1. Öffne den Bildschirm „Letzte Apps“.
  2. App durch Wischen in Ansicht ziehen
  3. Tippen Sie auf das App-Symbol in der Titelleiste der App.
  4. Menüoption für den Splitscreen auswählen
  5. Wähle auf dem Bildschirm „Zuletzt verwendet“ eine andere App aus oder schließe den Bildschirm „Zuletzt verwendet“ und führe eine andere App aus

Nutzer können den Splitscreen-Modus beenden, indem sie die Fensterteiler an den Bildschirmrand ziehen – nach oben, unten, links oder rechts.

Benachbarte Startrampe

Wenn Ihre App über einen Intent auf Inhalte zugreifen muss, können Sie mit FLAG_ACTIVITY_LAUNCH_ADJACENT den Inhalt in einem angrenzenden Splitscreen-Fenster öffnen.

FLAG_ACTIVITY_LAUNCH_ADJACENT wurde in Android 7.0 (API-Level 24) eingeführt, damit Apps, die im geteilten Bildschirmmodus ausgeführt werden, Aktivitäten im angrenzenden Fenster starten können.

Android 12L (API-Level 32) und höher haben die Definition des Flags erweitert, damit Apps im Vollbildmodus den Splitscreen-Modus aktivieren und dann Aktivitäten im angrenzenden Fenster starten können.

Um eine angrenzende Aktivität zu starten, verwenden Sie FLAG_ACTIVITY_LAUNCH_ADJACENT in Verbindung mit FLAG_ACTIVITY_NEW_TASK. Beispiel:

Kotlin

fun openUrlInAdjacentWindow(url: String) {
    Intent(Intent.ACTION_VIEW).apply {
        data = Uri.parse(url)
        addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or
                           Intent.FLAG_ACTIVITY_NEW_TASK)
    }.also { intent ->
        startActivity(intent)
    }
}

Java

public void openUrlInAdjacentWindow(String url) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(url));
    intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

Aktivitätslebenszyklus im Mehrfenstermodus

Der Mehrfenstermodus ändert nicht den Aktivitätslebenszyklus. Der Fortsetzungsstatus von Apps in mehreren Fenstern variiert jedoch bei verschiedenen Android-Versionen.

Multi-Lebenslauf

Android 10 (API-Level 29) und höhere Versionen unterstützen mehrere Fortsetzungen. Alle Aktivitäten bleiben im Status RESUMED, wenn sich das Gerät im Mehrfenstermodus befindet. Eine Aktivität kann pausiert werden, wenn eine transparente Aktivität über der Aktivität besteht oder die Aktivität nicht fokussierbar ist, z. B. im Bild-im-Bild-Modus. Es ist auch möglich, dass zu einem bestimmten Zeitpunkt keine Aktivität im Fokus ist, z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die Methode onStop funktioniert wie gewohnt. Sie wird jedes Mal aufgerufen, wenn eine Aktivität vom Bildschirm entfernt wird.

Die Multi-Resume-Funktion ist auch auf ausgewählten Geräten mit Android 9 (API-Level 28) verfügbar. Füge die folgenden Manifestmetadaten hinzu, um auf Android 9-Geräten die Mehrfach-Fortsetzung zu aktivieren:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

Informationen dazu, ob ein bestimmtes Gerät diese Manifest-Metadaten unterstützt, findest du in den Gerätespezifikationen.

Android 9

Im Mehrfenstermodus unter Android 9 (API-Level 28) und niedriger ist zu einem bestimmten Zeitpunkt nur die Aktivität aktiv, mit der der Nutzer zuletzt interagiert hat. Diese Aktivität gilt als höchste Aktivität und ist die einzige Aktivität mit dem Status RESUMED. Alle anderen sichtbaren Aktivitäten sind STARTED, aber nicht RESUMED. Allerdings räumt das System diesen sichtbaren, aber nicht fortgesetzten Aktivitäten eine höhere Priorität zu als Aktivitäten, die nicht sichtbar sind. Wenn der Nutzer mit einer der sichtbaren Aktivitäten interagiert, wird diese fortgesetzt und die zuvor höchste Aktivität erhält den Status STARTED.

Wenn ein einzelner aktiver Anwendungsprozess mehrere Aktivitäten umfasst, wird die Aktivität mit der höchsten Z-Reihenfolge fortgesetzt und die anderen werden pausiert.

Konfigurationsänderungen

Wenn der Nutzer eine Anwendung in den Mehrfenstermodus versetzt, benachrichtigt das System die Aktivität einer Konfigurationsänderung, wie unter Konfigurationsänderungen verarbeiten beschrieben. Dies ist auch der Fall, wenn der Nutzer die Größe der App ändert oder sie wieder in den Vollbildmodus versetzt.

Im Wesentlichen hat diese Änderung dieselben Auswirkungen auf den Aktivitätslebenszyklus wie wenn das System die App benachrichtigt, dass das Gerät vom Hochformat zum Querformat gewechselt wurde. Der einzige Unterschied ist, dass die Geräteabmessungen nicht einfach nur vertauscht werden. Wie unter Konfigurationsänderungen verarbeiten beschrieben, kann Ihre Aktivität die Konfigurationsänderung selbst verarbeiten oder dem System ermöglichen, die Aktivität zu löschen und mit den neuen Dimensionen neu zu erstellen.

Wenn der Nutzer die Größe eines Fensters ändert und es in einer Dimension größer macht, passt das System die Aktivität an die Nutzeraktion an und nimmt nach Bedarf Konfigurationsänderungen vor. Wenn die App beim Zeichnen in neu exponierten Bereichen hinterherhinkt, füllt das System diese vorübergehend mit der Farbe aus, die über das Attribut windowBackground oder das Standardattribut windowBackgroundFallback festgelegt wurde.

Exklusiver Ressourcenzugriff

Zur Unterstützung der Funktion für mehrere Fortsetzungen wurde der neue Lebenszyklus-Callback onTopResumedActivityChanged() eingeführt.

Diese Methode wird aufgerufen, wenn eine Aktivität die oberste Position der fortgesetzten Aktivität erreicht oder verliert. Das ist wichtig zu wissen, wenn eine Aktivität eine gemeinsame Singleton-Ressource verwendet, z. B. das Mikrofon oder die Kamera.

Kotlin

override fun onTopResumedActivityChanged(topResumed: Boolean) {
    if (topResumed) {
        // Top resumed activity
        // Can be a signal to re-acquire exclusive resources
    } else {
        // No longer the top resumed activity
    }
}

Java

@Override
public void onTopResumedActivityChanged(boolean topResumed) {
    if (topResumed) {
        // Top resumed activity
        // Can be a signal to re-acquire exclusive resources
    } else {
        // No longer the top resumed activity
    }
}

Beachten Sie, dass in einer Anwendung aus anderen Gründen Ressourcen verloren gehen können, z. B. durch das Entfernen einer gemeinsam genutzten Hardware.

In jedem Fall sollte eine Anwendung mit Ereignissen und Statusänderungen umgehen, die sich auf verfügbare Ressourcen auswirken.

Bei Apps, die eine Kamera verwenden, gibt CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() einen Hinweis darauf, dass du versuchen solltest, Zugriff auf die Kamera zu erhalten. Diese Methode ist ab Android 10 (API-Level 29) verfügbar.

Beachten Sie, dass resizeableActivity=false keine Garantie für exklusiven Kamerazugriff ist, da andere Apps, die die Kamera verwenden, auf anderen Displays geöffnet werden können.

Abbildung 2. Kamera im Mehrfenstermodus.

Ihre App muss die Kamera nicht loslassen, wenn sie im Fokus ist. Angenommen, Sie möchten die Kameravorschau fortsetzen, während der Nutzer mit der neu fokussierten, fortgesetzten App interagiert. Ihre App kann die Kamera weiterhin ausführen, wenn es nicht die oberste fortgesetzte App ist, aber sie muss den Verbindungsfall richtig handhaben. Wenn die oberste fortgesetzte App die Kamera verwenden möchte, kann sie sie öffnen und Ihre App hat keinen Zugriff mehr. Die App kann die Kamera wieder öffnen, wenn der Fokus wieder liegt.

Nachdem eine App einen CameraDevice.StateCallback#onDisconnected()-Callback empfangen hat, wird bei nachfolgenden Aufrufen auf dem Kameragerät ein CameraAccessException-Objekt ausgelöst.

Multi-Display

Android 10 (API-Level 29) unterstützt Aktivitäten auf sekundären Displays. Wenn eine Aktivität auf einem Gerät mit mehreren Bildschirmen ausgeführt wird, können Nutzer sie von einer Anzeige auf eine andere verschieben. Multi-Resume gilt auch für Multiscreen-Szenarien. Mehrere Aktivitäten können gleichzeitig Nutzereingaben erhalten.

Eine App kann festlegen, in welcher Anzeige sie beim Start oder beim Erstellen einer anderen Aktivität ausgeführt werden soll. Dieses Verhalten hängt vom Startmodus der Aktivität ab, der in der Manifestdatei definiert ist, sowie von den Intent-Flags und Optionen, die von der Entität festgelegt werden, die die Aktivität startet. Weitere Informationen findest du unter ActivityOptions.

Wenn eine Aktivität in eine sekundäre Anzeige verschoben wird, kann sie eine Kontextaktualisierung, eine Größenanpassung des Fensters sowie Konfigurations- und Ressourcenänderungen durchlaufen. Wenn die Aktivität die Konfigurationsänderung verarbeitet, wird sie in onConfigurationChanged() benachrichtigt. Andernfalls wird die Aktivität neu gestartet.

Für eine Aktivität sollte die aktuelle Anzeige in onCreate und onConfigurationChanged geprüft werden, wenn die Konfigurationsänderung verarbeitet wird. Aktualisieren Sie die Ressourcen und Layouts, wenn sich die Anzeige ändert.

Wenn der ausgewählte Startmodus für eine Aktivität mehrere Instanzen zulässt, kann beim Starten auf einem sekundären Bildschirm eine neue Instanz der Aktivität erstellt werden. Beide Aktivitäten werden gleichzeitig fortgesetzt.

Abbildung 3: Mehrere Instanzen einer Aktivität auf mehreren Displays.

Informieren Sie sich auch über die APIs für mehrere Displays, die in Android 8.0 eingeführt wurden.

Aktivitäts- und Anwendungskontext im Vergleich

Bei Multi-Display-Anzeigen ist es entscheidend, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen unterscheidet sich der Aktivitätskontext (der angezeigt wird) vom Anwendungskontext (der nicht der Fall ist).

Der Aktivitätskontext enthält Informationen zur Anzeige und wird immer an den Anzeigebereich angepasst, in dem die Aktivität angezeigt wird. Auf diese Weise erhalten Sie die richtigen Informationen über die aktuelle Anzeigedichte oder Fenstermesswerte Ihrer App. Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwenden, um Informationen zum aktuellen Fenster oder zur aktuellen Anzeige zu erhalten. Dies betrifft auch einige System-APIs, die Informationen aus dem Kontext verwenden (z. B. siehe Toasts-Übersicht).

Die Konfiguration des Aktivitätsfensters und die übergeordnete Anzeige definieren Ressourcen und Kontext. So rufen Sie die aktuelle Anzeige ab:

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

Rufen Sie die aktuellen Messwerte zum Aktivitätsfenster ab:

Kotlin

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Java

WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();

Rufen Sie die maximalen Fenstermesswerte für die aktuelle Systemkonfiguration ab:

Kotlin

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

Java

WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();

Die maximalen Fenstermesswerte dienen zum Durchführen von Berechnungen, Layoutentscheidungen oder zum Ermitteln der Größe der Ressourcen, die im Voraus abgerufen werden sollen. Wenn dies in onCreate() verfügbar ist, können Sie diese Entscheidungen vor dem ersten Layout-Durchlauf treffen. Diese Messwerte sollten nicht für das Layout bestimmter Ansichtselemente verwendet werden. Nutzen Sie stattdessen Informationen aus dem Configuration-Objekt.

Display-Aussparungen

Faltbare Geräte haben möglicherweise eine andere Aussparungsgeometrie, wenn sie auf- und zugeklappt sind. Informationen zur Vermeidung von Problemen mit Aussparungen finden Sie unter Best Practices für die Unterstützung von Display-Aussparungen.

Sekundäre Displays

Sie können die verfügbaren Bildschirme über den Systemdienst DisplayManager abrufen:

Kotlin

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()

Java

DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = displayManager.getDisplays();

Verwenden Sie die Klasse Display, um Informationen zu einer bestimmten Anzeige abzurufen, z. B. die Anzeigegröße oder Flags, die angeben, ob eine Anzeige sicher ist. Gehen Sie jedoch nicht davon aus, dass die Anzeigegröße mit der Anzeigefläche übereinstimmt, die Ihrer Anwendung zugewiesen ist. Denken Sie daran, dass Ihre Anwendung im Mehrfenstermodus einen Teil des Bildschirms einnimmt.

Bestimmen Sie, ob eine Aktivität auf einem Display gestartet werden kann:

Kotlin

val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)

Java

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);

Starten Sie dann die Aktivität auf dem Display:

Kotlin

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId)
startActivity(intent, options.toBundle())

Java

ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(targetDisplay.displayId);
startActivity(intent, options.toBundle());

Multi-Display-Unterstützung

Android bietet Multi-Display-Unterstützung für Softwaretastaturen, Hintergründe und Launcher.

Softwaretastatur

Eine Tastatur kann auf einem sekundären Bildschirm angezeigt werden, wenn der Bildschirm für die Systemgestaltung konfiguriert ist. Der Editor für Eingabemethoden wird automatisch angezeigt, wenn ein Textfeld auf dieser Anzeige Eingaben anfordert.

Abbildung 4: Tastatur auf einem zweiten Display.

Hintergründe

In Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Das Framework erstellt für jede Anzeige eine separate Instanz von WallpaperService.Engine. Die Oberfläche jeder Suchmaschine muss unabhängig voneinander gezeichnet werden. Entwickler können Assets mit dem Anzeigekontext in WallpaperService.Engine#getDisplayContext() laden. Achten Sie außerdem darauf, dass die Datei WallpaperInfo.xml auf android:supportsMultipleDisplays="true" gesetzt ist.

Abbildung 5: Hintergrund auf Smartphone und sekundärem Display.

Launcher

Die neue Intent-Filterkategorie SECONDARY_HOME bietet eine dedizierte Aktivität für sekundäre Bildschirme. Instanzen der Aktivität werden auf allen Displays verwendet, die Systemdesigns unterstützen, und zwar eine pro Bildschirm.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

Die Aktivität muss einen Startmodus haben, der mehrere Instanzen nicht verhindert und sich an verschiedene Bildschirmgrößen anpassen kann. Der Startmodus darf nicht singleInstance oder singleTask sein.

Beispielsweise unterstützt die AOSP-Implementierung von Launcher3 die Aktivität SECONDARY_HOME.

Abbildung 6. Material Design-Launcher auf einem Smartphone
Abbildung 7. Material Design-Launcher auf einem zweiten Display

Fenstermesswerte

Mit Android 11 (API-Level 30) wurden die folgenden WindowManager-Methoden eingeführt, um die Grenzen von Apps bereitzustellen, die im Mehrfenstermodus ausgeführt werden:

Die Methoden der Jetpack-WindowManager-Bibliothek computeCurrentWindowMetrics() und computeMaximumWindowMetrics() bieten jeweils ähnliche Funktionen, sind jedoch abwärtskompatibel auf API-Level 14.

So rufen Sie Messwerte für andere als die aktuelle Anzeige ab:

  • Anzeigekontext erstellen
  • Fensterkontext für die Anzeige erstellen
  • WindowManager des Fensterkontexts abrufen
  • WindowMetrics der maximal für die App verfügbaren Anzeigefläche abrufen

Kotlin

val windowMetrics = context.createDisplayContext(display)
                    .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                    .getSystemService(WindowManager::class.java)
                    .maximumWindowMetrics

Java

WindowMetrics windowMetrics = context.createDisplayContext(display)
                              .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                              .getSystemService(WindowManager.class)
                              .getMaximumWindowMetrics();

Verworfene Methoden

Die Display-Methoden getSize() und getMetrics() wurden in API-Level 30 zugunsten der neuen WindowManager-Methoden eingestellt.

In Android 12 (API-Level 31) werden die Display-Methoden getRealSize() und getRealMetrics() eingestellt. Das Verhalten wird entsprechend aktualisiert, um dem Verhalten von getMaximumWindowMetrics() besser zu entsprechen.

Konfiguration des Mehrfenstermodus

Wenn deine App auf Android 7.0 (API-Level 24) oder höher ausgerichtet ist, kannst du konfigurieren, wie und ob die App-Aktivitäten den Mehrfenstermodus unterstützen. Sie können in Ihrem Manifest Attribute festlegen, um sowohl die Größe als auch das Layout zu steuern. Die Attributeinstellungen einer Stammaktivität gelten für alle Aktivitäten innerhalb ihres Aufgabenstapels. Wenn für die Root-Aktivität beispielsweise android:resizeableActivity="true" festgelegt ist, kann die Größe aller Aktivitäten im Aufgabenstapel angepasst werden. Auf einigen größeren Geräten wie Chromebooks wird Ihre Anwendung möglicherweise auch dann in einem Fenster mit anpassbarer Größe ausgeführt, wenn Sie android:resizeableActivity="false" angeben. Sollte deine App dadurch nicht mehr funktionieren, kannst du die Verfügbarkeit der App mithilfe von Filtern auf solchen Geräten einschränken.

Unter Android 12 (API-Level 31) ist standardmäßig der Mehrfenstermodus aktiviert. Auf großen Bildschirmen (sw >= 600 dp) werden alle Anwendungen unabhängig von der Anwendungskonfiguration im Mehrfenstermodus ausgeführt. Auf kleinen Bildschirmen prüft das System die Einstellungen für minWidth, minHeight und resizeableActivity einer Aktivität, um festzustellen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann.

anpassbare Aktivität

Legen Sie dieses Attribut im Element <activity> oder <application> Ihres Manifests fest, um den Mehrfenstermodus für API-Level 30 und niedriger zu aktivieren oder zu deaktivieren:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />

Wenn dieses Attribut auf „true“ gesetzt ist, kann die Aktivität im Splitscreen-Modus oder im freien Format gestartet werden. Wenn das Attribut auf „false“ gesetzt ist, unterstützt die Aktivität den Mehrfenstermodus nicht. Wenn dieser Wert „false“ ist und der Nutzer versucht, die Aktivität im Mehrfenstermodus zu starten, übernimmt die Aktivität den Vollbildmodus.

Wenn Ihre App auf API-Level 24 oder höher ausgerichtet ist, Sie aber keinen Wert für dieses Attribut angeben, wird der Wert des Attributs standardmäßig auf „wahr“ gesetzt.

Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist, funktioniert dieses Attribut auf kleinen und großen Bildschirmen unterschiedlich:

  • Große Bildschirme (≥ 600 dp): Alle Apps unterstützen den Mehrfenstermodus. Das Attribut gibt an, ob die Größe einer Aktivität angepasst werden kann. Wenn resizeableActivity="false", wird die App in den Kompatibilitätsmodus versetzt, wenn dies erforderlich ist, um Anzeigeabmessungen anzupassen.
  • Kleine Bildschirme (sw < 600 dp): Wenn resizeableActivity="true" und die Mindestbreite und die Mindesthöhe der Aktivität innerhalb der Anforderungen für den Mehrfenstermodus liegen, unterstützt die Aktivität den Mehrfenstermodus. Bei resizeableActivity="false" unterstützt die Aktivität den Mehrfenstermodus unabhängig von der Mindestbreite und -höhe der Aktivität nicht.

unterstützt „Bild im Bild“

Lege dieses Attribut im Knoten <activity> deines Manifests fest, um anzugeben, ob die Aktivität den Bild-im-Bild-Modus unterstützt.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

ConfigChanges

Wenn Sie die Konfigurationsänderungen im Mehrfenstermodus selbst verarbeiten möchten, z. B. wenn ein Nutzer die Größe eines Fensters ändert, fügen Sie dem Knoten des Anwendungsmanifests <activity> das Attribut android:configChanges mit mindestens den folgenden Werten hinzu:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

Nachdem Sie android:configChanges hinzugefügt haben, erhalten Ihre Aktivität und Ihre Fragmente einen Callback an onConfigurationChanged(), anstatt gelöscht und neu erstellt zu werden. Anschließend können Sie die Ansichten bei Bedarf manuell aktualisieren, Ressourcen neu laden und andere Vorgänge ausführen.

<Layout>

Unter Android 7.0 (API-Level 24) und höher unterstützt das <layout>-Manifestelement mehrere Attribute, die sich auf das Verhalten einer Aktivität im Mehrfenstermodus auswirken:

android:defaultHeight, android:defaultWidth
Standardhöhe und -breite der Aktivität beim Start im Freiformmodus.
android:gravity
Erste Platzierung der Aktivität beim Start im Freiformmodus. Passende Werte finden Sie unter Gravity.
android:minHeight, android:minWidth
Mindesthöhe und Mindestbreite für die Aktivität im geteilten Bildschirmmodus und im Freiformmodus. Wenn der Nutzer die Trennlinie im geteilten Bildschirmmodus bewegt, um eine Aktivität kleiner als das angegebene Minimum zu machen, schneidet das System die Aktivität auf die vom Nutzer angeforderte Größe zu.

Der folgende Code zeigt, wie Sie die Standardgröße und den Standardort einer Aktivität sowie ihre Mindestgröße angeben, wenn die Aktivität im Freiformmodus angezeigt wird:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

Mehrfenstermodus während der Laufzeit

Ab Android 7.0 bietet das System Funktionen zur Unterstützung von Apps, die im Mehrfenstermodus ausgeführt werden können.

Deaktivierte Funktionen im Mehrfenstermodus

Im Mehrfenstermodus werden von Android möglicherweise Funktionen deaktiviert oder ignoriert, die nicht für eine Aktivität gelten, bei der der Gerätebildschirm mit anderen Aktivitäten oder Apps geteilt wird.

Außerdem sind einige Anpassungsoptionen für die System-UI deaktiviert. Beispielsweise können Apps die Statusleiste nicht ausblenden, wenn sie im Mehrfenstermodus ausgeführt werden. Weitere Informationen finden Sie unter Sichtbarkeit der System-UI steuern.

Änderungen am Attribut android:screenOrientation werden vom System ignoriert.

Abfragen und Callbacks im Mehrfenstermodus

Die Klasse Activity bietet die folgenden Methoden zur Unterstützung des Mehrfenstermodus:

isInMultiWindowMode()
Gibt an, ob sich die Aktivität im Mehrfenstermodus befindet.
isInPictureInPictureMode()

Gibt an, ob die Aktivität im Bild-im-Bild-Modus ist.

Hinweis:Der Bild-im-Bild-Modus ist ein Sonderfall des Mehrfenstermodus. Wenn myActivity.isInPictureInPictureMode() „true“ zurückgibt, gibt myActivity.isInMultiWindowMode() auch „true“ zurück.

onMultiWindowModeChanged()
Das System ruft diese Methode immer dann auf, wenn die Aktivität den Mehrfenstermodus aktiviert oder verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Mehrfenstermodus wechselt, oder den Wert „false“, wenn die Aktivität den Mehrfenstermodus verlässt.
onPictureInPictureModeChanged()
Das System ruft diese Methode immer dann auf, wenn die Aktivität in den Bild-im-Bild-Modus wechselt oder diesen wieder verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Bild-im-Bild-Modus wechselt, oder den Wert „false“, wenn die Aktivität den Bild-im-Bild-Modus verlässt.

Die Klasse Fragment stellt Versionen vieler dieser Methoden bereit, z. B. Fragment.onMultiWindowModeChanged().

Bild-im-Bild-Modus

Wenn du eine Aktivität in den Bild-im-Bild-Modus versetzen möchtest, kannst du enterPictureInPictureMode() aufrufen. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen findest du unter Unterstützung von Bild im Bild.

Neue Aktivitäten im Mehrfenstermodus

Wenn Sie eine neue Aktivität starten, können Sie angeben, dass die neue Aktivität nach Möglichkeit neben der aktuellen Aktivität angezeigt werden soll. Verwenden Sie das Intent-Flag FLAG_ACTIVITY_LAUNCH_ADJACENT, das das System anweist, die neue Aktivität in einem angrenzenden Fenster zu erstellen, damit beide Aktivitäten den Bildschirm gemeinsam nutzen. Das System versucht, dies zu tun, aber dies kann nicht garantiert werden.

Wenn sich ein Gerät im Freiformmodus befindet und Sie eine neue Aktivität starten, können Sie die Abmessungen und die Bildschirmposition der neuen Aktivität durch Aufrufen von ActivityOptions.setLaunchBounds() angeben. Diese Methode hat keine Auswirkungen, wenn sich das Gerät nicht im Mehrfenstermodus befindet.

Wenn Sie auf API-Ebene 30 und niedriger eine Aktivität innerhalb eines Aufgabenstacks starten, ersetzt die Aktivität die Aktivität auf dem Bildschirm und übernimmt alle ihre Mehrfenstereigenschaften. Wenn Sie die neue Aktivität als separates Fenster im Mehrfenstermodus starten möchten, müssen Sie sie in einem neuen Aufgabenstapel starten.

Mit Android 12 (API-Level 31) können Apps das Aufgabenfenster einer App auf mehrere Aktivitäten aufteilen. Durch Erstellen einer XML-Konfigurationsdatei oder Jetpack WindowManager API-Aufrufe können Sie festlegen, wie die Aktivitäten Ihrer Anwendung im Vollbildmodus, nebeneinander oder gestapelt angezeigt werden.

Drag-and-Drop

Nutzer können Daten per Drag-and-drop von einer Aktivität in eine andere ziehen, während beide Aktivitäten den Bildschirm teilen. Vor Android 7.0 konnten Nutzer Daten nur innerhalb einer einzelnen Aktivität per Drag-and-drop verschieben. Wenn Sie schnell Unterstützung für das Akzeptieren gelöschter Inhalte hinzufügen möchten, können Sie die DropHelper API lesen. Eine umfassende Anleitung zum Drag-and-drop finden Sie unter Drag-and-drop.

Mehrere Instanzen

Jede Stammaktivität hat eine eigene Aufgabe, die in einem separaten Prozess ausgeführt wird und in einem eigenen Fenster angezeigt wird. Wenn Sie eine neue Instanz der Anwendung in einem separaten Fenster starten möchten, können Sie mit dem Flag FLAG_ACTIVITY_NEW_TASK neue Aktivitäten starten. Sie können dies mit einigen der Mehrfensterattribute kombinieren, um eine bestimmte Position für das neue Fenster anzufordern. Eine Shopping-App kann beispielsweise mehrere Fenster anzeigen, um Produkte zu vergleichen.

Unter Android 12 (API-Level 31) kannst du zwei Instanzen einer Aktivität nebeneinander im selben Aufgabenfenster starten.

Wenn Sie Nutzern erlauben möchten, eine andere Instanz Ihrer App über den App Launcher oder die Taskleiste zu starten, müssen Ihre Launcher-Aktivitäten android:resizeableActivity="true" festlegen und keinen Startmodus verwenden, der mehrere Instanzen verhindert. Beispielsweise kann eine singleInstancePerTask-Aktivität mehrmals in verschiedenen Aufgaben instanziiert werden, wenn FLAG_ACTIVITY_MULTIPLE_TASK oder FLAG_ACTIVITY_NEW_DOCUMENT festgelegt ist.

Verwechseln Sie nicht mehrere Instanzen mit einem Layout mit mehreren Steuerfeldern, z. B. einer Präsentation mit Details, die SlidingPaneLayout verwendet und in einem einzelnen Fenster ausgeführt wird.

Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden, kann eine oder mehrere Instanzen in den Hintergrund verschoben werden, wenn sich der Sicherheitsstatus ändert. Angenommen, ein Gerät ist aufgeklappt mit zwei App-Instanzen, die in zwei Fenstern auf beiden Seiten des Fold ausgeführt werden. Wird das Gerät zugeklappt, wird möglicherweise eine der Instanzen beendet, anstatt zu versuchen, die Fenster für beide Instanzen auf einen kleineren Bildschirm anzupassen.

Bestätigung im Mehrfenstermodus

Unabhängig davon, ob Ihre App auf API-Level 24 oder höher ausgerichtet ist, sollten Sie prüfen, wie sie sich im Mehrfenstermodus verhält, wenn ein Nutzer versucht, sie auf einem Gerät mit Android 7.0 oder höher im Mehrfenstermodus zu starten.

Testgeräte

Geräte mit Android 7.0 (API-Level 24) oder höher unterstützen den Mehrfenstermodus.

API-Level 23 oder niedriger

Wenn Nutzer versuchen, die App im Mehrfenstermodus zu verwenden, ändert das System die Größe der App erzwungen, sofern die App keine feste Ausrichtung deklariert.

Wenn für deine App keine feste Ausrichtung deklariert ist, solltest du sie auf einem Gerät mit Android 7.0 oder höher starten und versuchen, die App in den geteilten Bildschirmmodus zu versetzen. Prüfen Sie, ob die Größe der Anwendung akzeptabel ist, wenn die Größe der Anwendung erzwungen wird.

Wenn die App eine feste Ausrichtung deklariert, sollten Sie versuchen, die App in den Mehrfenstermodus zu versetzen. Die App muss dabei im Vollbildmodus bleiben.

API-Ebenen 24 bis 30

Wenn Ihre App auf API-Level 24 bis 30 ausgerichtet ist und die Unterstützung des Mehrfenstermodus nicht deaktiviert, prüfen Sie das folgende Verhalten sowohl im Splitscreen-Modus als auch im freien Format:

  • Starte die App im Vollbildmodus und wechsle dann in den Mehrfenstermodus, indem du lange auf die Schaltfläche „Letzte Apps“ drückst. Prüfen Sie, ob der Wechsel der App ordnungsgemäß funktioniert.
  • Starten Sie die App direkt im Mehrfenstermodus und prüfen Sie, ob sie ordnungsgemäß gestartet wird. Du kannst eine App im Mehrfenstermodus starten, indem du die Schaltfläche „Letzte Apps“ drückst, die Titelleiste deiner App lange gedrückt hältst und sie in einen der hervorgehobenen Bereiche auf dem Bildschirm ziehst.
  • Passen Sie die Größe Ihrer App im Splitscreen-Modus an, indem Sie den Bildschirmteiler ziehen. Prüfe, ob die Größe der App ohne Absturz angepasst wird und ob die erforderlichen UI-Elemente sichtbar sind.
  • Wenn du Mindestabmessungen für deine App festgelegt hast, versuche, die Größe der App unter diese Abmessungen zu ändern. Achte darauf, dass die Größe der App nicht kleiner als die angegebenen Mindestabmessungen sein darf.
  • Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Achten Sie beispielsweise darauf, dass die Aktualisierung der UI nach der Größenanpassung der Anwendung nicht zu lange dauert.

API-Level 31 oder höher

Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist und die Mindestbreite und -höhe der Hauptaktivität kleiner oder gleich den Abmessungen des verfügbaren Anzeigebereichs sind, prüfen Sie alle für die API-Ebenen 24 bis 30 aufgeführten Verhaltensweisen.

Checkliste testen

Mit den folgenden Vorgängen können Sie die Leistung Ihrer Anwendung im Mehrfenstermodus prüfen. Sofern nicht anders angegeben, sollten Sie diese Vorgänge sowohl im Splitscreen- als auch im Freiformmodus ausprobieren.

  • Mehrfenstermodus aktivieren und verlassen
  • Wechseln Sie von Ihrer Anwendung zu einer anderen Anwendung und prüfen Sie, ob sich die Anwendung ordnungsgemäß verhält, wenn sie zwar sichtbar, aber nicht aktiv ist. Wenn deine App beispielsweise ein Video wiedergibt, solltest du prüfen, ob das Video weiterhin abgespielt wird, während der Nutzer mit einer anderen App interagiert.
  • Verschieben Sie im geteilten Bildschirmmodus den Bildschirmteiler, um Ihre App größer und kleiner zu machen. Testen Sie diese Vorgänge in beiden parallelen und einer über den anderen Konfigurationen. Achten Sie darauf, dass die App nicht abstürzt, wichtige Funktionen sichtbar sind und der Vorgang zur Größenänderung nicht zu lange dauert.
  • Führen Sie schnell nacheinander mehrere Größenänderungsvorgänge durch. Achten Sie darauf, dass Ihre App nicht abstürzt und keine Speicherlecks verursacht. Der Memory Profiler von Android Studio liefert Informationen zur Arbeitsspeichernutzung Ihrer App (siehe Arbeitsspeichernutzung Ihrer App mit Memory Profiler prüfen).
  • Verwenden Sie Ihre Anwendung normal in einer Reihe verschiedener Fensterkonfigurationen und prüfen Sie, ob sich die Anwendung ordnungsgemäß verhält. Der Text muss lesbar sein und die UI-Elemente dürfen nicht zu klein für die Interaktion sein.

Unterstützung für Mehrfenstermodus deaktiviert

Wenn Sie bei den API-Ebenen 24 bis 30 die Unterstützung des Mehrfenstermodus durch Festlegen von android:resizeableActivity="false" deaktiviert haben, sollten Sie Ihre App auf einem Gerät mit Android 7.0 bis 11 starten und versuchen, sie in den Splitscreen- oder Freiformmodus zu versetzen. Achten Sie darauf, dass die App dabei im Vollbildmodus bleibt.

Zusätzliche Ressourcen

Weitere Informationen zur Unterstützung des Mehrfenstermodus unter Android finden Sie hier: