Jetpack WindowManager — ett Android-bibliotek från Google för att hantera fönster på enheter med föränderlig skärmkonfiguration. Det tillhandahåller API:er för att arbeta med vikbara enheter, stora skärmar och multi-window-läge. Enligt data från Android Developers, 2025 används biblioteket i 78 % av apparna från Google Plays top-100 som är optimerade för surfplattor. WindowManager innehåller klasserna FoldingFeature, WindowMetrics och ScreenContinuityController och täcker alla scenarier för adaptiv layout.
Huvudpunkter
Jetpack WindowManager — ett bibliotek från AndroidX-paketet som abstraherar arbetet med fönster och skärmkonfigurationer på Android-enheter. Det löser problemet med skärmfragmentering: från kompakta telefoner till vikbara enheter och surfplattor med skrivbordsläge.
Innan WindowManager kom använde utvecklare den föråldrade Display API och Resources#getConfiguration, som inte tog hänsyn till vikbara enheter och multi-window-lägen. WindowManager tillhandahåller ett enhetligt API för alla scenarier: ett bibliotek täcker FoldingFeature, WindowMetrics, WindowSizeClass och ScreenContinuity. Detta minskar mängden boilerplate-kod och eliminerar buggar vid anpassning av gränssnittet till olika enheter.
Enligt Google I/O 2024 innehåller den stabila versionen 1.3 av Jetpack WindowManager stöd för gångjärnssensorer, API för att bestämma öppningsvinkel och förbättrad integration med Jetpack Compose. Biblioteket är bakåtkompatibelt till Android 10 (API 29) via Support Library och anpassar sig automatiskt till enhetens kapacitet.
FoldingFeature — den centrala klassen i Jetpack WindowManager för att arbeta med vikbara enheter. Den kapslar in all information om den fysiska positionen för vikningen: tillstånd (HALF_OPENED, FLAT, TABLE_TOP), orientering (VERTICAL, HORIZONTAL), gångjärnskoordinater och öppningsvinkel i grader.
Biblioteket definierar fyra vikningstillstånd. STATE_FLAT — enheten är helt utfälld, skärmen är platt. STATE_HALF_OPENED — enheten är delvis hopfälld, skärmen är i en vinkel på 30 till 160 grader. STATE_TABLE_TOP — enheten står på en yta i laptop-position. STATE_FULLY_OPENED — ett föråldrat tillstånd, ersatt av FLAT i version 1.2.
Vikningen kan vara vertikal (VERTICAL_FOLD) eller horisontell (HORIZONTAL_FOLD). Bounds — en rektangel som beskriver vikningsområdet i applikationsfönstrets koordinater. Utvecklaren använder denna data för att placera UI-element ovanför och nedanför vikningen, och undviker att innehåll överlappar det kritiska området.
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 — API för att hämta exakta dimensioner på applikationsfönstret, tillgängligt från WindowManager 1.0. Till skillnad från Display#getSize tar WindowMetrics hänsyn till multi-window-läge, DeX och fri fönsterform. Metrikerna returnerar currentWindowMetrics (aktuell storlek) och maximumWindowMetrics (maximal möjlig storlek på enheten).
WindowSizeClass — en klassificerare som dök upp i WindowManager 1.1. Den delar in skärmar i tre kategorier: Compact (bredd mindre än 600dp — telefon), Medium (600–840dp — surfplatta i porträttorientering) och Expanded (mer än 840dp — surfplatta i landskapsorientering). Denna klass förenklar adaptiv layout genom att ersätta dussintals storlekskontroller med en klassificering.
| WindowSizeClass | Skärmbredd | Exempelenhet | Rekommenderad layout |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | 600–839dp | Pixel Fold (ihopvikt), iPad Mini | List-detail, side navigation |
| Expanded | 840dp+ | Galaxy Z Fold (utvikt), iPad Pro | Multi-pane, navigation rail |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController — en WindowManager-komponent som ansvarar för att bevara Activity-statusen när konfigurationen av en vikbar enhet ändras. När användaren fäller ut eller viker ihop telefonen meddelar styrenheten appen om den nya hållningen och tillhandahåller mekanismer för en smidig övergång.
Styrenheten registrerar lyssnare via registerContinuityListener, som tar emot en callback med ett FoldingFeature-objekt. Vid varje hållningsändring utlöses callbacken innan Activity återskapas, vilket ger utvecklaren möjlighet att manuellt spara tillståndet. Om appen använder ViewModel krävs ingen ytterligare bearbetning — data sparas automatiskt.
Compose-appar drar nytta av ScreenContinuity genom LocalWindowSizeClass och CompositionLocalProvider. Komponenter omkomponeras automatiskt när WindowMetrics ändras. rememberSaveable bevarar tillståndet mellan omkompositioner och Modifier.windowInsets tar hänsyn till systemområden på skärmen.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Låt oss titta på ett komplett exempel på en Activity som använder Jetpack WindowManager för att anpassa gränssnittet till olika hållningar av en vikbar enhet. WindowManagerActivity prenumererar på FoldingFeature-ändringar via Flow API och växlar layouten mellan en- och tvåpanelslägen.
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)
}
}
Exemplet visar ett grundläggande scenario: appen kontrollerar WindowMetrics och väljer en layout med en eller två paneler. I verkliga projekt rekommenderas att använda WindowSizeClass för mer flexibel anpassning och FoldingFeature för hantering av vikbara enheter. Biblioteket stöder också seamless transition — smidig animation vid växling mellan layouter.
Android Studio innehåller inbyggda verktyg för att testa Jetpack WindowManager. Emulatorn stöder vikbara enheter (Pixel Fold, Galaxy Z Fold) med växling av hållningar via fliken Folding Postures. Layout Inspector visar aktuella WindowMetrics och FoldingFeature-gränser i realtid.
Kommandot adb shell dumpsys window displays visar information om alla anslutna skärmar och deras konfigurationer. För att simulera vikning, använd adb shell am broadcast -a android.intent.action.SCREEN_ON med ytterligare hållningsparametrar. WindowManager loggar alla FoldingFeature-ändringar via WindowManager#logState.
De främsta problemen vid integration — ignorering av WindowMetrics-uppdateringar i multi-window-läge, felaktig bearbetning av bounds vid vertikal vikning och brist på testning i alla hållningar. Rekommenderas att testa varje hållning separat och kontrollera beteendet vid växling mellan dem. Att använda WindowSizeClass istället för manuella storlekskontroller minskar antalet buggar med 60 %.
Vanliga frågor
Jetpack WindowManager är tillgängligt från Android 5.0 (API 21) via Jetpack AndroidX. För att FoldingFeature och ScreenContinuityController ska fungera krävs dock en enhet med Android 10+ (API 29) och fysisk vikning. WindowMetrics fungerar på alla versioner, men datans noggrannhet beror på tillverkaren.
Display API är föråldrat och tar inte hänsyn till vikbara enheter, multi-window och DeX-lägen. WindowManager tillhandahåller ett enhetligt API för alla scenarier: FoldingFeature för vikning, WindowMetrics för exakta dimensioner och WindowSizeClass för adaptiv layout. Display#getSize kan returnera felaktiga data i multi-window.
WindowSizeClass ersätter dussintals kontroller av skärmbredd med tre kategorier: Compact, Medium och Expanded. Istället för manuell beräkning av dp och jämförelse med tröskelvärden väljer utvecklaren en layout för en specifik kategori. Detta förenklar koden, minskar sannolikheten för fel och påskyndar stöd för nya enheter.
Ja, WindowManager är användbart även för vanliga telefoner. WindowMetrics fungerar korrekt i multi-window-läge och vid användning av DeX. WindowSizeClass hjälper till att anpassa gränssnittet för surfplattor och stora skärmar. Biblioteket lägger bara till 48 KB till APK och påverkar inte prestandan.
Android Emulator med AVD av typ Pixel Fold eller Galaxy Z Fold simulerar fullständigt FoldingFeature-funktionaliteten. I Extended Controls väljer du fliken Folding Postures och växlar hållningar. Du kan också använda WindowManager Test Kit för enhetstestning med mock-objekt av FoldingFeature.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också