Unterstützung für Mehrfenstermodus

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

Abbildung 1: Im Splitscreen-Modus zwei Apps nebeneinander anzeigen lassen

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

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

    Im Splitscreen-Modus werden auf dem Bildschirm zwei Apps nebeneinander oder übereinander angezeigt. Nutzer können die Trennlinie zwischen den beiden Anwendungen ziehen, um die eine zu vergrößern und die andere zu verkleinern.

    Mit dem Bild-im-Bild-Modus können Nutzer die Videowiedergabe fortsetzen, während sie mit einer anderen App interagieren. Weitere Informationen finden Sie unter Unterstützung von Bild im Bild.

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

    Sie können konfigurieren, wie der Mehrfenstermodus in Ihrer App gehandhabt wird, indem Sie die minimal zulässigen Dimensionen für Ihre Aktivität angeben. Du kannst den Mehrfenstermodus auch für deine App deaktivieren, indem du resizeableActivity="false" festlegst, damit das System die App immer im Vollbildmodus anzeigt.

  • Android 8.0 (API-Level 26) weitet den Bild-im-Bild-Modus auf Geräte mit kleinen Bildschirmen aus.
  • Android 12 (API-Level 31) erstellt den Mehrfenstermodus als Standardverhalten.

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

    Auf kleinen Bildschirmen (weniger als 600 dp) prüft das System die minWidth und den 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.

    Hinweis:Gerätehersteller können dieses Verhalten überschreiben.

Splitscreen-Modus

So aktivieren Sie den Splitscreen-Modus:

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

Nutzer können den geteilten Bildschirmmodus beenden, indem sie die Trennlinie des Fensters an den Bildschirmrand ziehen – nach oben oder unten, nach links oder rechts.

Nebeneinander starten

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

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

Bei Android 12L (API-Level 32) und höher wurde die Definition des Flags erweitert, sodass Apps, die im Vollbildmodus ausgeführt werden, den Splitscreen-Modus aktivieren und dann Aktivitäten im benachbarten 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 Status der Wiederaufnahme von Apps in mehreren Fenstern unterscheidet sich jedoch je nach Android-Version.

Mehrere Wiederholungen

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

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

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

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

Android 9

Im Mehrfenstermodus unter Android 9 (API-Level 28) und niedriger ist nur die Aktivität, mit der der Nutzer zuletzt interagiert hat, zum jeweiligen Zeitpunkt aktiv. 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 fortgesetzten Aktivitäten eine höhere Priorität ein 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 höchste Aktivität erhält den Status STARTED.

Wenn es in einem einzelnen aktiven App-Prozess mehrere Aktivitäten gibt, wird die Aktivität mit der höchsten Z-Reihenfolge fortgesetzt und die anderen pausiert.

Konfigurationsänderungen

Wenn der Nutzer eine App 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 die App wieder in den Vollbildmodus versetzt.

Diese Änderung hat im Wesentlichen dieselben Auswirkungen auf den Aktivitätslebenszyklus wie die Benachrichtigung, wenn das System die App darüber informiert, dass das Gerät vom Hochformat ins Querformat gewechselt ist, mit der Ausnahme, dass die Abmessungen des Geräts geändert und nicht einfach gewechselt werden. Wie unter Konfigurationsänderungen verarbeiten beschrieben, kann Ihre Aktivität die Konfigurationsänderung selbst verarbeiten oder dem System ermöglichen, die Aktivität zu löschen und mit den neuen Dimensionen neu zu erstellen.

Wenn der Nutzer die Größe eines Fensters ändert und es in einer der Dimensionen vergrößert, passt das System die Aktivität an die Nutzeraktion an und nimmt Konfigurationsänderungen nach Bedarf vor. Wenn neu sichtbare Bereiche mit der App nicht gezeichnet werden, füllt das System diese Bereiche vorübergehend mit der Farbe aus, die mit dem Attribut windowBackground oder dem Standardstilattribut windowBackgroundFallback angegeben wurde.

Exklusiver Ressourcenzugriff

Zur Unterstützung der Funktion zum mehrfachen Fortsetzen von Videos gibt es einen neuen Lebenszyklus-Callback onTopResumedActivityChanged().

Diese Methode wird aufgerufen, wenn eine Aktivität die höchste Position der fortgesetzten Aktivität erreicht oder verliert. Es ist wichtig zu wissen, wann eine Aktivität eine gemeinsam genutzte 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 eine Anwendung aus anderen Gründen Ressourcen verlieren kann, z. B. durch das Entfernen einer gemeinsam genutzten Hardware.

In jedem Fall sollte eine Anwendung Ereignisse und Statusänderungen ordnungsgemäß verarbeiten, die sich auf die verfügbaren Ressourcen auswirken.

Bei Apps mit Kamera gibt CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() einen Hinweis darauf, dass es an der Zeit sein könnte, Zugriff auf die Kamera zu erhalten. Diese Methode ist ab Android 10 (API-Level 29) verfügbar.

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

Kamera im Mehrfenstermodus.

Abbildung 2: Kamera im Mehrfenstermodus.

Ihre App muss die Kamera nicht freigeben, wenn sie den Fokus verliert. Sie können beispielsweise die Kameravorschau fortsetzen, während der Nutzer mit der neu fokussierten, oben fortgesetzten App interagiert. Ihre App kann die Kamera weiterhin ausführen, wenn es sich nicht um die oberste fortgeführte App handelt. Der Fall zum Trennen der Verbindung muss jedoch ordnungsgemäß verarbeitet werden. Wenn die oberste, fortgesetzte App die Kamera verwenden möchte, kann sie sie öffnen und die App hat keinen Zugriff mehr. Die App kann die Kamera wieder öffnen, sobald sie wieder in den Fokus rückt.

Nachdem eine App einen CameraDevice.StateCallback#onDisconnected()-Callback erhalten hat, wird bei nachfolgenden Aufrufen auf dem Kameragerät ein CameraAccessException-Fehler 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 einem Bildschirm auf einen anderen verschieben. Die Option Multi-Resume kann auch für Szenarien mit mehreren Bildschirmen verwendet werden. Mehrere Aktivitäten können gleichzeitig Nutzereingaben erhalten.

Eine Anwendung kann beim Start oder der Erstellung einer anderen Aktivität angeben, auf welcher Anzeige sie ausgeführt werden soll. Dieses Verhalten hängt vom Aktivitätsstartmodus ab, der in der Manifestdatei definiert ist, sowie von den Intent-Flags und Optionen, die von der Entität festgelegt wurden, die die Aktivität startet. Weitere Informationen finden Sie unter ActivityOptions.

Wenn eine Aktivität zu einer sekundären Anzeige verschoben wird, kann sie eine Kontextaktualisierung, eine Größenanpassung des Fensters sowie Konfigurations- und Ressourcenänderungen durchlaufen. Wenn die Aktivität die Konfigurationsänderung verarbeitet, wird die Aktivität 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. Vergessen Sie nicht, die Ressourcen und Layouts zu aktualisieren, wenn sich die Anzeige ändert.

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

Mehrere Instanzen einer Aktivität auf mehreren Displays.

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

Du kannst dich auch über die Multi-Display-APIs informieren, die mit Android 8.0 eingeführt wurden.

Aktivitäts- und Anwendungskontext

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

Der Aktivitätskontext enthält Informationen zur Anzeige und passt sich immer dem Anzeigebereich an, in dem die Aktivität erscheint. So erhalten Sie korrekte Informationen zur Anzeigedichte oder Fenstermesswerte Ihrer App. Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwenden, um Informationen über das aktuelle Fenster oder die aktuelle Anzeige zu erhalten. Dies betrifft auch einige System-APIs, die Informationen aus dem Kontext verwenden (siehe z. B. Toast-Übersicht).

Die Konfiguration des Aktivitätsfensters und die übergeordnete Anzeige definieren Ressourcen und Kontext. So rufst du den aktuellen Bildschirm ab:

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

Rufen Sie die aktuellen Messwerte für den 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 dazu, Berechnungen zu treffen, Layoutentscheidungen zu treffen oder die Größe von Ressourcen, die im Voraus abgerufen werden sollen, zu bestimmen. Wenn diese Funktion in onCreate() verfügbar ist, können Sie diese Entscheidungen vor dem ersten Layoutdurchgang treffen. Diese Messwerte sollten nicht verwendet werden, um das Layout bestimmter Ansichtselemente festzulegen. Verwenden Sie stattdessen Informationen aus dem Configuration-Objekt.

Display-Aussparungen

Faltbare Geräte können beim Zusammen- und Aufklappen eine andere Aussparungsgeometrie haben. Lesen Sie die Best Practices für die Unterstützung der Display-Aussparung, um Probleme mit der Aussparung zu vermeiden.

