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