Mehrfenstermodus unterstützen

Im Multifenstermodus können mehrere Apps gleichzeitig auf demselben Bildschirm angezeigt werden. Apps können nebeneinander oder übereinander angezeigt werden (Splitscreen-Modus), eine App in einem kleinen Fenster, das andere Apps überlagert (Bild-im-Bild-Modus), oder einzelne Apps in separaten, verschiebbaren und veränderbaren Fenstern (Desktopfenster-Modus).

Abbildung 1 Zwei Apps nebeneinander im Splitscreen-Modus anzeigen

Eine Anleitung zum Aufrufen des Splitscreen-Modus auf Smartphones finden Sie unter Zwei Apps gleichzeitig anzeigen lassen – Pixel.

Versionsspezifische Funktionen für mehrere Fenster

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

  • Mit Android 7.0 (API-Ebene 24) wurde der Splitscreen-Modus auf Geräten mit kleinem Display und der Bild-im-Bild-Modus auf ausgewählten Geräten eingeführt.

    • Im Splitscreen-Modus werden zwei Apps auf dem Display angezeigt, entweder nebeneinander oder übereinander. Nutzer können den Trennstrich zwischen den beiden Apps ziehen, um eine App größer und die andere kleiner zu machen.

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

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

      Sie können festlegen, wie Ihre App den Modus mit mehreren Fenstern handhabt, indem Sie die Mindestabmessungen für Ihre 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.

  • Mit Android 8.0 (API-Ebene 26) wird der Bild-im-Bild-Modus auf Geräte mit kleinem Bildschirm ausgeweitet.

  • Android 12 (API-Level 31) verwendet den Mehrfenstermodus zum Standardverhalten.

    • Auf großen Bildschirmen (Klasse mittlere Fenster oder maximiertes Fenster) unterstützt die Plattform unabhängig von der Anwendungskonfiguration alle Anwendungen im Mehrfenstermodus. Wenn resizeableActivity="false", wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen zu berücksichtigen.

    • Auf kleinen Bildschirmen (Fenstergrößenklasse kompakt) prüft das System die minWidth und minHeight einer Aktivität, um festzustellen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann. Wenn resizeableActivity="false" festgelegt ist, wird die Ausführung der App im Mehrfenstermodus unabhängig von der Mindestbreite und ‑höhe verhindert.

Splitscreen-Modus

So aktivieren Nutzer den Splitscreen-Modus:

  1. Öffnen Sie den Bildschirm „Letzte Apps“.
  2. Apps in den Blickfeld wischen
  3. Drücken Sie in der Titelleiste der App auf das App-Symbol.
  4. Menüoption für 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 starten Sie eine andere App.

Nutzer beenden den Splitscreen-Modus, indem sie die Fenstertrennlinie zum Rand des Displays ziehen – nach oben oder unten, links oder rechts.

Nebeneinander starten

Wenn Ihre App über einen Intent auf Inhalte zugreifen muss, können Sie mit FLAG_ACTIVITY_LAUNCH_ADJACENT die Inhalte in einem nebeneinander liegenden Splitscreen-Fenster ö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.

Wenn Sie eine benachbarte Aktivität starten möchten, verwenden Sie FLAG_ACTIVITY_LAUNCH_ADJACENT in Kombination mit FLAG_ACTIVITY_NEW_TASK, z. B.:

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 Modus mit mehreren Fenstern ändert den Aktivitätszyklus nicht. Der fortgesetzte Status von Apps in mehreren Fenstern unterscheidet sich jedoch bei verschiedenen Android-Versionen.

Mehrere Fortsetzungen

Android 10 (API-Level 29) und höher unterstützen die Wiederaufnahme mehrerer Apps. Alle Aktivitäten bleiben im Status RESUMED, wenn sich das Gerät im Multifenstermodus befindet. Eine Aktivität kann pausiert werden, wenn eine transparente Aktivität darüber liegt oder die Aktivität nicht fokussiert werden kann, z. B. wenn sie sich 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. Wenn Sie die Wiederaufnahme mehrerer App-Instanzen auf Android 9-Geräten aktivieren möchten, fügen Sie die folgenden Manifest-Metadaten hinzu:

<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 oberste und ist die einzige Aktivität im Status RESUMED. Alle anderen sichtbaren Aktivitäten sind STARTED, 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 Aktivität fortgesetzt und die zuvor oberste Aktivität wechselt in 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 App in den Multifenstermodus versetzt, benachrichtigt das System die Aktivität einer Konfigurationsänderung, wie unter Konfigurationsänderungen verarbeiten angegeben. Das passiert auch, 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 dem System erlauben, 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 der beiden Dimensionen vergrößert, passt das System die Größe der Aktivität an die Nutzeraktion an und nimmt bei Bedarf Konfigurationsänderungen vor. Wenn die App bei der Darstellung neu sichtbarer Bereiche hinterherhinkt, füllt das System diese Bereiche vorübergehend mit der Farbe aus, die durch das Attribut windowBackground oder durch das Standardstilattribut windowBackgroundFallback angegeben ist.

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 Position der aktuell fortgesetzten Aktivität gewinnt oder verliert. Das ist wichtig, wenn eine Aktivität eine freigegebene Singleton-Ressource wie das Mikrofon oder die Kamera verwendet:

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 App Ereignisse und Statusänderungen, die sich auf die verfügbaren Ressourcen auswirken, ordnungsgemäß verarbeiten.

Bei Apps, die eine Kamera verwenden, ist CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() ein Hinweis darauf, dass es ein guter Zeitpunkt sein könnte, den Zugriff auf die Kamera zu versuchen. Diese Methode ist ab Android 10 (API-Level 29) verfügbar.

Denken Sie daran, dass resizeableActivity=false keinen exklusiven Zugriff auf die Kamera garantiert, 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. Beispielsweise kann die Kameravorschau fortgesetzt werden, während der Nutzer mit der App interagiert, die gerade im Vordergrund ist. Es ist in Ordnung, wenn Ihre App die Kamera weiter verwendet, wenn sie nicht die App im Vordergrund ist, die gerade fortgesetzt wird. Sie muss jedoch den Fall der Verbindungsunterbrechung ordnungsgemäß behandeln. 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 erhalten hat, wird bei nachfolgenden Aufrufen des Kamerageräts eine CameraAccessException geworfen.

Mehrfachanzeige

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

Eine App kann beim Starten oder beim Erstellen einer anderen Aktivität angeben, auf welchem Display sie ausgeführt werden soll. Dieses Verhalten hängt vom in der Manifestdatei definierten Aktivitätsstartmodus und von den Intent-Flags und -Optionen ab, die von der Entität festgelegt wurden, die die Aktivität startet. Weitere Informationen finden Sie in der Klasse ActivityOptions.

Wenn eine Aktivität auf ein sekundäres Display verschoben wird, kann es zu einem Kontextupdate, einer Fenstergrößenänderung sowie zu Konfigurations- und Ressourcenänderungen kommen. Wenn die Aktivität die Konfigurationsänderung verarbeitet, wird sie in onConfigurationChanged() benachrichtigt. Andernfalls wird die Aktivität neu gestartet.

Eine Aktivität sollte das aktuelle Display in onCreate() und onConfigurationChanged() prüfen, wenn die Konfigurationsänderung verarbeitet wird. Aktualisieren Sie die Ressourcen und Layouts, wenn sich das Display ändert.

Wenn der ausgewählte Startmodus für eine Aktivität mehrere Instanzen zulässt, kann durch das 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.

Lesen Sie auch die Informationen zu den 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 zum Display und wird immer an den Displaybereich angepasst, in dem die Aktivität angezeigt wird. So erhalten Sie die richtigen Informationen zur Displaydichte oder zu den Fenstermesswerten Ihrer App. Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwenden, um Informationen zum aktuellen Fenster oder Display zu erhalten. Das betrifft auch einige System-APIs, die Informationen aus dem Kontext verwenden (siehe z. B. Übersicht über Toasts).

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

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

Messwerte für das aktuelle Aktivitätsfenster abrufen:

Kotlin

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

Java

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

Maximalfenstermesswerte für die aktuelle Systemkonfiguration abrufen:

Kotlin

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

Java

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

Die Messwerte für das maximale Fenster dienen dazu, Berechnungen durchzuführen, Layoutentscheidungen zu treffen oder die Größe der Ressourcen zu bestimmen, die vorab 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