Sekundäre Displays

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

Kotlin

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

Java

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

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

Bestimmen Sie, ob eine Aktivität auf einem Bildschirm 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 dieser für die Unterstützung von Systemdesigns konfiguriert ist. Der Editor für Eingabemethoden wird automatisch angezeigt, wenn ein Textfeld auf dieser Anzeige eine Eingabe anfordert.

Tastatur auf einem zweiten Display.

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. Achten Sie darauf, dass die Oberfläche jedes Moduls unabhängig gezeichnet wird. Entwickler können Assets mithilfe des Anzeigekontexts in WallpaperService.Engine#getDisplayContext() laden. Ihre WallpaperInfo.xml-Datei muss außerdem android:supportsMultipleDisplays="true" enthalten.

Hintergrund auf Smartphone und sekundärem Display.

Abbildung 5: Hintergrund auf Smartphone und sekundärem 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 Bildschirmen verwendet, die Systemdekorationen unterstützen, und zwar eine pro Anzeige.

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

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

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

Material Design-Launcher auf einem Smartphone.

Abbildung 6: Material Design-Launcher auf einem Smartphone.

Material Design-Launcher auf einem zweiten Display.

Abbildung 7: Material Design-Launcher auf einem zweiten Display.

Fenstermesswerte

Unter 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 Jetpack WindowManager-Bibliotheksmethoden computeCurrentWindowMetrics() und computeMaximumWindowMetrics() bieten jeweils ähnliche Funktionen, jedoch mit Abwärtskompatibilität mit API-Level 14.

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

  • Anzeigekontext erstellen
  • Fensterkontext für die Anzeige erstellen
  • WindowManager des Fensterkontexts abrufen
  • WindowMetrics des maximal für die App verfügbaren Anzeigebereichs abrufen

Kotlin

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

Java

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

Verworfene Methoden

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

In Android 12 (API-Level 31) werden die Display-Methoden getRealSize() und getRealMetrics() eingestellt und ihr Verhalten aktualisiert, damit es besser an das Verhalten von getMaximumWindowMetrics() angepasst wird.

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 Aktivitäten deiner App den Mehrfenstermodus unterstützen. Sie können in Ihrem Manifest Attribute festlegen, um sowohl Größe als auch Layout zu steuern. Die Attributeinstellungen einer Stammaktivität gelten für alle Aktivitäten innerhalb des Aufgabenstacks. Wenn die Stammaktivität beispielsweise android:resizeableActivity="true" hat, kann die Größe aller Aktivitäten im Aufgabenstapel geändert werden. Auf einigen größeren Geräten wie Chromebooks wird Ihre App möglicherweise in einem Fenster mit anpassbarer Größe ausgeführt, selbst wenn Sie android:resizeableActivity="false" angeben. Sollte dies zu Problemen mit Ihrer App führen, können Sie die Verfügbarkeit der App auf diesen Geräten mithilfe von Filtern einschränken.

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

sizeableActivity (Größenanpassung)

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 und im freien Format gestartet werden. Wenn das Attribut auf „false“ gesetzt ist, unterstützt die Aktivität den Mehrfenstermodus nicht. Wenn dieser Wert auf „false“ gesetzt 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 Attributwert standardmäßig auf „true“ gesetzt.

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

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

unterstützt „Bild im Bild“

Legen Sie dieses Attribut im Knoten <activity> Ihres 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 Änderungen der Mehrfensterkonfiguration selbst vornehmen möchten, z. B. wenn ein Nutzer die Größe eines Fensters ändert, fügen Sie dem Knoten Ihres 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äten und Fragmente einen Callback von onConfigurationChanged(), anstatt gelöscht und neu erstellt zu werden. Sie können dann bei Bedarf manuell Ihre Ansichten aktualisieren, Ressourcen neu laden und weitere Vorgänge ausführen.

<layout>

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

android:defaultHeight, android:defaultWidth
Die Standardhöhe und -breite der Aktivität, wenn sie im Freiformmodus gestartet wird.
android:gravity
Anfängliche Platzierung der Aktivität bei der Einführung im freien Format. Passende Werte finden Sie unter Gravity.
android:minHeight, android:minWidth
Mindesthöhe und Mindestbreite der Aktivität im geteilten Bildschirmmodus und im freien Format. Wenn der Nutzer die Trennlinie im geteilten Bildschirmmodus bewegt, um eine Aktivität unter dem angegebenen Minimum zu platzieren, 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 Standardspeicherort einer Aktivität sowie ihre Mindestgröße angeben, wenn die Aktivität im freien Format 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 Mehrfenstermodus deaktiviert oder ignoriert Android möglicherweise Funktionen, 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 der System-UI deaktiviert. Beispielsweise können Apps die Statusleiste 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 Callbacks im Mehrfenstermodus

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

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

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

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

