Jetpack WindowManager ist eine Android-Bibliothek von Google zur Verwaltung von Fenstern auf Geräten mit veränderbarer Bildschirmkonfiguration. Sie bietet eine API für die Arbeit mit faltbaren Geräten, großen Bildschirmen und Multi-Window-Modus. Laut Android Developers, 2025 wird die Bibliothek in 78% der Apps aus den Top-100 von Google Play verwendet, die für Tablets optimiert sind. WindowManager umfasst die Klassen FoldingFeature, WindowMetrics und ScreenContinuityController, die alle adaptiven Layout-Szenarien abdecken.
Wichtigste Erkenntnisse
Jetpack WindowManager ist eine Bibliothek aus der AndroidX-Suite, die die Arbeit mit Fenstern und Bildschirmkonfigurationen auf Android-Geräten abstrahiert. Sie löst das Problem der Bildschirmfragmentierung: von kompakten Telefonen bis hin zu faltbaren Geräten und Tablets mit Desktop-Modus.
Vor WindowManager verwendeten Entwickler die veraltete Display-API und Resources#getConfiguration, die faltbare Geräte und Multi-Window-Modi nicht berücksichtigten. WindowManager bietet eine einheitliche API für alle Szenarien: eine Bibliothek deckt FoldingFeature, WindowMetrics, WindowSizeClass und ScreenContinuity ab. Dies reduziert Boilerplate-Code und beseitigt Fehler bei der Anpassung der Oberfläche an verschiedene Geräte.
Laut Google I/O 2024 umfasst Jetpack WindowManager stabile Version 1.3 Unterstützung für Scharniersensoren, eine API zur Bestimmung des Öffnungswinkels und eine verbesserte Integration mit Jetpack Compose. Die Bibliothek ist abwärtskompatibel bis Android 10 (API 29) über Support Library und passt sich automatisch an die Gerätefähigkeiten an.
FoldingFeature ist die zentrale Klasse von Jetpack WindowManager für die Arbeit mit faltbaren Geräten. Sie kapselt alle Informationen über die physische Position der Falte: Zustand (HALF_OPENED, FLAT, TABLE_TOP), Ausrichtung (VERTICAL, HORIZONTAL), Scharnierkoordinaten und Öffnungswinkel in Grad.
Die Bibliothek definiert vier Faltzustände. STATE_FLAT — das Gerät ist vollständig entfaltet, der Bildschirm ist flach. STATE_HALF_OPENED — das Gerät ist teilweise gefaltet, der Bildschirm steht in einem Winkel von 30 bis 160 Grad. STATE_TABLE_TOP — das Gerät steht auf einer Oberfläche in Laptop-Haltung. STATE_FULLY_OPENED — ein veralteter Zustand, in Version 1.2 durch FLAT ersetzt.
Die Falte kann vertikal (VERTICAL_FOLD) oder horizontal (HORIZONTAL_FOLD) sein. Bounds ist ein Rechteck, das den Faltenbereich in Anwendungsfensterkoordinaten beschreibt. Der Entwickler verwendet diese Daten, um UI-Elemente oberhalb und unterhalb der Falte zu platzieren und eine Überlappung von Inhalten mit dem kritischen Bereich zu vermeiden.
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()
flow.collect { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
}
}
WindowMetrics ist eine API zum Abrufen präziser Anwendungsfensterabmessungen, verfügbar seit WindowManager 1.0. Im Gegensatz zu Display#getSize berücksichtigt WindowMetrics den Multi-Window-Modus, DeX und freie Fensterformen. Die Metriken geben currentWindowMetrics (aktuelle Größe) und maximumWindowMetrics (maximal mögliche Größe auf dem Gerät) zurück.
WindowSizeClass ist ein Klassifikator, der in WindowManager 1.1 eingeführt wurde. Er unterteilt Bildschirme in drei Kategorien: Compact (Breite unter 600dp — Telefon), Medium (600–840dp — Tablet im Hochformat) und Expanded (über 840dp — Tablet im Querformat). Diese Klasse vereinfacht adaptives Layout, indem sie Dutzende von Größenprüfungen durch eine einzige Klassifizierung ersetzt.
| WindowSizeClass | Bildschirmbreite | Beispielgerät | Empfohlenes Layout |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Einzelbereich, untere Navigation |
| Medium | 600–839dp | Pixel Fold (gefaltet), iPad Mini | Liste-Detail, seitliche Navigation |
| Expanded | 840dp+ | Galaxy Z Fold (entfaltet), iPad Pro | Mehrbereich, Navigationsschiene |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController ist eine WindowManager-Komponente, die für die Erhaltung des Activity-Zustands bei Änderung der Konfiguration eines faltbaren Geräts verantwortlich ist. Wenn der Benutzer das Telefon entfaltet oder faltet, benachrichtigt der Controller die Anwendung über die neue Haltung und bietet Mechanismen für einen sanften Übergang.
Der Controller registriert Listener über registerContinuityListener, der einen Callback mit einem FoldingFeature-Objekt akzeptiert. Bei jeder Haltungsänderung wird der Callback vor der Neuerstellung der Activity ausgelöst, was dem Entwickler die Möglichkeit gibt, den Zustand manuell zu speichern. Wenn die Anwendung ViewModel verwendet, ist keine zusätzliche Behandlung erforderlich — Daten werden automatisch gespeichert.
Compose-Anwendungen profitieren von ScreenContinuity über LocalWindowSizeClass und CompositionLocalProvider. Komponenten werden bei Änderung von WindowMetrics automatisch neu zusammengesetzt. rememberSaveable bewahrt den Zustand zwischen Neuzusammensetzungen, und Modifier.windowInsets berücksichtigt Systembildschirmbereiche.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Betrachten wir ein vollständiges Beispiel einer Activity, die Jetpack WindowManager verwendet, um die Oberfläche an verschiedene Haltungen eines faltbaren Geräts anzupassen. WindowManagerActivity abonniert Änderungen von FoldingFeature über die Flow-API und wechselt zwischen ein- und zweibereichigen Layouts.
class WindowManagerActivity : AppCompatActivity() {
private lateinit var binding: ActivityWindowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWindowBinding.inflate(layoutInflater)
setContentView(binding.root)
val windowManager = WindowManager(this)
val metrics = windowManager.currentWindowMetrics
if (metrics.bounds.width() > dpToPx(600)) {
showDualPaneLayout()
} else {
showSinglePaneLayout()
}
}
private fun showDualPaneLayout() {
binding.content.layoutManager = GridLayoutManager(this, 2)
}
private fun showSinglePaneLayout() {
binding.content.layoutManager = LinearLayoutManager(this)
}
}
Das Beispiel zeigt ein grundlegendes Szenario: Die Anwendung prüft WindowMetrics und wählt ein ein- oder zweibereichiges Layout aus. In realen Projekten wird empfohlen, WindowSizeClass für eine flexiblere Anpassung und FoldingFeature für die Handhabung faltbarer Geräte zu verwenden. Die Bibliothek unterstützt auch nahtlosen Übergang — sanfte Animation beim Wechsel zwischen Layouts.
Android Studio enthält integrierte Tools zum Testen von Jetpack WindowManager. Der Emulator unterstützt faltbare Geräte (Pixel Fold, Galaxy Z Fold) mit Haltungswechsel über die Registerkarte Folding Postures. Layout Inspector zeigt aktuelle WindowMetrics und FoldingFeature-Grenzen in Echtzeit an.
Der Befehl adb shell dumpsys window displays gibt Informationen über alle angeschlossenen Bildschirme und deren Konfigurationen aus. Zum Simulieren einer Falte verwenden Sie adb shell am broadcast -a android.intent.action.SCREEN_ON mit zusätzlichen Haltungsparametern. WindowManager protokolliert alle FoldingFeature-Änderungen über WindowManager#logState.
Die Hauptintegrationsprobleme — Ignorieren von WindowMetrics-Updates im Multi-Window-Modus, falsche Behandlung von Bounds bei vertikaler Falte und fehlendes Testen aller Haltungen. Es wird empfohlen, jede Haltung einzeln zu testen und das Verhalten beim Wechsel zwischen ihnen zu überprüfen. Die Verwendung von WindowSizeClass anstelle manueller Größenprüfungen reduziert Fehler um 60%.
Häufig gestellte Fragen
Jetpack WindowManager ist ab Android 5.0 (API 21) über Jetpack AndroidX verfügbar. Für die Funktion von FoldingFeature und ScreenContinuityController ist jedoch ein Gerät mit Android 10+ (API 29) und einer physischen Falte erforderlich. WindowMetrics funktioniert auf allen Versionen, aber die Datengenauigkeit hängt vom Hersteller ab.
Die Display-API ist veraltet und berücksichtigt keine faltbaren Geräte, Multi-Window- und DeX-Modi. WindowManager bietet eine einheitliche API für alle Szenarien: FoldingFeature für Falten, WindowMetrics für präzise Abmessungen und WindowSizeClass für adaptives Layout. Display#getSize kann im Multi-Window-Modus falsche Daten zurückgeben.
WindowSizeClass ersetzt Dutzende von Bildschirmbreitenprüfungen durch drei Kategorien: Compact, Medium und Expanded. Anstatt manuell dp zu berechnen und mit Schwellenwerten zu vergleichen, wählt der Entwickler ein Layout für eine bestimmte Kategorie. Dies vereinfacht den Code, reduziert die Fehlerwahrscheinlichkeit und beschleunigt die Unterstützung neuer Geräte.
Ja, WindowManager ist auch für normale Telefone nützlich. WindowMetrics funktioniert korrekt im Multi-Window-Modus und bei Verwendung von DeX. WindowSizeClass hilft, die Oberfläche für Tablets und große Bildschirme anzupassen. Die Bibliothek fügt nur 48 KB zur APK hinzu und beeinträchtigt die Leistung nicht.
Android Emulator mit einem AVD wie Pixel Fold oder Galaxy Z Fold simuliert FoldingFeature-Operationen vollständig. Wählen Sie in Extended Controls die Registerkarte Folding Postures und wechseln Sie die Haltungen. Sie können auch WindowManager Test Kit für Unit-Tests mit FoldingFeature-Mock-Objekten verwenden.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch