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 im Splitscreen-Modus nebeneinander 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 Desktopfenstermodus, in dem Nutzer die Größe jeder Aktivität frei ändern können, kann von Herstellern von Geräten mit großem Bildschirm 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. Sie können den Modus für mehrere Fenster auch für Ihre App deaktivieren. Dazu legen Sie resizeableActivity="false" fest, damit die App immer im Vollbildmodus angezeigt wird.

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

  • Unter Android 12 (API-Level 31) ist der Modus „Mehrere Fenster“ standardmäßig aktiviert.

    • Auf großen Bildschirmen (mittel oder erweitert) unterstützt die Plattform alle Apps im Multifenstermodus unabhängig von der App-Konfiguration. Bei resizeableActivity="false" wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen anzupassen.

    • 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. App 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-Ebene 24) eingeführt, damit Apps, die im Splitscreen-Modus ausgeführt werden, Aktivitäten im nebenliegenden Fenster starten können.

Unter Android 12L (API-Ebene 32) und höher wurde die Definition des Flags erweitert, damit Apps, die im Vollbildmodus ausgeführt werden, den Splitscreen-Modus aktivieren und dann Aktivitäten im nebenliegenden 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.:

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) } }

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 den Fokus hat, z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die Methode onStop() funktioniert wie gewohnt: Sie wird jedes Mal aufgerufen, wenn eine Aktivität vom Display verschwindet.

Die Wiedergabe mehrerer Streams 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" />

Ob ein bestimmtes Gerät diese Manifest-Metadaten unterstützt, können Sie in den Gerätespezifikationen nachlesen.

Android 9

Im Modus mit mehreren Fenstern unter Android 9 (API-Ebene 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 ordnet diesen sichtbaren, aber nicht fortgesetzten Aktivitäten jedoch 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 Aktivität fortgesetzt und die zuvor oberste Aktivität wechselt in den Status STARTED.

Wenn es mehrere Aktivitäten innerhalb eines einzelnen aktiven App-Prozesses gibt, wird die Aktivität mit der höchsten Z-Reihenfolge fortgesetzt und die anderen werden angehalten.

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ätszyklus wie wenn das System die App benachrichtigt, dass das Gerät von der Hoch- zur Querformatausrichtung gewechselt ist, mit der Ausnahme, dass die App-Abmessungen geändert werden, anstatt nur getauscht 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 ins Hintertreffen gerät, 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 „Mehrere Wiedergabepositionen“ zu unterstützen.

Der Callback wird aufgerufen, wenn eine Aktivität die Position der aktuell fortgesetzten Aktivität erhält oder verliert. Das ist wichtig, wenn eine Aktivität eine freigegebene Singleton-Ressource wie das Mikrofon oder die Kamera verwendet:

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. } }

Beachten Sie, dass eine App auch aus anderen Gründen Ressourcen verlieren kann, z. B. durch das Entfernen einer freigegebenen 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 Kamerazugriff 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 unbedingt freigeben, wenn der Fokus verloren geht. 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 ist, die gerade im Vordergrund ist. Sie muss jedoch den Fall der Verbindungsunterbrechung ordnungsgemäß behandeln. Wenn die oberste fortgesetzte App die Kamera verwenden möchte, kann sie sie öffnen und Ihre App verliert den Zugriff. Ihre App kann die Kamera wieder öffnen, wenn sie wieder den Fokus erhält.

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 Szenarien mit mehreren Bildschirmen. Bei mehreren Aktivitäten kann gleichzeitig Nutzerinput empfangen werden.

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 die aktuelle Anzeige 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 Bildschirmen.

Lesen Sie auch die Informationen zu den Multi-Display APIs, die in Android 8.0 eingeführt wurden.

Aktivitäts- und Anwendungskontext

Bei der Verwendung mehrerer Bildschirme ist es wichtig, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen unterscheidet sich der angezeigte Aktivitätskontext vom nicht angezeigten Anwendungskontext.

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:

val activityDisplay = activity.getDisplay()

Messwerte für das aktuelle Aktivitätsfenster abrufen:

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

Maximalfenstermesswerte für die aktuelle Systemkonfiguration abrufen:

val 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 Sie diese Funktion in onCreate() haben, können Sie diese Entscheidungen vor der ersten Layoutanpassung treffen. Diese Messwerte sollten nicht zum Layouten 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 Displays über den Systemdienst DisplayManager abrufen:

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

Mit der Klasse Display können Sie Informationen zu einem bestimmten Display abrufen, z. B. die Displaygröße oder Flags, die angeben, ob ein Display 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:

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

Starten Sie dann die Aktivität auf dem Display:

val 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 in einem Textfeld auf diesem Display Eingaben erforderlich sind.

Abbildung 4: Tastatur auf einem sekundären Display

Hintergründe

Unter Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Das Framework erstellt für jedes Display 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 dem Smartphone und dem sekundären Display

Launcher

Die neue Intent-Filterkategorie SECONDARY_HOME bietet eine spezielle 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.

Wenn Sie Messwerte für andere Displays als das aktuelle Display abrufen möchten, gehen Sie so vor (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

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

Eingestellte Methoden

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

Unter Android 12 (API-Level 31) werden die Display-Methoden getRealSize() und getRealMetrics() eingestellt. Ihr Verhalten wird so angepasst, dass es dem von getMaximumWindowMetrics() besser entspricht.

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 übergeordneten Aktivität gelten für alle Aktivitäten in ihrem Aufgabenstapel. 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 Multifenstermodus 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 festgelegt ist, kann die Aktivität im Splitscreen- und Desktopfenstermodus 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 Multifenstermodus zu starten, wird der Vollbildmodus aktiviert.

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 Modus für mehrere Fenster. 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

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

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

configChanges

Wenn Sie Änderungen an der Mehrfensterkonfiguration selbst verwalten möchten, z. B. wenn ein Nutzer die Größe eines Fensters ändert, fügen Sie dem Knoten <activity> Ihres App-Manifests 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 Datenansichten manuell aktualisieren, Ressourcen neu laden und bei Bedarf andere Vorgänge 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 gestartet wird.

  • android:gravity: Die ursprüngliche Platzierung der Aktivität, wenn sie im Fenstermodus des Desktops gestartet wird. Geeignete Werte finden Sie in der Klasse Gravity.

  • android:minHeight, android:minWidth: Mindesthöhe und Mindestbreite für die Aktivität sowohl im Splitscreen- als auch im 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 diesen verlässt. Das System übergibt der Methode den Wert „wahr“, wenn die Aktivität in den Multifenstermodus wechselt, oder „falsch“, wenn sie den Multifenstermodus verlässt.

  • onPictureInPictureModeChanged(): Das System ruft diese Methode immer dann 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 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 Sie eine Aktivität im Bild-im-Bild-Modus starten möchten, rufen Sie enterPictureInPictureMode() auf. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen finden Sie unter Videos per Bild-im-Bild (PiP) hinzufügen.

Neue Aktivitäten im Mehrfenstermodus

Wenn Sie eine neue Aktivität starten, können Sie angeben, dass sie 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 im Modus „Mehrere Fenster“ als separates Fenster 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 ausführliche 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 Ihrer App in einem separaten Fenster starten möchten, können Sie neue Aktivitäten mit dem Flag FLAG_ACTIVITY_NEW_TASK starten. Sie können dies mit einigen der Attribute für mehrere Fenster kombinieren, um einen bestimmten Speicherort 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. Eine singleInstancePerTask-Aktivität kann beispielsweise mehrmals in verschiedenen Aufgaben instanziiert werden, wenn FLAG_ACTIVITY_MULTIPLE_TASK oder FLAG_ACTIVITY_NEW_DOCUMENT festgelegt ist.

Verwechseln Sie das mehrinstanzielle Layout nicht mit einem Layout mit mehreren Bereichen, z. B. einer Liste mit Detailinformationen, die SlidingPaneLayout verwendet und in einem einzigen Fenster ausgeführt wird.

Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden, werden eine oder mehrere Instanzen möglicherweise in den Hintergrund verschoben, wenn sich die Position ä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, es sei denn, die App deklariert eine feste Ausrichtung.

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:

  • Öffnen Sie die App im Vollbildmodus und wechseln Sie dann in den Modus „Mehrere Fenster“, indem Sie lange auf die Schaltfläche Letzte drücken. Prüfen Sie, ob die App richtig wechselt.

  • Starten Sie die App direkt im Modus mit mehreren Fenstern und prüfen Sie, ob sie ordnungsgemäß gestartet wird. Sie können eine App im Mehrfenstermodus starten, indem Sie auf die Schaltfläche Letzte Apps tippen, dann die Titelleiste der App lange gedrückt halten und sie auf einen der markierten Bereiche auf dem Display ziehen.

  • Sie können die Größe der App im Splitscreen-Modus ändern, 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 die Benutzeroberfläche nicht zu lange braucht, um nach der Größenänderung der App aktualisiert zu werden.

API-Level 31 oder höher

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

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 deaktivieren

  • 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. Prüfen Sie, ob die App nicht abstürzt, die wichtigsten Funktionen sichtbar sind und die Größenänderung nicht zu lange dauert.

  • Führen Sie mehrere Größenanpassungen in schneller Folge aus. Prüfen Sie, ob Ihre App nicht abstürzt oder Speicherlecks aufweist. Der Memory Profiler von Android Studio liefert Informationen zur Arbeitsspeichernutzung Ihrer App. Weitere Informationen finden Sie unter Arbeitsspeichernutzung Ihrer App mit dem 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 mehrerer Fenster unter Android finden Sie unter:

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