Bei faltbaren Geräten kann die Aussparung im zusammengeklappten und im aufgeklappten Zustand unterschiedlich sein. Informationen dazu, wie Sie Probleme mit Display-Aussparungen vermeiden, 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. Angenommen werden darf jedoch nicht, dass die Displaygröße mit dem Ihrer Anwendung zugewiesenen Anzeigebereich übereinstimmt. Denken Sie daran, dass Ihre App im Multifenstermodus einen Teil des Displays einnimmt.

So legen Sie fest, 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());

Unterstützung für mehrere Displays

Android unterstützt die Multi-Display-Funktion für Softwaretastaturen, Hintergründe und Launcher.

Softwaretastatur

Eine Tastatur kann auf einem sekundären Bildschirm angezeigt werden, wenn das Display so konfiguriert ist, dass Systemdekorationen unterstützt werden. Der Editor für Eingabemethoden wird automatisch angezeigt, wenn ein Textfeld auf dieser Anzeige Eingaben anfordert.

Abbildung 4: Tastatur auf einem zweiten Bildschirm.

Hintergründe

Unter 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. Achten Sie darauf, dass die Oberfläche der einzelnen Motoren unabhängig voneinander gezeichnet wird. Entwickler können Assets mithilfe des Displaykontexts 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 Systemdekorationen unterstützen, jeweils eine pro Display.

<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 unterschiedliche 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 sekundären Display

Messwerte für Zeitfenster

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 Methoden computeCurrentWindowMetrics() und computeMaximumWindowMetrics() der Jetpack WindowManager-Bibliothek bieten ähnliche Funktionen, sind aber abwärtskompatibel mit API-Ebene 14.

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

  • Displaykontext erstellen
  • Fensterkontext für das Display erstellen
  • WindowManager des Fensterkontexts abrufen
  • WindowMetrics des maximalen Anzeigebereichs abrufen, der für die App verfügbar ist

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();

Eingestellte 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 Ihre App auf Android 7.0 (API-Level 24) oder höher ausgerichtet ist, können Sie konfigurieren, wie und ob die Aktivitäten Ihrer App den Mehrfenstermodus unterstützen. Sie können Attribute in Ihrem Manifest festlegen, um sowohl Größe als auch Layout zu steuern. Die Attributeinstellungen einer Stammaktivität gelten für alle Aktivitäten innerhalb ihres Aufgabenstapels. Wenn die Stammaktivität beispielsweise android:resizeableActivity="true" hat, können alle Aktivitäten im Aufgabenstapel neu skaliert werden. Auf einigen größeren Geräten wie Chromebooks wird Ihre App möglicherweise in einem Fenster ausgeführt, das sich ändern lässt, auch wenn Sie android:resizeableActivity="false" angeben. Wenn dies zu Problemen mit Ihrer App führt, können Sie mit Filtern bei Google Play die Verfügbarkeit Ihrer App auf solchen Geräten einschränken.

Unter Android 12 (API-Level 31) ist standardmäßig der Mehrfenstermodus aktiviert. Auf großen Bildschirmen (mittel oder erweitert) werden alle Apps unabhängig von der App-Konfiguration im Multifenstermodus 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 Multifenstermodus ausgeführt werden kann.