onMultiWindowModeChanged()
Das System ruft diese Methode immer dann auf, wenn die Aktivität in den oder aus dem Mehrfenstermodus wechselt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Mehrfenstermodus wechselt, oder „false“, wenn die Aktivität den Mehrfenstermodus beendet.
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 „false“, wenn die Aktivität den Bild-im-Bild-Modus beendet.

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

Bild-im-Bild-Modus

Um eine Aktivität in den Bild-im-Bild-Modus zu versetzen, rufen Sie enterPictureInPictureMode() auf. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen findest du unter Unterstützung von Bild im Bild.

Neue Aktivitäten im Mehrfenstermodus

Wenn Sie eine neue Aktivität starten, können Sie angeben, dass die neue Aktivität nach Möglichkeit neben der aktuellen 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, sodass die beiden Aktivitäten den Bildschirm teilen. Das System versucht, dies zu tun, es kann jedoch nicht garantiert werden, dass dies auch tatsächlich eintritt.

Wenn sich ein Gerät im freien Format befindet und du eine neue Aktivität starten möchtest, kannst du die Abmessungen und die Position des Bildschirms der neuen Aktivität durch Aufrufen von ActivityOptions.setLaunchBounds() angeben. Diese Methode hat keine Auswirkungen, wenn sich das Gerät nicht im Mehrfenstermodus befindet.

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

Mit Android 12 (API-Level 31) können Apps das Aufgabenfenster einer App in mehrere Aktivitäten aufteilen. Sie legen fest, wie die Aktivitäten Ihrer Anwendung – Vollbild, Seite an Seite oder gestapelt – dargestellt werden, 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 der Bildschirm von beiden Aktivitäten geteilt wird. Vor Android 7.0 konnten Nutzer Daten nur innerhalb einer einzelnen Aktivität per Drag-and-drop verschieben. Mit der DropHelper API können Sie schnell Unterstützung für die Annahme gelöschter Inhalte hinzufügen. Eine umfassende Anleitung zum Ziehen und Ablegen finden Sie unter Drag-and-drop.

Mehrere Instanzen

Jede Stammaktivität hat ihre eigene Aufgabe, die in einem separaten Prozess ausgeführt 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 diese Ansicht mit einigen Mehrfensterattributen kombinieren, um eine bestimmte Position für das neue Fenster anzufordern. Eine Shopping-App kann z. B. mehrere Fenster anzeigen, um Produkte zu vergleichen.

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

Wenn du Nutzern erlauben möchtest, eine weitere Instanz deiner App über den App Launcher oder die Taskleiste zu starten, achte darauf, dass in den Aktivitäten deines Launchers android:resizeableActivity="true" festgelegt ist und kein Startmodus verwendet wird, 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.

Diese Art von Layout ist nicht mit einem Layout mit mehreren Steuerfeldern zu verwechseln, z. B. einer Präsentation mit Listendetails, in der SlidingPaneLayout verwendet wird und die in einem einzelnen Fenster ausgeführt wird.

Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden, können eine oder mehrere Instanzen in den Hintergrund verschoben werden, wenn sich der Sicherheitsstatus ändert. Angenommen, ein Gerät ist aufgeklappt und hat zwei App-Instanzen in zwei Fenstern auf beiden Seiten des Fold-Bereichs. Bei zugeklapptem Gerät wird möglicherweise eine der Instanzen beendet, anstatt zu versuchen, die Fenster beider Instanzen auf einen kleineren Bildschirm anzupassen.

Überprüfung im Mehrfenstermodus

Unabhängig davon, ob deine App auf API-Level 24 oder höher ausgerichtet ist, solltest du prüfen, wie sie sich im Mehrfenstermodus verhält, falls 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, erzwingt das System eine Größenanpassung der App, sofern für die App keine feste Ausrichtung deklariert wird.

Wenn für Ihre App keine feste Ausrichtung angegeben ist, sollten Sie sie auf einem Gerät mit Android 7.0 oder höher starten und versuchen, den geteilten Bildschirmmodus für die App zu aktivieren. Prüfen Sie, ob die Anwendung nutzerfreundlich ist, wenn die Größe der App erzwungen wird.

Wenn für die App eine feste Ausrichtung angegeben ist, sollten Sie versuchen, den Mehrfenstermodus für die App zu verwenden. Prüfen Sie, ob die App dabei im Vollbildmodus bleibt.

API-Level 24 bis 30

Wenn Ihre App auf die API-Level 24 bis 30 ausgerichtet ist und die Unterstützung des Mehrfenstermodus nicht deaktiviert wird, prüfen Sie Folgendes sowohl im geteilten Bildschirm- als auch im freien Formatmodus:

  • Starte den Vollbildmodus der App und wechsle dann in den Mehrfenstermodus, indem du lange auf die Schaltfläche „Zuletzt verwendet“ drückst. Prüfen Sie, ob die App korrekt wechselt.
  • App direkt im Mehrfenstermodus starten und prüfen, ob sie korrekt gestartet wird Du kannst eine App im Mehrfenstermodus starten, indem du die Schaltfläche „Zuletzt verwendet“ drückst, lange auf die Titelleiste deiner App drückst und sie in einen der markierten Bereiche auf dem Bildschirm ziehst.
  • Du kannst die Größe deiner App im geteilten Bildschirmmodus anpassen, indem du den Bildschirmteiler ziehst. Prüfen Sie, ob die Größe der App ohne Absturz angepasst wird und ob die erforderlichen UI-Elemente sichtbar sind.
  • Wenn Sie Mindestabmessungen für Ihre App angegeben haben, versuchen Sie, die Größe der App auf diese Abmessungen zu reduzieren. Die App darf nicht kleiner als die angegebene Mindestgröße sein.
  • Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Achten Sie beispielsweise darauf, dass nach der Größenanpassung der Anwendung keine allzu lange Verzögerung bei der Aktualisierung der UI vorhanden ist.

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 jeweiligen Abmessungen des verfügbaren Anzeigebereichs sind, prüfen Sie alle Verhaltensweisen, die unter API-Level 24 bis 30 aufgeführt sind.

Checkliste für Tests

Mit den folgenden Vorgängen können Sie die Leistung Ihrer Anwendung im Mehrfenstermodus prüfen. Sie sollten diese Vorgänge sowohl im geteilten Bildschirmmodus als auch im freien Format ausprobieren, sofern nicht anders angegeben.

  • Wechseln Sie zum Mehrfenstermodus und verlassen Sie ihn wieder.
  • Wechseln Sie von Ihrer Anwendung zu einer anderen Anwendung und prüfen Sie, ob die Anwendung ordnungsgemäß funktioniert, während sie sichtbar, aber nicht aktiv ist. Wenn in Ihrer Anwendung beispielsweise ein Video abgespielt wird, prüfen Sie, ob die Wiedergabe auch dann fortgesetzt wird, wenn der Nutzer mit einer anderen Anwendung interagiert.
  • Verschiebe im geteilten Bildschirmmodus den Bildschirmteiler, um die App zu vergrößern und zu verkleinern. Probieren Sie diese Vorgänge sowohl nebeneinander als auch über den anderen Konfigurationen aus. Die App darf nicht abstürzen, wichtige Funktionen sichtbar sein und die Größenänderung sollte nicht zu lange dauern.
  • Führen Sie mehrere Vorgänge zur Größenanpassung schnell hintereinander durch. Achten Sie darauf, dass Ihre App nicht abstürzt oder Speicherlecks verursacht. Der Speicher-Profiler von Android Studio bietet Informationen zur Arbeitsspeichernutzung Ihrer App. Weitere Informationen finden Sie unter Arbeitsspeichernutzung der App mit dem Speicher-Profiler prüfen.
  • Verwenden Sie Ihre Anwendung wie gewohnt in verschiedenen Fensterkonfigurationen und prüfen Sie, ob die Anwendung ordnungsgemäß funktioniert. Achte darauf, dass der Text lesbar ist und die UI-Elemente nicht zu klein sind, um mit ihnen interagieren zu können.

Unterstützung des Mehrfenstermodus deaktiviert

Wenn Sie auf 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, die App in den Modus für geteilten Bildschirm und im freien Format zu versetzen. Die App muss dabei im Vollbildmodus bleiben.

Weitere Informationen

Weitere Informationen zur Unterstützung des Mehrfenstermodus unter Android findest du unter: