Unterstützung für Mehrfenstermodus

Mit dem Mehrfenstermodus können mehrere Apps gleichzeitig denselben Bildschirm verwenden. Apps können nebeneinander oder übereinander dargestellt (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) angezeigt werden.

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) wurde der Splitscreen-Modus für kleine Geräte 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. Nutzende können die Trennlinie zur Trennung der beiden Apps ziehen, um eine App 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. Weitere Informationen dazu findest du unter Unterstützung von Bild im Bild.

    • Der Freiformmodus, in dem Nutzer die Größe der einzelnen Aktivitäten kostenlos anpassen können, kann von Herstellern von Geräten mit großen Bildschirmen aktiviert werden.

    Sie können festlegen, wie Ihre App den Mehrfenstermodus handhabt, indem Sie die minimal zulässigen Abmessungen Ihrer Aktivität angeben. Du kannst den Mehrfenstermodus für deine App auch deaktivieren, indem du resizeabableActivity="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) verwendet den Mehrfenstermodus zum Standardverhalten.

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

    • Auf kleinen Bildschirmen (kleinste Breite < 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. Bei resizeableActivity="false" wird die Ausführung der App unabhängig von der Mindestbreite und -höhe im Mehrfenstermodus verhindert.

Splitscreen-Modus

So aktivieren Sie den Splitscreen-Modus:

  1. Öffnen Sie 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ählen Sie auf dem Bildschirm „Letzte Apps“ eine andere App aus oder schließen Sie den Bildschirm „Letzte Apps“ und führen Sie 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 FLAG_ACTIVITY_LAUNCH_ADJACENT verwenden, um den Inhalt in einem angrenzenden Fenster mit geteiltem Bildschirm zu öffnen.

FLAG_ACTIVITY_LAUNCH_ADJACENT wurde in Android 7.0 (API-Level 24) eingeführt, damit Apps, die im Splitscreen-Modus 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 Wiederaufnahmestatus von Apps in mehreren Fenstern variiert jedoch je nach Android-Version.

Multi-Lebenslauf

Android 10 (API-Level 29) und höhere Versionen unterstützen mehrere Fortsetzungen. Alle Aktivitäten bleiben im RESUMED-Status, wenn sich das Gerät im Mehrfenstermodus befindet. Eine Aktivität kann pausiert werden, wenn eine transparente Aktivität über der Aktivität liegt oder die Aktivität nicht fokussierbar ist, z. B. wenn sich die Aktivität im Bild-im-Bild-Modus befindet. 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 und 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 im Status RESUMED. Alle anderen sichtbaren Aktivitäten sind STARTED, sind aber nicht RESUMED. Das System räumt diesen sichtbaren, aber nicht wiederaufgenommenen Aktivitäten jedoch eine höhere Priorität zu als nicht sichtbaren Aktivitäten. 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, mit der Ausnahme, dass die App-Abmessungen geändert werden, anstatt einfach nur vertauscht zu werden. Ihre Aktivität kann die Konfigurationsänderung selbst verarbeiten oder Ihre App kann es 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 in neu exponierten Bereichen etwas später zeichnet, füllt das System diese vorübergehend mit der Farbe aus, die über das Attribut windowBackground oder das Standardattribut windowBackgroundFallback festgelegt wurde.

Exklusiver Ressourcenzugriff

Verwenden Sie den Lebenszyklus-Callback onTopResumedActivityChanged(), um die Funktion für mehrere Fortsetzungen zu unterstützen.

Der Callback wird aufgerufen, wenn eine Aktivität die oberste Position für die fortgesetzte Aktivität erreicht oder verliert. Dies ist wichtig, 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 es eine gute Idee sein könnte, Zugriff auf die Kamera zu erhalten. Diese Methode ist ab Android 10 (API-Level 29) verfügbar.

Beachte, 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 die App den Fokus verliert. Wenn Sie beispielsweise die Kameravorschau fortsetzen möchten, während der Nutzer mit der neu fokussierten wiederaufgenommenen App interagiert, ist es in Ordnung, wenn Ihre App die Kamera weiter ausführt, wenn sie nicht die oberste fortgesetzte App ist, aber sie muss den Fall der Trennung ordnungsgemäß verarbeiten. Wenn die oberste fortgesetzte App die Kamera verwenden möchte, kann sie diese öffnen und Ihre App hat keinen Zugriff mehr. Deine App kann die Kamera wieder öffnen, wenn sie wieder im Fokus ist.

Nachdem eine App einen CameraDevice.StateCallback#onDisconnected()-Callback empfangen hat, wird bei nachfolgenden Anrufen auf dem Kameragerät ein CameraAccessException-Ereignis 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 eine Nutzereingabe 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 finden Sie in der Klasse 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. Wird die Konfigurationsänderung durch die Aktivität verarbeitet, wird die Aktivität 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 Multi-Display-APIs, 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. So erhalten Sie die richtigen Informationen über die Anzeigedichte oder die Fenstermesswerte Ihrer App. Verwenden Sie immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext), um Informationen zum aktuellen Fenster oder zur aktuellen Anzeige abzurufen. Dies betrifft auch einige System-APIs, die Informationen aus dem Kontext verwenden (siehe z. B. 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. Verwenden 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 Display-Aussparungen unterstützen.

Sekundäre Displays

Sie können die verfügbaren Bildschirme über den Systemdienst von 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 dem Anzeigebereich übereinstimmt, der Ihrer App 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 in der Datei WallpaperInfo.xml android:supportsMultipleDisplays="true" festgelegt 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.

Die AOSP-Implementierung von Launcher3 unterstützt beispielsweise eine SECONDARY_HOME-Aktivität.

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 anzugeben, die im Mehrfenstermodus ausgeführt werden:

Die WindowManager-Bibliotheksmethoden computeCurrentWindowMetrics() und computeMaximumWindowMetrics() von Jetpack bieten jeweils ähnliche Funktionen, sind aber abwärtskompatibel zu API-Level 14.

So rufen Sie Messwerte für andere als die aktuelle Anzeige ab (wie im Code-Snippet gezeigt):

  • 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-Ebene 30 zugunsten der neuen WindowManager-Methoden eingestellt.

In Android 12 (API-Level 31) werden die Display-Methoden getRealSize() und getRealMetrics() eingestellt. Außerdem wird ihr Verhalten 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 Stammaktivitä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 App möglicherweise auch dann in einem Fenster mit anpassbarer Größe ausgeführt, wenn Sie android:resizeableActivity="false" angeben. Sollte dies zu Problemen mit deiner App führen, kannst du die Verfügbarkeit der App auf solchen Geräten mithilfe der Filter bei Google Play einschränken.

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

resizeableActivity

Lege dieses Attribut im Element <activity> oder <application> deines 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 der 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 deine App auf API-Level 31 oder höher ausgerichtet ist, funktioniert dieses Attribut auf kleinen und großen Bildschirmen unterschiedlich:

  • Große Bildschirme (sw >= 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.

supportsPictureInPicture

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 App-Manifests <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 Ihre Ansichten manuell aktualisieren, Ressourcen neu laden und andere Vorgänge nach Bedarf ausführen.

<layout>

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

  • android:defaultHeight, android:defaultWidth: Standardhöhe und -breite der Aktivität beim Start im Freiformmodus.

  • android:gravity: anfängliche Platzierung der Aktivität beim Start im Freiformmodus. Geeignete Werte finden Sie in der Klasse 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 Splitscreen-Modus verschiebt, um eine Aktivität kleiner als die angegebene Mindestgröße 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, um den Mehrfenstermodus zu unterstützen:

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

  • isInPictureInPictureMode(): Gibt an, ob die Aktivität im Bild-im-Bild-Modus ist.

  • 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 den Bild-im-Bild-Modus aktiviert oder deaktiviert. 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 von vielen 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, rufe enterPictureInPictureMode() auf. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen findest du unter Videos mit Bild im Bild (BiB) hinzufügen.

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 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 es ist nicht garantiert, dass das passiert.

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 mit ActivityOptions.setLaunchBounds() angeben. Die 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 Ihre Anwendung ihre Aktivitäten im Vollbildmodus, nebeneinander oder gestapelt anzeigt.

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 du schnell Unterstützung für die Annahme von entfernten Inhalten hinzufügen möchtest, rufe die DropHelper API auf. Eine umfassende Anleitung für Drag-and-drop finden Sie unter Drag-and-drop aktivieren.

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. Beispielsweise kann eine Shopping-App mehrere Fenster anzeigen, um Produkte zu vergleichen.

Mit 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 die Verwendung mehrerer 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:

  • Starten Sie die App im Vollbildmodus und wechseln Sie dann in den Mehrfenstermodus, indem Sie lange auf die Schaltfläche Letzte Aufrufe drücken. 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. Sie können eine App im Mehrfenstermodus starten, indem Sie die Schaltfläche Letzte Aufrufe drücken, dann die Titelleiste der App lange gedrückt halten und sie in einen der hervorgehobenen Bereiche auf dem Bildschirm ziehen.

  • 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 so anzupassen, dass das Fenster kleiner als diese Abmessungen ist. Die App darf nicht kleiner als die angegebenen Mindestabmessungen sein.

  • 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 wie vorgesehen funktioniert, wenn sie zwar sichtbar, aber nicht aktiv ist. Wenn in deiner App beispielsweise ein Video wiedergegeben wird, 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 sowohl größer als auch kleiner zu machen. Führen Sie diese Vorgänge sowohl nebeneinander als auch über den anderen Konfigurationen aus. 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 nicht 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. Achte darauf, dass der Text lesbar ist und die UI-Elemente nicht zu klein sind, um mit ihnen zu interagieren.

Unterstützung für Mehrfenstermodus deaktiviert

Wenn Sie bei den API-Levels 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-Modus oder den Freiformmodus zu versetzen. Die App muss dabei im Vollbildmodus bleiben.

Zusätzliche Ressourcen

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

##

Für dich empfohlen

* Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist * Gerätekompatibilitätsmodus * Unterstützt Größenanpassung großer Bildschirme * Konfigurationsänderungen verarbeiten