resizeableActivity

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 Desktop-Fenstermodus gestartet werden. Wenn das Attribut auf false gesetzt ist, unterstützt die Aktivität keinen Multifenstermodus. Wenn der Wert „false“ ist und der Nutzer versucht, die Aktivität im Mehrfenstermodus zu starten, übernimmt die Aktivität den gesamten Bildschirm.

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

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 (Fenstergrößenklasse mittel oder erweitert): Alle Apps unterstützen den Multifenstermodus. Das Attribut gibt an, ob die Größe einer Aktivität geändert werden kann. Bei resizeableActivity="false" wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen einzuhalten.
  • Kleine Bildschirme (Kompakt-Fenstergrößenklasse): Wenn resizeableActivity="true" und die Mindestbreite und Mindesthöhe der Aktivität die Anforderungen für den Multifenstermodus erfüllen, unterstützt die Aktivität den Multifenstermodus. Wenn resizeableActivity="false", wird der Modus mit mehreren Fenstern unabhängig von der Mindestbreite und -höhe der Aktivität nicht unterstützt.

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 du android:configChanges hinzugefügt hast, erhalten deine Aktivitäten und Fragmente einen Callback zu 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 Manifest-Element <layout> mehrere Attribute, die sich auf das Verhalten einer Aktivität im Mehrfenstermodus auswirken:

  • android:defaultHeight, android:defaultWidth: Standardhöhe und -breite der Aktivität, wenn sie im Fenstermodus (Desktop) gestartet wird.

  • android:gravity: anfängliche Platzierung der Aktivität beim Start im Windowing-Modus für Computer. Geeignete Werte finden Sie in der Klasse Gravity.

  • android:minHeight, android:minWidth: Mindesthöhe und Mindestbreite für die Aktivität im Splitscreen- und Desktopfenstermodus. Wenn der Nutzer die Trennlinie im Splitscreen-Modus verschiebt, um eine Aktivität kleiner als die angegebene Mindestgröße zu machen, wird die Aktivität vom System auf die vom Nutzer angeforderte Größe zugeschnitten.

Im folgenden Code wird gezeigt, wie die Standardgröße und der Standardspeicherort einer Aktivität sowie die Mindestgröße angegeben werden, wenn die Aktivität im Fenstermodus des Desktops 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 zur 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 Modus „Mehrere Fenster“ deaktiviert oder ignoriert Android möglicherweise Funktionen, die sich nicht auf eine Aktivität beziehen, die den Bildschirm des Geräts mit anderen Aktivitäten oder Apps teilt.

Außerdem sind einige Optionen zur Anpassung der System-UI deaktiviert. Apps können die Statusleiste beispielsweise nicht ausblenden, wenn sie im Mehrfenstermodus ausgeführt werden (siehe Sichtbarkeit der System-UI steuern).

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

Abfragen und Rückrufe im Mehrfenstermodus

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

  • isInMultiWindowMode(): Gibt an, ob die Aktivität im Modus mit mehreren Fenstern ausgeführt wird.

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

  • onMultiWindowModeChanged(): Diese Methode wird vom System aufgerufen, wenn die Aktivität in den Multifenstermodus wechselt oder ihn 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 auf, wenn die Aktivität in den Bild-im-Bild-Modus wechselt oder ihn verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Bild-im-Bild-Modus wechselt, oder „false“, wenn sie 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, 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, um das System anzuweisen, die neue Aktivität in einem benachbarten Fenster zu erstellen, sodass die beiden Aktivitäten den Bildschirm gemeinsam nutzen. Das System unternimmt zwar alle Anstrengungen, dies zu tun, kann dies aber nicht garantieren.

Wenn sich ein Gerät im Fenstermodus befindet und Sie eine neue Aktivität starten, können Sie die Abmessungen und die Position auf dem Display der neuen Aktivität angeben, indem Sie ActivityOptions.setLaunchBounds() aufrufen. Die Methode hat keine Auswirkungen, wenn sich das Gerät nicht im Modus „Mehrere Fenster“ befindet.

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

Unter Android 12 (API-Level 31) können Apps das Aufgabenfenster einer Anwendung auf mehrere Aktivitäten aufteilen. Sie legen fest, wie die Aktivitäten in Ihrer App angezeigt werden – im Vollbildmodus, nebeneinander oder gestapelt –, indem Sie eine XML-Konfigurationsdatei erstellen oder Jetpack WindowManager API-Aufrufe ausführen.

Drag-and-Drop

Nutzer können Daten per Drag-and-drop von einer Aktivität in eine andere ziehen, während die beiden Aktivitäten den Bildschirm teilen. Vor Android 7.0 konnten Nutzer Daten nur innerhalb einer einzelnen Aktivität per Drag-and-drop verschieben. Informationen zum schnellen Hinzufügen der Unterstützung für das Akzeptieren von gesendeten Inhalten findest du in der DropHelper API. Eine umfassende Anleitung zum 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. In einer Shopping-App können beispielsweise mehrere Fenster angezeigt werden, um Produkte zu vergleichen.

