Mit der Bild-in-Bild-Funktion (PIP) für Android-Handheld-Geräte können Nutzer eine App mit einer laufenden Aktivität in ein kleines Fenster verkleinern. PIP ist besonders nützlich für Video-Apps, da die Wiedergabe von Inhalten fortgesetzt wird, während der Nutzer andere Aktionen ausführen kann. Nutzer können die Position dieses Fensters über die SystemUI ändern und mit der Anwendung, die sich derzeit im Bild-in-Bild-Modus befindet, über (bis zu drei) von der App bereitgestellte Aktionen interagieren.
Für PIP ist eine explizite Aktivierung durch Anwendungen erforderlich, die es unterstützen. Es funktioniert auf Aktivitätsbasis. Eine einzelne Anwendung kann mehrere Aktivitäten haben, von denen sich nur eine im PIP-Modus befindet. Aktivitäten fordern den Bild-in-Bild-Modus an, indem sie enterPictureInPictureMode() aufrufen, und erhalten Aktivitäts-Callbacks in Form von onPictureInPictureModeChanged().
Mit der Methode setPictureInPictureParams() können Aktivitäten ihr Seitenverhältnis im PIP-Modus und benutzerdefinierte Aktionen steuern, mit denen Nutzer mit der Aktivität interagieren können, ohne sie maximieren zu müssen. Im PIP-Modus befindet sich die Aktivität in einem pausierten, aber gerenderten Zustand und erhält keine direkten Touch-Eingaben oder Fensterfokus.
Es kann jeweils nur eine Aufgabe im PIP-Modus sein.
Weitere Informationen finden Sie in der Android-Entwickler Dokumentation zu Bild-in-Bild.
Geräteanforderungen
Wenn Sie PIP unterstützen möchten, aktivieren Sie die Systemfunktion PackageManager#FEATURE_PICTURE_IN_PICTURE in /android/frameworks/base/core/java/android/content/pm/PackageManager.java.
Geräte, die PIP unterstützen, müssen einen Bildschirm haben, der an der kleinsten Breite größer als 220 dp ist. Ähnlich wie beim Splitscreen-Mehrfenstermodus können mit BiB mehrere Aktivitäten gleichzeitig auf dem Bildschirm ausgeführt werden. Daher sollten Geräte über genügend CPU und RAM verfügen, um diesen Anwendungsfall zu unterstützen.
Implementierung
Der Großteil der Verwaltung des Aktivitätslebenszyklus erfolgt im System zwischen
ActivityManager und WindowManager.
Die Referenzimplementierung der UI befindet sich im SystemUI
Paket.
Änderungen am System sollten sich nicht auf das intrinsische Verhalten auswirken, wie in den Tests der Compatibility Test Suite (CTS) definiert. Die Systemlogik für PIP dreht sich hauptsächlich um die Verwaltung von Aufgaben und Aktivitäten im „angehefteten“ Stack. Hier eine kurze Übersicht über die Klassen:
ActivityRecord: verfolgt den Bild-in-Bild-Status jeder Aktivität. Wenn Sie verhindern möchten, dass Nutzer unter bestimmten Umständen in den PIP-Modus wechseln, z. B. vom Sperrbildschirm oder während der VR-Nutzung, fügen Sie Fälle zucheckEnterPictureInPictureState()hinzu.ActivityManagerService: die primäre Schnittstelle von der Aktivität, um den PIP-Modus anzufordern, und die Schnittstelle für Aufrufe vonWindowManagerundSystemUI, um den PIP-Aktivitätsstatus zu ändern.ActivityStackSupervisor: wird vonActivityManagerServiceaufgerufen, um Aufgaben in den angehefteten Stack zu verschieben oder daraus zu entfernen, undWindowManagernach Bedarf zu aktualisieren.PinnedStackWindowController: dieWindowManagerSchnittstelle vonActivityManager.PinnedStackController: meldet Änderungen im System anSystemUI, z. B. IME ein-/ausgeblendet, Seitenverhältnis geändert oder Aktionen geändert.BoundsAnimationController: animiert die PIP Aktivitätsfenster so, dass beim Ändern der Größe keine Konfigurationsänderung ausgelöst wird.PipSnapAlgorithm: eine gemeinsame Klasse, die sowohl im System als auch in der SystemUI verwendet wird und das Einrastverhalten des PIP-Fensters in der Nähe der Bildschirmränder steuert.
Die Referenz SystemUI
bietet eine vollständige Implementierung von PIP, die die Präsentation benutzerdefinierter
Aktionen für Nutzer und allgemeine Manipulationen wie Maximieren und Schließen unterstützt.
Gerätehersteller können auf diesen Änderungen aufbauen, solange sie das intrinsische Verhalten, wie im CDD definiert, nicht beeinträchtigen. Hier eine kurze Übersicht über die Klassen:
PipManager: dieSystemUI-Komponente, die mitSystemUIgestartet wird.PipTouchHandler: der Touch-Handler, der die Gesten steuert, mit denen das PIP-Fenster manipuliert wird. Er wird nur verwendet, wenn der Eingabe empfänger für das PIP-Fenster aktiv ist (sieheInputConsumerController). Hier können neue Gesten hinzugefügt werden.PipMotionHelper: eine Hilfsklasse, die die PIP-Position und die zulässige Region auf dem Bildschirm verfolgt. RuftActivityManagerServiceauf, um die Position und Größe des PIP-Fensters zu aktualisieren oder zu animieren.PipMenuActivityController: startet eine Aktivität , die die Aktionen anzeigt, die von der Aktivität bereitgestellt werden, die sich derzeit im PIP-Modus befindet. Diese Aktivität ist eine Aufgaben-Overlay-Aktivität und entfernt den überlagernden Eingabeempfänger, damit sie interaktiv sein kann.PipMenuActivity: die Implementierung für die Menüaktivität.PipMediaController: der Listener, derSystemUIaktualisiert, wenn sich die Mediensitzung so ändert, dass sich dies auf die Standardaktionen im PIP-Fenster auswirken könnte.PipNotificationController: der Controller, der dafür sorgt, dass eine Benachrichtigung aktiv ist, während ein Nutzer die PIP-Funktion verwendet.PipDismissViewController: das Overlay, das Nutzern angezeigt wird, wenn sie mit dem PIP-Fenster interagieren, um darauf hinzuweisen, dass es geschlossen werden kann.
Standardplatzierung
Es gibt verschiedene Systemressourcen, die die Standardplatzierung des PIP-Fensters steuern:
config_defaultPictureInPictureGravity: die Gravity Ganzzahl, die die Ecke steuert, in der das PIP-Fenster platziert wird, z. B.BOTTOM|RIGHT.config_defaultPictureInPictureScreenEdgeInsets: die Offsets von den Seiten des Bildschirms, um das PIP-Fenster zu platzieren.config_pictureInPictureDefaultSizePercentundconfig_pictureInPictureDefaultAspectRatio: Die Kombination aus dem Prozentsatz der Bildschirmbreite und dem Seitenverhältnis steuert die Größe des PIP-Fensters. Die berechnete Standardgröße des PIP-Fensters darf nicht kleiner als@dimen/default_minimal_size_pip_resizable_tasksein, wie in CTS und CDD definiert.config_pictureInPictureSnapMode: das Einrastverhalten , wie inPipSnapAlgorithmdefiniert.
Geräteimplementierungen dürfen die im CDD und CTS definierten minimalen und maximalen Seitenverhältnisse nicht ändern.
Berechtigungen
Mit der paketbezogenen "Anwendungsoperation"
(OP_PICTURE_IN_PICTURE) in AppOpsManager
(main/core/java/android/app/AppOpsManager.java) können
Nutzer PIP auf Anwendungsebene über die Systemeinstellungen steuern.
Geräteimplementierungen müssen diese Prüfung berücksichtigen, wenn eine Aktivität den Bild-in-Bild-Modus anfordert.
Test
Führen Sie zum Testen von PIP-Implementierungen alle Tests im Zusammenhang mit Bild-in-Bild aus, die in
den CTS-Tests auf Hostseite unter /cts/hostsidetests/services/activitymanager zu finden sind,
insbesondere in ActivityManagerPinnedStackTests.java.