Mit dem Mehrfenstermodus können mehrere Apps gleichzeitig denselben Bildschirm verwenden. Apps können nebeneinander oder übereinander (Splitscreen-Modus) angezeigt werden. ein kleines Fenster, das andere Apps überlagert (Bild-im-Bild-Modus), oder einzelne Apps in separaten beweglichen Fenstern mit anpassbarer Größe (Freiformmodus)
<ph type="x-smartling-placeholder">Die Nutzererfahrung hängt von der Android-Version und dem Gerätetyp ab:
Splitscreen-Modus für Android 7.0 (API-Level 24) für kleine Bildschirme und auf ausgewählten Geräten den Bild-im-Bild-Modus.
Im Splitscreen-Modus werden zwei Apps auf dem Bildschirm angezeigt. nebeneinander oder übereinander liegen. Nutzer können die Trennlinie ziehen. und trennen die beiden Apps voneinander, sodass eine App größer und die andere kleiner wird.
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).
Modus im freien Format, in dem Nutzer jede Aktivität kostenlos anpassen können, von Herstellern von Geräten mit großen Bildschirmen ermöglicht werden.
Du kannst festlegen, wie deine App den Mehrfenstermodus handhaben soll, indem du Folgendes angibst: auf die Mindestgröße Ihrer Aktivität. Sie können auch Mehrfenstermodus für deine App, indem du
resizeabableActivity="false"
, damit das System immer im Vollbildmodus der App.
Android 8.0 (API-Level 26) erweitert den Bild-im-Bild-Modus auf kleine Bildschirmgeräte.
Android 12 (API-Level 31) verwendet den Mehrfenstermodus zum Standardverhalten.
Auf großen Bildschirmen (Klasse mittlere oder maximierte Fenstergröße) Plattform unterstützt alle Apps im Mehrfenstermodus, unabhängig von der App Konfiguration. Wenn
resizeableActivity="false"
, wird die App in Kompatibilitätsmodus, wenn dies erforderlich ist, um die Displayabmessungen zu berücksichtigen.Auf kleinen Bildschirmen (kompakte Fenstergrößenklasse) prüft das System der
minWidth
undminHeight
einer Aktivität, um zu bestimmen, kann die Aktivität im Mehrfenstermodus ausgeführt werden. WennresizeableActivity="false"
, die App kann nicht ausgeführt werden in Mehrfenstermodus unabhängig von der Mindestbreite und -höhe verwendet werden.
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 eine andere App ausführen
Nutzer können den geteilten Bildschirmmodus beenden, indem sie die Fensterteiler an den Rand des 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
, um den Inhalt in einem angrenzenden Bereich zu öffnen
Splitscreen-Fenster.
FLAG_ACTIVITY_LAUNCH_ADJACENT
wurde in Android 7.0 (API-Level 24) eingeführt, um
Apps im Split-Screen-Modus aktivieren, um Aktivitäten im angrenzenden
.
Unter Android 12L (API-Level 32) und höher wurde die Definition des Flags auf Apps im Vollbildmodus aktivieren, um den Splitscreen-Modus zu aktivieren, und dann Aktivitäten im angrenzenden Fenster.
Um eine angrenzende Aktivität zu starten, verwende FLAG_ACTIVITY_LAUNCH_ADJACENT
in
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. Die der fortgesetzte Zustand von Apps in mehreren Fenstern variiert je nach Version Android
Multi-Lebenslauf
Android 10 (API-Level 29) und höher 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 dem
Aktivität oder die Aktivität ist nicht fokussierbar, z. B. wenn sie
Bild-im-Bild-Modus aktivieren. Es ist auch möglich, dass keine Aktivität
z. B. wenn die Benachrichtigungsleiste geöffnet ist. Die onStop()
wie gewohnt funktioniert: Die Methode wird jedes Mal aufgerufen, wenn eine Aktivität beendet wird.
auf dem Bildschirm.
Der Multi-Resume ist auch auf ausgewählten Geräten mit Android 9 (API-Level) verfügbar 28). Füge das folgende Manifest hinzu, um auf Android 9-Geräten die Mehrfach-Fortsetzung zu aktivieren Metadaten:
<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 der Gerätespezifikationen.
Android 9
Im Mehrfenstermodus unter Android 9 (API-Level 28) und niedriger wird nur die Aktivität
mit dem der Nutzer zuletzt interagiert hat, zu einem bestimmten Zeitpunkt aktiv ist. Dieses
Aktivität gilt als höchste Aktivität und ist die einzige Aktivität in der RESUMED
Bundesstaat. Alle anderen sichtbaren Aktivitäten sind STARTED
, sind aber nicht RESUMED
.
Das System verleiht diesen sichtbaren, aber nicht wiederaufgenommenen Aktivitäten einen höheren
als Aktivitäten, die nicht sichtbar sind. Interagiert die nutzende Person mit einem der
sichtbaren Aktivitäten, diese Aktivität wird fortgesetzt und die zuvor
wechselt die Aktivität in den Status STARTED
.
Wenn ein einzelner aktiver Anwendungsprozess mehrere Aktivitäten umfasst, Die Aktivität mit der höchsten Z-Reihenfolge wird fortgesetzt und die anderen werden pausiert.
Konfigurationsänderungen
Wenn der Nutzer eine App in den Mehrfenstermodus versetzt, benachrichtigt das System das Aktivität einer Konfigurationsänderung, wie in der Handle-Konfiguration angegeben Änderungen. Dies ist auch der Fall, wenn der Nutzer die Größe der App ändert oder die App wieder herunterlädt. in den Vollbildmodus wechseln.
Im Wesentlichen hat diese Änderung dieselben Auswirkungen auf den Aktivitätslebenszyklus benachrichtigt das System die App, dass das Gerät vom Hochformat auf Querformat verwenden, außer dass die App-Abmessungen die gerade vertauscht werden. Ihre Aktivität kann die Konfigurationsänderung selbst verarbeiten oder kann Ihre App es dem System ermöglichen, die Aktivität zu beseitigen und sie mit dem neue Dimensionen.
Wenn der Nutzer die Größe eines Fensters ändert und es in einer Dimension größer macht,
Das System passt die Aktivität an die Konfiguration der Nutzeraktionen und Probleme an
bei Bedarf anpassen. Wenn die App beim Zeichnen an neu belichteten Bereichen etwas zurückbleibt,
füllt das System diese Bereiche vorübergehend mit der vom
windowBackground
-Attribut oder als Standard
windowBackgroundFallback
-Stilattribut.
Exklusiver Ressourcenzugriff
Zur Unterstützung der Funktion für mehrere Fortsetzungen verwenden Sie die
onTopResumedActivityChanged()
-Lebenszyklus-Callback.
Der Callback wird ausgelöst, wenn eine Aktivität die höchste fortgesetzte Aktivität zu- oder abnimmt oder verliert. was wichtig ist, wenn eine Aktivität eine gemeinsame Singleton-Ressource verwendet. wie 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 App aus anderen Gründen Ressourcen verloren gehen können, z. B. durch das Entfernen eines gemeinsam genutzter Hardware.
In jedem Fall sollte eine App angemessen auf Ereignisse und Statusänderungen reagieren, auf verfügbare Ressourcen auswirken.
Bei Apps mit Kamera
CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
deutet darauf hin, dass du jetzt versuchen solltest, Zugriff auf die Kamera zu erhalten.
Diese Methode ist ab Android 10 (API-Level 29) verfügbar.
Denk daran, dass resizeableActivity=false
keine Garantie für exklusive Kamerafunktionen bietet
da andere Apps, die die Kamera verwenden, auf anderen Displays geöffnet werden können.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/camera.png?authuser=6&hl=de)
Ihre App muss die Kamera nicht loslassen, wenn die App den Fokus verliert. Sie können z. B. die Kameravorschau fortsetzen, während der Nutzer mit der App interagiert. mit der neu fokussierten, fortgesetzten App. Es ist in Ordnung, wenn Ihre App wenn dies nicht die oberste fortgesetzte App ist, sondern die um das Lade-Case zu trennen. Wenn die oberste fortgesetzte App den Parameter können Sie sie öffnen und Ihre App hat dann keinen Zugriff mehr. Deine App kann die wenn die App wieder im Fokus ist.
Nachdem eine App eine CameraDevice.StateCallback#onDisconnected()
erhalten hat
-Rückruf zurücksetzt, wird bei nachfolgenden Anrufen auf dem Kameragerät eine
CameraAccessException
.
Multi-Display
Android 10 (API-Level 29) unterstützt Aktivitäten auf sekundären Displays. Wenn ein Aktivität auf einem Gerät mit mehreren Bildschirmen ausgeführt wird, können Nutzer von einem Display zum anderen. Multi-Resume gilt für und Multiscreen-Szenarien; können verschiedene Aktivitäten Benutzereingaben am .
Eine App kann festlegen, auf welchem Display sie beim Start oder beim Start
erstellt eine weitere Aktivität. Dieses Verhalten hängt vom Startmodus der Aktivität ab
die in der Manifestdatei und in den Intent-Flags und Optionen
die die Aktivität startet. Weitere Informationen finden Sie im Kurs ActivityOptions
Details.
Wenn eine Aktivität zu einer sekundären Anzeige verschoben wird, kann sie einen Kontext durchlaufen
Aktualisierungen,
Größenanpassung des Fensters sowie
Konfigurations- und Ressourcenänderungen. Wenn die Aktivität
die Konfigurationsänderung verarbeitet, wird die Aktivität
onConfigurationChanged()
; Andernfalls wird die Aktivität neu gestartet.
Für eine Aktivität sollten die aktuelle Anzeige in onCreate()
und
onConfigurationChanged()
, wenn die Konfigurationsänderung verarbeitet wird. Achten Sie darauf,
die Ressourcen und Layouts aktualisieren, wenn sich die Anzeige ändert.
Wenn der ausgewählte Startmodus für eine Aktivität mehrere Instanzen zulässt, wird der auf einem zweiten Bildschirm eine neue Instanz der Aktivität erstellen. Beide Aktivitäten werden zeitgleich fortgesetzt.
<ph type="x-smartling-placeholder">![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/multi-display.png?authuser=6&hl=de)
Informieren Sie sich auch über die Multi-Display-APIs, in Android 8.0.
Aktivitäts- und Anwendungskontext im Vergleich
Bei Multi-Display-Anzeigen ist es entscheidend, den richtigen Kontext zu verwenden. Beim Zugriff auf Ressourcen Der Aktivitätskontext (der angezeigt wird) unterscheidet sich von der Anwendung. Kontext (was nicht der Fall ist).
Der Aktivitätskontext enthält Informationen über den Bildschirm und wird immer an den Anzeigebereich angepasst, in dem die Aktivität angezeigt wird. So können Sie die richtigen Informationen über die Anzeigedichte oder die Fenstermesswerte Ihres Sie sollten immer den Aktivitätskontext (oder einen anderen UI-basierten Kontext) verwendet, um Informationen zum aktuellen Fenster oder zur aktuellen Anzeige zu erhalten. Dies gilt auch für wirkt sich auf einige System-APIs aus, die Informationen aus dem Kontext verwenden (z. B. die 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, Layout-Entscheidungen
die Größe der abzurufenden Ressourcen
im Voraus bestimmen. Wenn wir diese Informationen
in onCreate()
können Sie diese Entscheidungen bereits vor dem ersten Layout treffen,
übergeben. Diese Messwerte sollten nicht verwendet werden, um bestimmte Ansichtselemente festzulegen.
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.
als Anzeigegröße oder Flags, die angeben, ob eine Anzeige sicher ist.
Gehen Sie jedoch nicht davon aus, dass die Anzeigegröße
Displaybereich, der Ihrer App zugewiesen ist. Denken Sie daran, dass im Mehrfenstermodus
Ihre App 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 Launchern.
Softwaretastatur
Eine Tastatur kann auf einem zweiten Bildschirm angezeigt werden, wenn das Display so konfiguriert ist: System-Dekorationen unterstützt. Der Eingabemethoden-Editor wird automatisch angezeigt, Textfeld fordert eine Eingabe über die Anzeige an.
<ph type="x-smartling-placeholder">![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/keyboard.png?authuser=6&hl=de)
Hintergründe
In Android 10 (API-Level 29) können sekundäre Bildschirme einen Hintergrund haben. Die
wird für jedes Framework eine separate Instanz von WallpaperService.Engine
erstellt.
Display. Die Oberfläche jeder Suchmaschine muss unabhängig voneinander gezeichnet werden. Entwickler*innen
können Assets mit dem Displaykontext in
WallpaperService.Engine#getDisplayContext()
. Achten Sie außerdem darauf,
WallpaperInfo.xml
-Dateisätze android:supportsMultipleDisplays="true"
.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/wallpaper.png?authuser=6&hl=de)
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,
unterstützen System-Dekorationen, eines pro Display.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
Die Aktivität muss einen Startmodus haben, der nicht verhindert, dass mehrere Instanzen auftreten
die sich an verschiedene Bildschirmgrößen anpassen. Der Launch-Modus kann nicht
singleInstance
oder singleTask
.
Die AOSP-Implementierung von Launcher3
unterstützt beispielsweise Folgendes:
Aktivität „SECONDARY_HOME
“.
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/launcher-phone.png?authuser=6&hl=de)
![](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/multi-window-mode/launcher-display.png?authuser=6&hl=de)
Fenstermesswerte
Mit Android 11 (API-Level 30) wurden die folgenden WindowManager
-Methoden eingeführt
um die Grenzen der Anwendungen bereitzustellen, die im Mehrfenstermodus ausgeführt werden:
getCurrentWindowMetrics()
: gibt einWindowMetrics
-Objekt für des aktuellen Windowing-Status des Systems.getMaximumWindowMetrics()
: gibtWindowMetrics
für den größten Wert zurück den potenziellen Windowing-Zustand des Systems.
Die Methoden der Jetpack WindowManager-Bibliothek computeCurrentWindowMetrics()
und computeMaximumWindowMetrics()
bieten ähnliche Funktionen
abwärtskompatibel auf API-Level 14.
So rufen Sie Messwerte für andere Displays 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
Display
-Methoden getSize()
und getMetrics()
wurden eingestellt in
API-Ebene 30 zugunsten der neuen WindowManager
-Methoden.
Unter Android 12 (API-Level 31) werden die Display
-Methoden getRealSize()
und
getRealMetrics()
und aktualisiert ihr Verhalten, um sie besser an die
Verhalten von getMaximumWindowMetrics()
.
Konfiguration des Mehrfenstermodus
Wenn Ihre App auf Android 7.0 (API-Level 24) oder höher ausgerichtet ist, können Sie konfigurieren, wie
und ob die Aktivitäten in Ihrer App den Mehrfenstermodus unterstützen. Sie können
in Ihrem Manifest, um sowohl Größe als auch Layout zu steuern. Eine Stammaktivität
Attributeinstellungen gelten für alle Aktivitäten innerhalb des zugehörigen Aufgabenstapels. Beispiel:
Wenn die Stammaktivität android:resizeableActivity="true"
aufweist, dann gilt:
bei Aktivitäten im Aufgaben-Stack kann die Größe angepasst werden. Auf einigen größeren Geräten wie
Auf Chromebooks wird Ihre App möglicherweise in einem Fenster mit anpassbarer Größe ausgeführt, selbst wenn Sie
android:resizeableActivity="false"
Falls deine App dadurch nicht mehr funktioniert, kannst du
Filtern bei Google Play, um die Verfügbarkeit Ihrer App auf solchen Geräten einzuschränken.
Unter Android 12 (API-Level 31) ist standardmäßig der Mehrfenstermodus aktiviert. Auf großen Bildschirmen
(mittlere oder maximierte Fenstergrößenklasse), alle Apps werden im Mehrfenstermodus ausgeführt
unabhängig von der App-Konfiguration. Auf kleinen Bildschirmen prüft das System
minWidth
, minHeight
und resizeableActivity
der Aktivität
festlegen, ob die Aktivität im Mehrfenstermodus ausgeführt werden kann.
resizeableActivity
Legen Sie dieses Attribut im <activity>
oder <application>
Ihres Manifests fest.
-Element zum Aktivieren oder Deaktivieren des Mehrfenstermodus für API-Level 30 und niedriger:
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
Wenn dieses Attribut auf true
gesetzt ist, kann die Aktivität im Splitscreen-Modus gestartet werden
und Freiform-Modi. Wenn das Attribut auf false
gesetzt ist, wird die Aktivität nicht
unterstützen den Mehrfenstermodus. Wenn der Wert „false“ ist und der Nutzer versucht,
starten Sie die Aktivität im Mehrfenstermodus,
Bildschirm.
Wenn Ihre App auf API-Level 24 oder höher ausgerichtet ist, Sie aber keinen Wert für dieses Attribut enthält, wird der Wert des Attributs 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:
- Große Bildschirme (mittlere oder maximierte Fenstergröße): alle Apps
unterstützen den Mehrfenstermodus. Das Attribut gibt an, ob eine Aktivität
kann die Größe angepasst werden. Wenn
resizeableActivity="false"
, wird die App in Kompatibilitätsmodus, wenn dies zur Einhaltung der Displayabmessungen erforderlich ist. - Kleine Bildschirme (kompakte Fenstergrößenklasse): Wenn
resizeableActivity="true"
und Mindestbreite und Mindesthöhe bei Aktivität die Anforderungen für den Mehrfenstermodus erfüllen, unterstützt die Aktivität den Mehrfenstermodus . WennresizeableActivity="false"
, wird die Aktivität nicht unterstützt Mehrfenstermodus unabhängig von der Mindestbreite und -höhe der Aktivität.
supportsPictureInPicture
Legen Sie dieses Attribut im Knoten <activity>
Ihres Manifests fest, um anzugeben, ob
unterstützt die Aktivität den Bild-im-Bild-Modus.
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
Um die Konfigurationsänderungen im Mehrfenstermodus selbst zu verarbeiten, z. B. wenn ein Nutzer
die Größe eines Fensters ändern, fügen Sie Ihrer App das Attribut android:configChanges
hinzu
Knoten des Manifests <activity>
mit mindestens den folgenden Werten:
<activity
android:name=".MyActivity"
android:configChanges="screenSize | smallestScreenSize
| screenLayout | orientation" />
Nach dem Hinzufügen von android:configChanges
erhalten deine Aktivität und deine Fragmente eine
an onConfigurationChanged()
zurück, anstatt gelöscht zu werden und
neu erstellt. Anschließend können Sie Ihre Ansichten
manuell aktualisieren, Ressourcen neu laden
bei Bedarf weitere Vorgänge ausführen.
<layout>
Unter Android 7.0 (API-Level 24) und höher wird das Manifestelement <layout>
unterstützt mehrere Attribute, die sich auf das Verhalten einer Aktivität im Mehrfenstermodus auswirken
Modus:
android:defaultHeight
,android:defaultWidth
: Standardhöhe und -breite von die Aktivität, wenn sie im Freiformmodus gestartet wird.android:gravity
: anfängliche Platzierung der Aktivität beim Start in Modus „Freies Format“. Geeignete Werte finden Sie in der KlasseGravity
.android:minHeight
,android:minWidth
: Mindesthöhe und Mindestbreite sowohl im Splitscreen- als auch im Freiformmodus. Wenn der Nutzer umzieht die Trennlinie im geteilten Bildschirmmodus, um eine Aktivität kleiner als die angegebenen Minimum reduziert, schneidet das System die Aktivität auf die Größe -Anfragen.
Der folgende Code zeigt, wie Sie die Standardgröße und den Standardort einer Aktivität angeben und die Mindestgröße, 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 kann im Mehrfenstermodus ausgeführt werden.
Deaktivierte Funktionen im Mehrfenstermodus
Im Mehrfenstermodus werden nicht anwendbare Funktionen von Android möglicherweise deaktiviert oder ignoriert zu einer Aktivität, bei der der Gerätebildschirm mit anderen Aktivitäten oder Apps geteilt wird.
Außerdem sind einige Anpassungsoptionen für die System-UI deaktiviert. Beispiel: Apps können 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
Modus:
isInMultiWindowMode()
: Gibt an, ob die Aktivität in Mehrfenstermodus.isInPictureInPictureMode()
: Gibt an, ob die Aktivität in Bild-im-Bild-Modus.onMultiWindowModeChanged()
: Das System ruft diese Methode immer dann auf, wenn die wird der Mehrfenstermodus aktiviert oder deaktiviert. Das System übergibt die 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 auf wird der Bild-im-Bild-Modus aktiviert oder deaktiviert. Das System hat die Prüfung bestanden Die Methode mit dem Wert „true“, wenn die Aktivität in den Bild-im-Bild-Modus wechselt. Modus oder „false“, wenn die Aktivität den Bild-im-Bild-Modus verlässt.
Die Klasse Fragment
stellt Versionen vieler dieser Methoden bereit. zum Beispiel
Fragment.onMultiWindowModeChanged()
.
Bild-im-Bild-Modus
Um den Bild-im-Bild-Modus für eine Aktivität zu aktivieren, rufe
enterPictureInPictureMode()
Diese Methode hat keine Auswirkungen, wenn das Gerät
unterstützt den Bild-im-Bild-Modus nicht. Weitere Informationen finden Sie unter Videos hinzufügen mit
Bild im Bild (BiB)
Neue Aktivitäten im Mehrfenstermodus
Wenn Sie eine neue Aktivität starten, können Sie angeben, dass die
wenn möglich neben der aktuellen
angezeigt. Intent-Flag verwenden
FLAG_ACTIVITY_LAUNCH_ADJACENT
. Dadurch wird das System angewiesen, zu versuchen,
neue Aktivität in einem angrenzenden Fenster öffnen, sodass beide Aktivitäten den Bildschirm gemeinsam nutzen. Die
versucht, dies zu erreichen, aber es ist nicht garantiert, dass dies geschieht.
Wenn sich ein Gerät im Freiformmodus befindet und Sie eine neue Aktivität starten, können Sie
geben Sie die Dimensionen und die Bildschirmposition an, indem Sie
ActivityOptions.setLaunchBounds()
. Die Methode hat keine Auswirkungen, wenn das Gerät
sich nicht im Mehrfenstermodus befindet.
Wenn Sie auf API-Ebene 30 und niedriger eine Aktivität innerhalb eines Aufgaben-Stacks starten, Aktivität ersetzt die Aktivität auf dem Bildschirm und übernimmt den gesamten Mehrfenstermodus Eigenschaften. Wenn Sie die neue Aktivität in einem separaten Fenster Mehrfenstermodus müssen Sie ihn in einem neuen Aufgabenstapel starten.
Mit Android 12 (API-Level 31) können Apps das Aufgabenfenster einer App aufteilen Aktivitäten zuordnen. Sie legen fest, wie Ihre App ihre Aktivitäten – im Vollbildmodus, nebeneinander oder übereinander –, indem Sie eine XML-Datei oder Jetpack WindowManager API-Aufrufe ausführen.
Drag-and-Drop
Nutzer können Daten per Drag-and-drop von einer Aktivität in eine andere ziehen, während die beiden
Aktivitäten teilen den Bildschirm. (Vor Android 7.0 konnten Nutzer
und Daten in einer einzigen Aktivität löschen.) Um schnell Unterstützung für das Akzeptieren von
verworfene Inhalte finden Sie in der DropHelper
API. Für umfassende Drag-and-drop-
finden Sie unter Drag-and-drop aktivieren.
Mehrere Instanzen
Jede Stammaktivität hat ihre eigene Aufgabe, die in einem separaten Prozess ausgeführt wird und
in einem eigenen Fenster angezeigt. So starten Sie eine neue Instanz Ihrer App in einem separaten
können Sie mit dem Flag FLAG_ACTIVITY_NEW_TASK
neue Aktivitäten starten. Ich
können Sie dies mit einigen der Mehrfensterattribute kombinieren, um
eine bestimmte Position
für das neue Fenster festlegen. Eine Shopping-App kann beispielsweise
mehrere Fenster, um Produkte zu vergleichen.
Mit Android 12 (API-Level 31) kannst du zwei Instanzen einer Aktivität starten im selben Aufgabenfenster nebeneinander angezeigt.
Wenn Sie Nutzern erlauben möchten, eine andere Instanz Ihrer Anwendung aus
App Launchers oder der Taskleiste darauf, dass Ihre Launcher-Aktivitäten
legt android:resizeableActivity="true"
fest und verwendet keinen Startmodus, der
verhindert mehrere Instanzen. Beispielsweise kann eine singleInstancePerTask
-Aktivität
mehrfach in verschiedenen Aufgaben instanziiert werden,
FLAG_ACTIVITY_MULTIPLE_TASK
oder FLAG_ACTIVITY_NEW_DOCUMENT
ist festgelegt.
Verwechseln Sie nicht mehrere Instanzen mit einem Layout mit mehreren Steuerfeldern, wie z. B. list-detail
Präsentation mit SlidingPaneLayout
, die in einem einzelnen
.
Wenn auf einem faltbaren Gerät mehrere Instanzen in separaten Fenstern ausgeführt werden Gerät wird möglicherweise eine oder mehrere Instanzen in den Hintergrund verschoben, wenn der Sicherheitsstatus Änderungen. Beispiel: Ein aufgeklapptes Gerät mit zwei App-Instanzen in zwei Fenstern auf beiden Seiten des Faltens. Ist das Gerät zugeklappt, der Instanzen können beendet werden, anstatt zu versuchen, auf einem kleineren Bildschirm.
Bestätigung im Mehrfenstermodus
Unabhängig davon, ob Ihre App auf API-Level 24 oder höher ausgerichtet ist, sollten Sie prüfen, verhält sich im Mehrfenstermodus, wenn ein Nutzer versucht, die App im Mehrfenstermodus zu starten. auf einem Gerät mit Android 7.0 oder höher aktivieren.
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, wird das System zwangsweise die Größe der App ändert, es sei denn, sie deklariert eine feste Ausrichtung.
Wenn für Ihre App keine feste Ausrichtung deklariert ist, starten Sie sie auf ein Gerät mit Android 7.0 oder höher verwenden und versuchen, die App Splitscreen-Modus. Stellen Sie sicher, dass die App akzeptabel ist, wenn sie deren Größe erzwungen wird.
Wenn die App eine feste Ausrichtung deklariert, sollten Sie versuchen, die App mit dem Mehrfenstermodus. Die App muss dabei im Vollbildmodus angezeigt werden. .
API-Ebenen 24 bis 30
Wenn Ihre App auf API-Level 24 bis 30 ausgerichtet ist und der Mehrfenstermodus nicht deaktiviert ist -Support, überprüfen Sie das folgende Verhalten sowohl beim Splitscreen-Modus als auch beim freien Format Modi:
Starten Sie die App im Vollbildmodus und wechseln Sie dann in den Mehrfenstermodus, indem Sie die Schaltfläche Letzte gedrückt halten. Prüfen Sie, ob der Wechsel der App ordnungsgemäß funktioniert.
App direkt im Mehrfenstermodus starten und prüfen, ob die App ordnungsgemäß startet. Du kannst eine App im Mehrfenstermodus starten, indem du die Schaltfläche Letzte gedrückt, drücken dann lange auf die Titelleiste der App und in einen der markierten Bereiche auf dem Bildschirm ziehen.
Passen Sie die Größe Ihrer App im Splitscreen-Modus an, indem Sie den Bildschirmteiler ziehen. Bestätigen dass die Größe der App ohne Absturz angepasst wird und dass die erforderlichen UI-Elemente sichtbar sind.
Wenn Sie Mindestabmessungen für Ihre App angegeben haben, versuchen Sie, die Größe der App so weit, dass das Fenster kleiner ist als diese Abmessungen. Prüfen Sie, ob Sie können die Größe der App nicht kleiner als das angegebene Minimum ändern Dimensionen.
Prüfen Sie bei allen Tests, ob die Leistung Ihrer App akzeptabel ist. Für Achten Sie beispielsweise darauf, dass die Aktualisierung der UI nach dem App-Größe angepasst wird.
API-Level 31 oder höher
Wenn Ihre App auf API-Level 31 oder höher und die Mindestbreite der Hauptaktivität ausgerichtet ist und die minimale Höhe kleiner oder gleich den jeweiligen Abmessungen der verfügbaren Anzeigebereichs, überprüfen Sie alle für API-Ebenen 24 aufgeführten Verhaltensweisen bis 30.
Checkliste testen
So können Sie die Leistung Ihrer App im Mehrfenstermodus prüfen Geschäftsabläufe. Sie sollten diese Vorgänge sowohl im Splitscreen- als auch im freien Format ausprobieren. sofern nicht anders angegeben.
Mehrfenstermodus aktivieren und verlassen
Wechseln Sie von Ihrer App zu einer anderen App und prüfen Sie, ob sich die App verhält während es sichtbar, aber nicht aktiv ist. Wenn Ihre App zum Beispiel das Video wiedergegeben wird, vergewissern Sie sich, dass die Wiedergabe auch dann fortgesetzt wird, wenn der Nutzer mit einer anderen App interagieren.
Verschieben Sie im geteilten Bildschirmmodus den Bildschirmteiler, damit Ihre App größer und kleiner werden. Führen Sie diese Operationen sowohl nebeneinander als auch oben aus die anderen Konfigurationen. Vergewissern Sie sich, dass die App nicht abstürzt. ist sichtbar und die Größenanpassung dauert nicht zu lange.
Führen Sie schnell nacheinander mehrere Größenänderungsvorgänge durch. Prüfen, ob Ihre App nicht abstürzen oder Speicherlecks verursacht. Der Memory Profiler von Android Studio bietet Informationen zur Arbeitsspeichernutzung Ihrer App (siehe Arbeitsspeicher der App prüfen) Nutzung mit Memory Profiler.
Ihre App in verschiedenen Fensterkonfigurationen normal verwenden und um zu prüfen, ob die App ordnungsgemäß funktioniert. Stellen Sie sicher, dass der Text lesbar ist und UI-Elemente sind nicht zu klein, um mit ihnen zu interagieren.
Unterstützung für Mehrfenstermodus deaktiviert
Auf API-Ebenen 24 bis 30, wenn Sie die Unterstützung des Mehrfenstermodus durch folgende Einstellung deaktiviert haben:
android:resizeableActivity="false"
, du solltest deine App auf einem Gerät starten
Android 7.0 bis 11 ausführen und versuchen, die App im Splitscreen-Modus
Freiform-Modi. Achten Sie darauf, dass die App dabei im Vollbildmodus bleibt.
.
Weitere Informationen
Weitere Informationen zur Unterstützung des Mehrfenstermodus unter Android finden Sie hier:
- 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 * Umgang mit Konfigurationsänderungen