Unter Android 12 (API-Level 31) können Sie zwei Instanzen einer Aktivität nebeneinander im selben Aufgabenfenster starten.

Wenn Sie Nutzern erlauben möchten, über den App-Launcher oder die Taskleiste eine weitere Instanz Ihrer Anwendung zu starten, muss die Launcher-Aktivität android:resizeableActivity="true" festlegen und darf 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 und es werden zwei App-Instanzen in zwei Fenstern auf beiden Seiten des Scharniers ausgeführt. Wenn das Gerät zusammengeklappt ist, wird möglicherweise eine der Instanzen beendet, anstatt die Fenster für beide Instanzen auf einem kleineren Bildschirm anzupassen.

Bestätigung für den Mehrfenstermodus

Unabhängig davon, ob Ihre App auf API-Level 24 oder höher ausgerichtet ist, sollten Sie prüfen, wie sie sich im Multifenstermodus verhält, falls ein Nutzer versucht, sie auf einem Gerät mit Android 7.0 oder höher im Multifenstermodus 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 Ihre App keine feste Ausrichtung angibt, sollten Sie sie auf einem Gerät mit Android 7.0 oder höher starten und versuchen, die App im Splitscreen-Modus zu öffnen. Prüfen Sie, ob die App auch bei erzwungener Größenänderung für Nutzer zufriedenstellend ist.

Wenn die App eine feste Ausrichtung angibt, sollten Sie versuchen, die App in den Multifenstermodus zu versetzen. Prüfen Sie, ob die App dabei im Vollbildmodus bleibt.

API-Level 24 bis 30

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

  • 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 die App richtig wechselt.

  • 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üfen Sie, ob die App die Größe ohne Absturz ändern kann und ob die erforderlichen UI-Elemente sichtbar sind.

  • Wenn Sie Mindestabmessungen für Ihre App angegeben haben, versuchen Sie, die Größe der App so zu ändern, dass die Fenstergröße kleiner als diese Abmessungen ist. Prüfen Sie, ob die App nicht kleiner als die angegebenen Mindestabmessungen sein kann.

  • Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Prüfen Sie beispielsweise, ob es nach dem Ändern der Größe der App nicht zu lange dauert, bis die Benutzeroberfläche aktualisiert wird.

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 für Tests

Führen Sie die folgenden Schritte aus, um die Leistung Ihrer App im Modus mit mehreren Fenstern zu prüfen. Sie sollten diese Vorgänge sowohl im Splitscreen- als auch im Desktopfenstermodus ausprobieren, sofern nicht anders angegeben.

  • Mehrfenstermodus aktivieren und verlassen

  • Wechseln Sie von Ihrer App zu einer anderen App und prüfen Sie, ob sich die App ordnungsgemäß verhält, während sie sichtbar, aber nicht aktiv ist. Wenn in Ihrer App beispielsweise ein Video abgespielt wird, prüfen Sie, ob das Video weiter abgespielt wird, während der Nutzer mit einer anderen App interagiert.

  • Im Splitscreen-Modus können Sie den Bildschirmteiler verschieben, um die App zu vergrößern oder zu verkleinern. Probieren Sie diese Vorgänge sowohl nebeneinander als auch übereinander 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 mehrere Größenanpassungen in schneller Folge aus. 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 App in verschiedenen Fensterkonfigurationen und prüfen Sie, ob sie ordnungsgemäß funktioniert. Prüfen Sie, ob der Text gut lesbar ist und die UI-Elemente nicht zu klein sind, um damit interagieren zu können.

Unterstützung für Mehrfenstermodus deaktiviert

Wenn Sie bei den API-Ebenen 24 bis 30 den Mehrfenstermodus deaktiviert haben, indem Sie android:resizeableActivity="false" festgelegt haben, sollten Sie Ihre App auf einem Gerät mit Android 7.0 bis 11 starten und versuchen, die App im Splitscreen- und Desktopfenstermodus zu öffnen. Achten Sie darauf, dass die App dabei im Vollbildmodus bleibt.

Weitere Informationen

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

Empfohlen für Sie * Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist. * Gerätekompatibilitätsmodus * Unterstützung für die Größenänderung auf großen Bildschirmen * Konfigurationsänderungen verarbeiten