Mit dem Mehrfenstermodus können mehrere Apps gleichzeitig denselben Bildschirm teilen. Apps können nebeneinander oder übereinander dargestellt werden (Split-Screen-Modus), eine App in einem kleinen Fenster, die andere Apps überlagert (Bild-im-Bild-Modus) oder einzelne Apps in separaten beweglichen Fenstern mit anpassbarer Größe (Freiformmodus).
Die Nutzererfahrung hängt von der Android-Version und dem Gerätetyp ab:
-
Mit Android 7.0 (API-Ebene 24) wird der Splitscreen-Modus auf kleinen Bildschirmen und der Bild-im-Bild-Modus auf ausgewählten Geräten eingeführt.
Der Splitscreen-Modus füllt den Bildschirm mit zwei Apps, die entweder nebeneinander oder übereinander angezeigt werden. Nutzer können die Trennlinie zwischen den beiden Apps ziehen, um eine größer und die andere kleiner zu machen.
Mit dem Bild-im-Bild-Modus können Nutzer die Videowiedergabe fortsetzen, während sie mit einer anderen App interagieren (siehe Unterstützung von Bild im Bild).
Hersteller von Geräten mit großen Bildschirmen können den Freiformmodus aktivieren, in dem Nutzer die Größe der einzelnen Aktivitäten kostenlos anpassen können.
Du kannst festlegen, wie deine App den Mehrfenstermodus verwendet, indem du die minimal zulässigen Abmessungen deiner Aktivität angibst. Du kannst den Mehrfenstermodus für deine App auch deaktivieren, indem du
resizeableActivity="false"
festlegst, damit das System deine App immer im Vollbildmodus anzeigt. - Android 8.0 (API-Level 26) erweitert den Bild-im-Bild-Modus auf Geräte mit kleinen Bildschirmen.
Android 12 (API-Level 31) macht den Mehrfenstermodus zum Standardverhalten.
Auf großen Bildschirmen (mindestens 600 dp) unterstützt die Plattform alle Apps im Mehrfenstermodus unabhängig von der App-Konfiguration. Wenn
resizeableActivity="false"
, wird die App bei Bedarf in den Kompatibilitätsmodus versetzt, um die Displayabmessungen zu berücksichtigen.Auf kleinen Bildschirmen (sw < 600 dp) prüft das System die
minWidth
undminHeight
einer Aktivität, um festzustellen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann. MitresizeableActivity="false"
wird die Ausführung der App im Mehrfenstermodus unabhängig von der Mindestbreite und -höhe verhindert.Hinweis:Gerätehersteller können diese Verhaltensweisen außer Kraft setzen.
Splitscreen-Modus
So aktivieren Sie den Splitscreen-Modus:
- Öffne den Bildschirm „Letzte Apps“.
- App durch Wischen in Ansicht ziehen
- Tippen Sie auf das App-Symbol in der Titelleiste der App.
- Menüoption für den Splitscreen auswählen
- Wähle auf dem Bildschirm „Zuletzt verwendet“ eine andere App aus oder schließe den Bildschirm „Zuletzt verwendet“ und führe eine andere App aus
Nutzer können den Splitscreen-Modus beenden, indem sie die Fensterteiler an den Bildschirmrand ziehen – nach oben, unten, links oder rechts.
Benachbarte Startrampe
Wenn Ihre App über einen Intent auf Inhalte zugreifen muss, können Sie mit FLAG_ACTIVITY_LAUNCH_ADJACENT
den Inhalt in einem angrenzenden Splitscreen-Fenster öffnen.
FLAG_ACTIVITY_LAUNCH_ADJACENT
wurde in Android 7.0 (API-Level 24) eingeführt, damit Apps, die im geteilten Bildschirmmodus ausgeführt werden, Aktivitäten im angrenzenden Fenster starten können.
Android 12L (API-Level 32) und höher haben die Definition des Flags erweitert, damit Apps im Vollbildmodus den Splitscreen-Modus aktivieren und dann Aktivitäten im angrenzenden Fenster starten können.
Um eine angrenzende Aktivität zu starten, verwenden Sie FLAG_ACTIVITY_LAUNCH_ADJACENT
in Verbindung mit FLAG_ACTIVITY_NEW_TASK
. Beispiel:
Kotlin
fun openUrlInAdjacentWindow(url: String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK) }.also { intent -> startActivity(intent) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
Aktivitätslebenszyklus im Mehrfenstermodus
Der Mehrfenstermodus ändert nicht den Aktivitätslebenszyklus. Der Fortsetzungsstatus von Apps in mehreren Fenstern variiert jedoch bei verschiedenen Android-Versionen.
Multi-Lebenslauf
Android 10 (API-Level 29) und höhere Versionen unterstützen mehrere Fortsetzungen. Alle Aktivitäten bleiben im Status RESUMED
, wenn sich das Gerät im Mehrfenstermodus befindet. Eine Aktivität kann pausiert werden, wenn eine transparente Aktivität über der Aktivität besteht oder die Aktivität nicht fokussierbar ist, z. B. im Bild-im-Bild-Modus. Es ist auch möglich, dass zu einem bestimmten Zeitpunkt keine Aktivität im Fokus ist, z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die Methode onStop
funktioniert wie gewohnt. Sie wird jedes Mal aufgerufen, wenn eine Aktivität vom Bildschirm entfernt wird.
Die Multi-Resume-Funktion ist auch auf ausgewählten Geräten mit Android 9 (API-Level 28) verfügbar. Füge die folgenden Manifestmetadaten hinzu, um auf Android 9-Geräten die Mehrfach-Fortsetzung zu aktivieren:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
Informationen dazu, ob ein bestimmtes Gerät diese Manifest-Metadaten unterstützt, findest du in den Gerätespezifikationen.
Android 9
Im Mehrfenstermodus unter Android 9 (API-Level 28) und niedriger ist zu einem bestimmten Zeitpunkt nur die Aktivität aktiv, mit der der Nutzer zuletzt interagiert hat. Diese Aktivität gilt als höchste Aktivität und ist die einzige Aktivität mit dem Status
RESUMED
. Alle anderen sichtbaren Aktivitäten sind
STARTED
, aber nicht
RESUMED
. Allerdings räumt das System diesen sichtbaren, aber nicht fortgesetzten Aktivitäten eine höhere Priorität zu als Aktivitäten, die nicht sichtbar sind. Wenn der Nutzer mit einer der sichtbaren Aktivitäten interagiert, wird diese fortgesetzt und die zuvor höchste Aktivität erhält den Status
STARTED
.
Wenn ein einzelner aktiver Anwendungsprozess mehrere Aktivitäten umfasst, wird die Aktivität mit der höchsten Z-Reihenfolge fortgesetzt und die anderen werden pausiert.
Konfigurationsänderungen
Wenn der Nutzer eine Anwendung in den Mehrfenstermodus versetzt, benachrichtigt das System die Aktivität einer Konfigurationsänderung, wie unter Konfigurationsänderungen verarbeiten beschrieben. Dies ist auch der Fall, wenn der Nutzer die Größe der App ändert oder sie wieder in den Vollbildmodus versetzt.
Im Wesentlichen hat diese Änderung dieselben Auswirkungen auf den Aktivitätslebenszyklus wie wenn das System die App benachrichtigt, dass das Gerät vom Hochformat zum Querformat gewechselt wurde. Der einzige Unterschied ist, dass die Geräteabmessungen nicht einfach nur vertauscht werden. Wie unter Konfigurationsänderungen verarbeiten beschrieben, kann Ihre Aktivität die Konfigurationsänderung selbst verarbeiten oder dem System ermöglichen, die Aktivität zu löschen und mit den neuen Dimensionen neu zu erstellen.
Wenn der Nutzer die Größe eines Fensters ändert und es in einer Dimension größer macht, passt das System die Aktivität an die Nutzeraktion an und nimmt nach Bedarf Konfigurationsänderungen vor. Wenn die App beim Zeichnen in neu exponierten Bereichen hinterherhinkt, füllt das System diese vorübergehend mit der Farbe aus, die über das Attribut windowBackground
oder das Standardattribut windowBackgroundFallback
festgelegt wurde.
Exklusiver Ressourcenzugriff
Zur Unterstützung der Funktion für mehrere Fortsetzungen wurde der neue Lebenszyklus-Callback onTopResumedActivityChanged()
eingeführt.
Diese Methode wird aufgerufen, wenn eine Aktivität die oberste Position der fortgesetzten Aktivität erreicht oder verliert. Das ist wichtig zu wissen, wenn eine Aktivität eine gemeinsame Singleton-Ressource verwendet, z. B. das Mikrofon oder die Kamera.
Kotlin
override fun onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top resumed activity // Can be a signal to re-acquire exclusive resources } else { // No longer the top resumed activity } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { if (topResumed) { // Top resumed activity // Can be a signal to re-acquire exclusive resources } else { // No longer the top resumed activity } }
Beachten Sie, dass in einer Anwendung aus anderen Gründen Ressourcen verloren gehen können, z. B. durch das Entfernen einer gemeinsam genutzten Hardware.
In jedem Fall sollte eine Anwendung mit Ereignissen und Statusänderungen umgehen, die sich auf verfügbare Ressourcen auswirken.
Bei Apps, die eine Kamera verwenden, gibt CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
einen Hinweis darauf, dass du versuchen solltest, Zugriff auf die Kamera zu erhalten. Diese Methode ist ab Android 10 (API-Level 29) verfügbar.
Beachten Sie, dass resizeableActivity=false
keine Garantie für exklusiven Kamerazugriff ist, da andere Apps, die die Kamera verwenden, auf anderen Displays geöffnet werden können.
Ihre App muss die Kamera nicht loslassen, wenn sie im Fokus ist. Angenommen, Sie möchten die Kameravorschau fortsetzen, während der Nutzer mit der neu fokussierten, fortgesetzten App interagiert. Ihre App kann die Kamera weiterhin ausführen, wenn es nicht die oberste fortgesetzte App ist, aber sie muss den Verbindungsfall richtig handhaben. Wenn die oberste fortgesetzte App die Kamera verwenden möchte, kann sie sie öffnen und Ihre App hat keinen Zugriff mehr. Die App kann die Kamera wieder öffnen, wenn der Fokus wieder liegt.
Nachdem eine App einen CameraDevice.StateCallback#onDisconnected()
-Callback empfangen hat, wird bei nachfolgenden Aufrufen auf dem Kameragerät ein CameraAccessException
-Objekt ausgelöst.
Multi-Display
Android 10 (API-Level 29) unterstützt Aktivitäten auf sekundären Displays. Wenn eine Aktivität auf einem Gerät mit mehreren Bildschirmen ausgeführt wird, können Nutzer sie von einer Anzeige auf eine andere verschieben. Multi-Resume gilt auch für Multiscreen-Szenarien. Mehrere Aktivitäten können gleichzeitig Nutzereingaben erhalten.
Eine App kann festlegen, in welcher Anzeige sie beim Start oder beim Erstellen einer anderen Aktivität ausgeführt werden soll. Dieses Verhalten hängt vom Startmodus der Aktivität ab, der in der Manifestdatei definiert ist, sowie von den Intent-Flags und Optionen, die von der Entität festgelegt werden, die die Aktivität startet. Weitere Informationen findest du unter ActivityOptions
.
Wenn eine Aktivität in eine sekundäre Anzeige verschoben wird, kann sie eine Kontextaktualisierung, eine Größenanpassung des Fensters sowie Konfigurations- und Ressourcenänderungen durchlaufen. Wenn die Aktivität die Konfigurationsänderung verarbeitet, wird sie in onConfigurationChanged()
benachrichtigt. Andernfalls wird die Aktivität neu gestartet.
Für eine Aktivität sollte die aktuelle Anzeige in onCreate
und onConfigurationChanged
geprüft werden, wenn die Konfigurationsänderung verarbeitet wird. Aktualisieren Sie die Ressourcen und Layouts, wenn sich die Anzeige ändert.
Wenn der ausgewählte Startmodus für eine Aktivität mehrere Instanzen zulässt, kann beim Starten auf einem sekundären Bildschirm eine neue Instanz der Aktivität erstellt werden. Beide Aktivitäten werden gleichzeitig fortgesetzt.
Informieren Sie sich auch über die APIs für mehrere Displays, die in Android 8.0 eingeführt wurden.
Aktivitäts- und Anwendungskontext im Vergleich
Bei Multi-Display-Anzeigen ist es entscheidend, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen unterscheidet sich der Aktivitätskontext (der angezeigt wird) vom Anwendungskontext (der nicht der Fall ist).
Der Aktivitätskontext enthält Informationen zur Anzeige und wird immer an den Anzeigebereich angepasst, in dem die Aktivität angezeigt wird. Auf diese Weise erhalten Sie die richtigen Informationen über die aktuelle Anzeigedichte oder Fenstermesswerte Ihrer App. Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwenden, um Informationen zum aktuellen Fenster oder zur aktuellen Anzeige zu erhalten. Dies betrifft auch einige System-APIs, die Informationen aus dem Kontext verwenden (z. B. siehe Toasts-Übersicht).
Die Konfiguration des Aktivitätsfensters und die übergeordnete Anzeige definieren Ressourcen und Kontext. So rufen Sie die aktuelle Anzeige ab:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
Rufen Sie die aktuellen Messwerte zum Aktivitätsfenster ab:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Rufen Sie die maximalen Fenstermesswerte für die aktuelle Systemkonfiguration ab:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
Die maximalen Fenstermesswerte dienen zum Durchführen von Berechnungen, Layoutentscheidungen oder zum Ermitteln der Größe der Ressourcen, die im Voraus abgerufen werden sollen. Wenn dies in onCreate()
verfügbar ist, können Sie diese Entscheidungen vor dem ersten Layout-Durchlauf treffen. Diese Messwerte sollten nicht für das Layout bestimmter Ansichtselemente verwendet werden. Nutzen Sie stattdessen Informationen aus dem Configuration
-Objekt.
Display-Aussparungen
Faltbare Geräte haben möglicherweise eine andere Aussparungsgeometrie, wenn sie auf- und zugeklappt sind. Informationen zur Vermeidung von Problemen mit Aussparungen finden Sie unter Best Practices für die Unterstützung von Display-Aussparungen.
Sekundäre Displays
Sie können die verfügbaren Bildschirme über den Systemdienst DisplayManager
abrufen:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
Verwenden Sie die Klasse Display
, um Informationen zu einer bestimmten Anzeige abzurufen, z. B. die Anzeigegröße oder Flags, die angeben, ob eine Anzeige sicher ist. Gehen Sie jedoch nicht davon aus, dass die Anzeigegröße mit der Anzeigefläche übereinstimmt, die Ihrer Anwendung zugewiesen ist. Denken Sie daran, dass Ihre Anwendung im Mehrfenstermodus einen Teil des Bildschirms einnimmt.
Bestimmen Sie, ob eine Aktivität auf einem Display gestartet werden kann:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
Starten Sie dann die Aktivität auf dem Display:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
Multi-Display-Unterstützung
Android bietet Multi-Display-Unterstützung für Softwaretastaturen, Hintergründe und Launcher.
Softwaretastatur
Eine Tastatur kann auf einem sekundären Bildschirm angezeigt werden, wenn der Bildschirm für die Systemgestaltung konfiguriert ist. Der Editor für Eingabemethoden wird automatisch angezeigt, wenn ein Textfeld auf dieser Anzeige Eingaben anfordert.
Hintergründe
In Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Das Framework erstellt für jede Anzeige eine separate Instanz von WallpaperService.Engine
. Die Oberfläche jeder Suchmaschine muss unabhängig voneinander gezeichnet werden. Entwickler können Assets mit dem Anzeigekontext in WallpaperService.Engine#getDisplayContext()
laden.
Achten Sie außerdem darauf, dass die Datei WallpaperInfo.xml
auf android:supportsMultipleDisplays="true"
gesetzt ist.
Launcher
Die neue Intent-Filterkategorie SECONDARY_HOME
bietet eine dedizierte Aktivität für sekundäre Bildschirme. Instanzen der Aktivität werden auf allen Displays verwendet, die Systemdesigns unterstützen, und zwar eine pro Bildschirm.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
Die Aktivität muss einen Startmodus haben, der mehrere Instanzen nicht verhindert und sich an verschiedene Bildschirmgrößen anpassen kann. Der Startmodus darf nicht singleInstance
oder singleTask
sein.
Beispielsweise unterstützt die AOSP-Implementierung von Launcher3
die Aktivität SECONDARY_HOME
.
Fenstermesswerte
Mit Android 11 (API-Level 30) wurden die folgenden WindowManager
-Methoden eingeführt, um die Grenzen von Apps bereitzustellen, die im Mehrfenstermodus ausgeführt werden:
getCurrentWindowMetrics()
: gibt einWindowMetrics
-Objekt für den aktuellen Windowing-Status des Systems zurückgetMaximumWindowMetrics()
: gibtWindowMetrics
für den größten potenziellen Windowing-Status des Systems zurück
Die Methoden der Jetpack-WindowManager-Bibliothek computeCurrentWindowMetrics()
und computeMaximumWindowMetrics()
bieten jeweils ähnliche Funktionen, sind jedoch abwärtskompatibel auf API-Level 14.
So rufen Sie Messwerte für andere als die aktuelle Anzeige ab:
- Anzeigekontext erstellen
- Fensterkontext für die Anzeige erstellen
WindowManager
des Fensterkontexts abrufenWindowMetrics
der maximal für die App verfügbaren Anzeigefläche abrufen
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
Verworfene Methoden
Die Display
-Methoden getSize()
und getMetrics()
wurden in API-Level 30 zugunsten der neuen WindowManager
-Methoden eingestellt.
In Android 12 (API-Level 31) werden die Display
-Methoden getRealSize()
und getRealMetrics()
eingestellt. Das Verhalten wird entsprechend aktualisiert, um dem Verhalten von getMaximumWindowMetrics()
besser zu entsprechen.
Konfiguration des Mehrfenstermodus
Wenn deine App auf Android 7.0 (API-Level 24) oder höher ausgerichtet ist, kannst du konfigurieren, wie und ob die App-Aktivitäten den Mehrfenstermodus unterstützen. Sie können in Ihrem Manifest Attribute festlegen, um sowohl die Größe als auch das Layout zu steuern. Die Attributeinstellungen einer Stammaktivität gelten für alle Aktivitäten innerhalb ihres Aufgabenstapels.
Wenn für die Root-Aktivität beispielsweise android:resizeableActivity="true"
festgelegt ist, kann die Größe aller Aktivitäten im Aufgabenstapel angepasst werden. Auf einigen größeren Geräten wie Chromebooks wird Ihre Anwendung möglicherweise auch dann in einem Fenster mit anpassbarer Größe ausgeführt, wenn Sie android:resizeableActivity="false"
angeben. Sollte deine App dadurch nicht mehr funktionieren, kannst du die Verfügbarkeit der App mithilfe von Filtern auf solchen Geräten einschränken.
Unter Android 12 (API-Level 31) ist standardmäßig der Mehrfenstermodus aktiviert. Auf großen Bildschirmen (sw >= 600 dp) werden alle Anwendungen unabhängig von der Anwendungskonfiguration im Mehrfenstermodus ausgeführt. Auf kleinen Bildschirmen prüft das System die Einstellungen für minWidth
, minHeight
und resizeableActivity
einer Aktivität, um festzustellen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann.
anpassbare Aktivität
Legen Sie dieses Attribut im Element <activity>
oder <application>
Ihres Manifests fest, um den Mehrfenstermodus für API-Level 30 und niedriger zu aktivieren oder zu deaktivieren:
<application android:name=".MyActivity" android:resizeableActivity=["true" | "false"] />
Wenn dieses Attribut auf „true“ gesetzt ist, kann die Aktivität im Splitscreen-Modus oder im freien Format gestartet werden. Wenn das Attribut auf „false“ gesetzt ist, unterstützt die Aktivität den Mehrfenstermodus nicht. Wenn dieser Wert „false“ ist und der Nutzer versucht, die Aktivität im Mehrfenstermodus zu starten, übernimmt die Aktivität den Vollbildmodus.
Wenn Ihre App auf API-Level 24 oder höher ausgerichtet ist, Sie aber keinen Wert für dieses Attribut angeben, wird der Wert des Attributs standardmäßig auf „wahr“ gesetzt.
Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist, funktioniert dieses Attribut auf kleinen und großen Bildschirmen unterschiedlich:
- Große Bildschirme (≥ 600 dp): Alle Apps unterstützen den Mehrfenstermodus. Das Attribut gibt an, ob die Größe einer Aktivität angepasst werden kann. Wenn
resizeableActivity="false"
, wird die App in den Kompatibilitätsmodus versetzt, wenn dies erforderlich ist, um Anzeigeabmessungen anzupassen. - Kleine Bildschirme (sw < 600 dp): Wenn
resizeableActivity="true"
und die Mindestbreite und die Mindesthöhe der Aktivität innerhalb der Anforderungen für den Mehrfenstermodus liegen, unterstützt die Aktivität den Mehrfenstermodus. BeiresizeableActivity="false"
unterstützt die Aktivität den Mehrfenstermodus unabhängig von der Mindestbreite und -höhe der Aktivität nicht.
unterstützt „Bild im Bild“
Lege dieses Attribut im Knoten <activity>
deines Manifests fest, um anzugeben, ob die Aktivität den Bild-im-Bild-Modus unterstützt.
<activity android:name=".MyActivity" android:supportsPictureInPicture=["true" | "false"] />
ConfigChanges
Wenn Sie die Konfigurationsänderungen im Mehrfenstermodus selbst verarbeiten möchten, z. B. wenn ein Nutzer die Größe eines Fensters ändert, fügen Sie dem Knoten des Anwendungsmanifests <activity>
das Attribut android:configChanges
mit mindestens den folgenden Werten hinzu:
<activity android:name=".MyActivity" android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation" />
Nachdem Sie android:configChanges
hinzugefügt haben, erhalten Ihre Aktivität und Ihre Fragmente einen Callback an onConfigurationChanged()
, anstatt gelöscht und neu erstellt zu werden. Anschließend können Sie die Ansichten bei Bedarf manuell aktualisieren, Ressourcen neu laden und andere Vorgänge ausführen.
<Layout>
Unter Android 7.0 (API-Level 24) und höher unterstützt das <layout>
-Manifestelement mehrere Attribute, die sich auf das Verhalten einer Aktivität im Mehrfenstermodus auswirken:
-
android:defaultHeight
,android:defaultWidth
- Standardhöhe und -breite der Aktivität beim Start im Freiformmodus.
-
android:gravity
-
Erste Platzierung der Aktivität beim Start im Freiformmodus. Passende Werte finden Sie unter
Gravity
. -
android:minHeight
,android:minWidth
- Mindesthöhe und Mindestbreite für die Aktivität im geteilten Bildschirmmodus und im Freiformmodus. Wenn der Nutzer die Trennlinie im geteilten Bildschirmmodus bewegt, um eine Aktivität kleiner als das angegebene Minimum zu machen, schneidet das System die Aktivität auf die vom Nutzer angeforderte Größe zu.
Der folgende Code zeigt, wie Sie die Standardgröße und den Standardort einer Aktivität sowie ihre Mindestgröße angeben, wenn die Aktivität im Freiformmodus angezeigt wird:
<activity android:name=".MyActivity"> <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end|..." android:minHeight="450dp" android:minWidth="300dp" /> </activity>
Mehrfenstermodus während der Laufzeit
Ab Android 7.0 bietet das System Funktionen zur Unterstützung von Apps, die im Mehrfenstermodus ausgeführt werden können.
Deaktivierte Funktionen im Mehrfenstermodus
Im Mehrfenstermodus werden von Android möglicherweise Funktionen deaktiviert oder ignoriert, die nicht für eine Aktivität gelten, bei der der Gerätebildschirm mit anderen Aktivitäten oder Apps geteilt wird.
Außerdem sind einige Anpassungsoptionen für die System-UI deaktiviert. Beispielsweise können Apps die Statusleiste nicht ausblenden, wenn sie im Mehrfenstermodus ausgeführt werden. Weitere Informationen finden Sie unter Sichtbarkeit der System-UI steuern.
Änderungen am Attribut android:screenOrientation
werden vom System ignoriert.
Abfragen und Callbacks im Mehrfenstermodus
Die Klasse Activity
bietet die folgenden Methoden zur Unterstützung des Mehrfenstermodus:
-
isInMultiWindowMode()
- Gibt an, ob sich die Aktivität im Mehrfenstermodus befindet.
-
isInPictureInPictureMode()
-
Gibt an, ob die Aktivität im Bild-im-Bild-Modus ist.
Hinweis:Der Bild-im-Bild-Modus ist ein Sonderfall des Mehrfenstermodus. Wenn
myActivity.isInPictureInPictureMode()
„true“ zurückgibt, gibtmyActivity.isInMultiWindowMode()
auch „true“ zurück. -
onMultiWindowModeChanged()
- Das System ruft diese Methode immer dann auf, wenn die Aktivität den Mehrfenstermodus aktiviert oder verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Mehrfenstermodus wechselt, oder den Wert „false“, wenn die Aktivität den Mehrfenstermodus verlässt.
-
onPictureInPictureModeChanged()
- Das System ruft diese Methode immer dann auf, wenn die Aktivität in den Bild-im-Bild-Modus wechselt oder diesen wieder verlässt. Das System übergibt der Methode den Wert „true“, wenn die Aktivität in den Bild-im-Bild-Modus wechselt, oder den Wert „false“, wenn die Aktivität den Bild-im-Bild-Modus verlässt.
Die Klasse Fragment
stellt Versionen vieler dieser Methoden bereit, z. B. Fragment.onMultiWindowModeChanged()
.
Bild-im-Bild-Modus
Wenn du eine Aktivität in den Bild-im-Bild-Modus versetzen möchtest, kannst du enterPictureInPictureMode()
aufrufen. Diese Methode hat keine Auswirkungen, wenn das Gerät den Bild-im-Bild-Modus nicht unterstützt. Weitere Informationen findest du unter Unterstützung von Bild im Bild.
Neue Aktivitäten im Mehrfenstermodus
Wenn Sie eine neue Aktivität starten, können Sie angeben, dass die neue Aktivität nach Möglichkeit neben der aktuellen Aktivität angezeigt werden soll. Verwenden Sie das Intent-Flag
FLAG_ACTIVITY_LAUNCH_ADJACENT
, das das System anweist, die neue Aktivität in einem angrenzenden Fenster zu erstellen, damit beide Aktivitäten den Bildschirm gemeinsam nutzen. Das System versucht, dies zu tun, aber dies kann nicht garantiert werden.
Wenn sich ein Gerät im Freiformmodus befindet und Sie eine neue Aktivität starten, können Sie die Abmessungen und die Bildschirmposition der neuen Aktivität durch Aufrufen von
ActivityOptions.setLaunchBounds()
angeben. Diese Methode hat keine Auswirkungen, wenn sich das Gerät nicht im Mehrfenstermodus befindet.
Wenn Sie auf API-Ebene 30 und niedriger eine Aktivität innerhalb eines Aufgabenstacks starten, ersetzt die Aktivität die Aktivität auf dem Bildschirm und übernimmt alle ihre Mehrfenstereigenschaften. Wenn Sie die neue Aktivität als separates Fenster im Mehrfenstermodus starten möchten, müssen Sie sie in einem neuen Aufgabenstapel starten.
Mit Android 12 (API-Level 31) können Apps das Aufgabenfenster einer App auf mehrere Aktivitäten aufteilen. Durch Erstellen einer XML-Konfigurationsdatei oder Jetpack WindowManager API-Aufrufe können Sie festlegen, wie die Aktivitäten Ihrer Anwendung im Vollbildmodus, nebeneinander oder gestapelt angezeigt werden.
Drag-and-Drop
Nutzer können Daten per Drag-and-drop von einer Aktivität in eine andere ziehen, während beide Aktivitäten den Bildschirm teilen. Vor Android 7.0 konnten Nutzer Daten nur innerhalb einer einzelnen Aktivität per Drag-and-drop verschieben. Wenn Sie schnell Unterstützung für das Akzeptieren gelöschter Inhalte hinzufügen möchten, können Sie die DropHelper API lesen. Eine umfassende Anleitung zum Drag-and-drop finden Sie unter Drag-and-drop.
Mehrere Instanzen
Jede Stammaktivität hat eine eigene Aufgabe, die in einem separaten Prozess ausgeführt wird und in einem eigenen Fenster angezeigt wird. Wenn Sie eine neue Instanz der Anwendung in einem separaten Fenster starten möchten, können Sie mit dem Flag FLAG_ACTIVITY_NEW_TASK
neue Aktivitäten starten.
Sie können dies mit einigen der Mehrfensterattribute kombinieren, um eine bestimmte Position für das neue Fenster anzufordern. Eine Shopping-App kann beispielsweise mehrere Fenster anzeigen, um Produkte zu vergleichen.
Unter Android 12 (API-Level 31) kannst du zwei Instanzen einer Aktivität nebeneinander im selben Aufgabenfenster starten.
Wenn Sie Nutzern erlauben möchten, eine andere Instanz Ihrer App über den App Launcher oder die Taskleiste zu starten, müssen Ihre Launcher-Aktivitäten android:resizeableActivity="true"
festlegen und keinen Startmodus verwenden, der mehrere Instanzen verhindert.
Beispielsweise kann eine singleInstancePerTask
-Aktivität mehrmals in verschiedenen Aufgaben instanziiert werden, wenn FLAG_ACTIVITY_MULTIPLE_TASK
oder FLAG_ACTIVITY_NEW_DOCUMENT
festgelegt ist.
Verwechseln Sie nicht mehrere Instanzen mit einem Layout mit mehreren Steuerfeldern, z. B. einer Präsentation mit Details, die SlidingPaneLayout
verwendet und in einem einzelnen Fenster ausgeführt wird.
Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden, kann eine oder mehrere Instanzen in den Hintergrund verschoben werden, wenn sich der Sicherheitsstatus ändert. Angenommen, ein Gerät ist aufgeklappt mit zwei App-Instanzen, die in zwei Fenstern auf beiden Seiten des Fold ausgeführt werden. Wird das Gerät zugeklappt, wird möglicherweise eine der Instanzen beendet, anstatt zu versuchen, die Fenster für beide Instanzen auf einen kleineren Bildschirm anzupassen.
Bestätigung im Mehrfenstermodus
Unabhängig davon, ob Ihre App auf API-Level 24 oder höher ausgerichtet ist, sollten Sie prüfen, wie sie sich im Mehrfenstermodus verhält, wenn ein Nutzer versucht, sie auf einem Gerät mit Android 7.0 oder höher im Mehrfenstermodus zu starten.
Testgeräte
Geräte mit Android 7.0 (API-Level 24) oder höher unterstützen den Mehrfenstermodus.
API-Level 23 oder niedriger
Wenn Nutzer versuchen, die App im Mehrfenstermodus zu verwenden, ändert das System die Größe der App erzwungen, sofern die App keine feste Ausrichtung deklariert.
Wenn für deine App keine feste Ausrichtung deklariert ist, solltest du sie auf einem Gerät mit Android 7.0 oder höher starten und versuchen, die App in den geteilten Bildschirmmodus zu versetzen. Prüfen Sie, ob die Größe der Anwendung akzeptabel ist, wenn die Größe der Anwendung erzwungen wird.
Wenn die App eine feste Ausrichtung deklariert, sollten Sie versuchen, die App in den Mehrfenstermodus zu versetzen. Die App muss dabei im Vollbildmodus bleiben.
API-Ebenen 24 bis 30
Wenn Ihre App auf API-Level 24 bis 30 ausgerichtet ist und die Unterstützung des Mehrfenstermodus nicht deaktiviert, prüfen Sie das folgende Verhalten sowohl im Splitscreen-Modus als auch im freien Format:
- Starte die App im Vollbildmodus und wechsle dann in den Mehrfenstermodus, indem du lange auf die Schaltfläche „Letzte Apps“ drückst. Prüfen Sie, ob der Wechsel der App ordnungsgemäß funktioniert.
- Starten Sie die App direkt im Mehrfenstermodus und prüfen Sie, ob sie ordnungsgemäß gestartet wird. Du kannst eine App im Mehrfenstermodus starten, indem du die Schaltfläche „Letzte Apps“ drückst, die Titelleiste deiner App lange gedrückt hältst und sie in einen der hervorgehobenen Bereiche auf dem Bildschirm ziehst.
- Passen Sie die Größe Ihrer App im Splitscreen-Modus an, indem Sie den Bildschirmteiler ziehen. Prüfe, ob die Größe der App ohne Absturz angepasst wird und ob die erforderlichen UI-Elemente sichtbar sind.
- Wenn du Mindestabmessungen für deine App festgelegt hast, versuche, die Größe der App unter diese Abmessungen zu ändern. Achte darauf, dass die Größe der App nicht kleiner als die angegebenen Mindestabmessungen sein darf.
- Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Achten Sie beispielsweise darauf, dass die Aktualisierung der UI nach der Größenanpassung der Anwendung nicht zu lange dauert.
API-Level 31 oder höher
Wenn Ihre App auf API-Level 31 oder höher ausgerichtet ist und die Mindestbreite und -höhe der Hauptaktivität kleiner oder gleich den Abmessungen des verfügbaren Anzeigebereichs sind, prüfen Sie alle für die API-Ebenen 24 bis 30 aufgeführten Verhaltensweisen.
Checkliste testen
Mit den folgenden Vorgängen können Sie die Leistung Ihrer Anwendung im Mehrfenstermodus prüfen. Sofern nicht anders angegeben, sollten Sie diese Vorgänge sowohl im Splitscreen- als auch im Freiformmodus ausprobieren.
- Mehrfenstermodus aktivieren und verlassen
- Wechseln Sie von Ihrer Anwendung zu einer anderen Anwendung und prüfen Sie, ob sich die Anwendung ordnungsgemäß verhält, wenn sie zwar sichtbar, aber nicht aktiv ist. Wenn deine App beispielsweise ein Video wiedergibt, solltest du prüfen, ob das Video weiterhin abgespielt wird, während der Nutzer mit einer anderen App interagiert.
- Verschieben Sie im geteilten Bildschirmmodus den Bildschirmteiler, um Ihre App größer und kleiner zu machen. Testen Sie diese Vorgänge in beiden parallelen und einer über den anderen Konfigurationen. Achten Sie darauf, dass die App nicht abstürzt, wichtige Funktionen sichtbar sind und der Vorgang zur Größenänderung nicht zu lange dauert.
- Führen Sie schnell nacheinander mehrere Größenänderungsvorgänge durch. Achten Sie darauf, dass Ihre App nicht abstürzt und keine Speicherlecks verursacht. Der Memory Profiler von Android Studio liefert Informationen zur Arbeitsspeichernutzung Ihrer App (siehe Arbeitsspeichernutzung Ihrer App mit Memory Profiler prüfen).
- Verwenden Sie Ihre Anwendung normal in einer Reihe verschiedener Fensterkonfigurationen und prüfen Sie, ob sich die Anwendung ordnungsgemäß verhält. Der Text muss lesbar sein und die UI-Elemente dürfen nicht zu klein für die Interaktion sein.
Unterstützung für Mehrfenstermodus deaktiviert
Wenn Sie bei den API-Ebenen 24 bis 30 die Unterstützung des Mehrfenstermodus durch Festlegen von android:resizeableActivity="false"
deaktiviert haben, sollten Sie Ihre App auf einem Gerät mit Android 7.0 bis 11 starten und versuchen, sie in den Splitscreen- oder Freiformmodus zu versetzen. Achten Sie darauf, dass die App dabei im Vollbildmodus bleibt.
Zusätzliche Ressourcen
Weitere Informationen zur Unterstützung des Mehrfenstermodus unter Android finden Sie hier:
- 5 Tipps zur Vorbereitung auf den Mehrfenstermodus in Android N
- MultiWindowPlayground-Beispiel für Android
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Gerätekompatibilitätsmodus
- Unterstützung großer Bildschirmgrößen
- Konfigurationsänderungen verarbeiten