Screen Continuity — en Android-mekanism som säkerställer sömlös övergång av applikationen mellan vikt och utvikt tillstånd av en vikbar enhet. Vid utfällning ändrar skärmen fysiska dimensioner och systemet startar om Activity med nya konfigurationer. Enligt Google Developer, 2025 förbättrar korrekt hantering av kontinuitet användarupplevelsen med 40% och minskar antalet klagomål på återställning av tillstånd. ScreenContinuity API är en del av Jetpack WindowManager från version 1.1 och gör det möjligt för utvecklaren att hantera livscykeln vid ändring av enhetens pos.
Huvudpunkter
Screen Continuity är en Android-mekanism som bevarar Activity-tillståndet vid ändring av fysisk skärmkonfiguration på vikbara enheter. När användaren fäller ut eller viker ihop telefonen kan systemet starta om Activity med nya fönsterdimensioner. Kontinuitet förhindrar förlust av inmatade data, scrollposition och aktuell skärm.
Till skillnad från vanlig skärmrotation, där Android helt enkelt återskapar Activity med ny orientering, introducerar vikbara enheter helt nya scenarier. Pos HALF_OPENED gör att applikationen kan fungera på en halv skärm, och FLAT — i fullt utfälldt tablet-läge. Utan stöd för Screen Continuity återställer varje posändring gränssnittet till ursprungligt tillstånd.
Enligt Google I/O 2024 har över 62% av användare av vikbara enheter stött på applikationer som inte korrekt hanterar växling mellan tillstånd. Screen Continuity löser detta problem på API-nivå och ger utvecklaren färdiga verktyg för att spara och återställa UI.
Jetpack WindowManager definierar tre grundlägganden poser för en vikbar enhet genom klassen FoldingFeature. Varje pos motsvarar en viss fysisk position av gångjärnet och kräver särskild hantering av gränssnittet.
Enheten befinner sig i en vinkel på 30 till 160 grader. Skärmen är uppdelad i två logiska områden. Applikationen kan visa innehåll på den övre halvan och kontroller på den nedre halvan. Tabletop-läge för videosamtal och mediaspelare använder just denna pos.
Enheten är öppen 180 grader och bildar en enda stor skärm. Applikationen går över till tablet-läge med förstorad arbetsyta. I denna pos rekommenderas att visa en flerpanelslayout med navigeringsfält och detaljerat innehåll sida vid sida.
Enheten står på en yta i en vinkel på cirka 120 grader. Den nedre halvan av skärmen fungerar som touchpanel eller tangentbord. Touchpad-läge i denna pos gör det möjligt att emulera en styrplatta på den nedre delen av skärmen.
Android hanterar konfigurationsändring av en vikbar enhet genom mekanismen configuration changes. När användaren fäller ut telefonen registrerar systemet ändringen av fönsterstorlek och startar standardcykeln för återskapande av Activity. Screen Continuity fångar upp denna process och sparar nyckeldata.
Huvudmetoden för att spara tillstånd är onRetainNonConfigurationInstance, som anropas innan Activity förstörs. Utvecklaren sparar i den datamodell, listposition och aktuell navigeringsskärm. Efter återskapande får Activity dessa data via getLastNonConfigurationInstance och återställer UI exakt till vikningsögonblicket.
För Fragments implementeras mekanismen via setRetainInstance(true), som förhindrar förstörelse av fragment vid konfigurationsändring. I Jetpack Compose används rememberSaveable, som automatiskt sparar tillstånd vid ändring av Window Metrics.
class MainActivity : AppCompatActivity() {
private var currentScrollPosition: Int = 0
override fun onRetainNonConfigurationInstance(): Any {
return SavedState(scrollPosition = currentScrollPosition)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val saved = lastNonConfigurationInstance as? SavedState
saved?.let { currentScrollPosition = it.scrollPosition }
}
}
Jetpack WindowManager version 1.1+ innehåller klassen ScreenContinuityController som tillhandahåller färdiga mekanismer för hantering av skärmkontinuitet. API:et hanterar automatiskt posändring och meddelar applikationen via callback-gränssnitt.
Central klass som registrerar lyssnare för posändring. registerContinuityListener accepterar en callback som utlöses vid varje övergång mellan tillstånd hos den vikbara enheten. Kontrollern ger också information om aktuell pos via metoden getCurrentFoldingFeature.
Hjälpklass för att omvandla FoldingFeature-data till tillstånd som är förståeliga för applikationen. FoldingFeatureAdapter normaliserar gångjärnets koordinater och avgör om aktuell pos är HALF_OPENED, FLAT eller TABLE_TOP. Detta befriar utvecklaren från manuell beräkning av vinklar och tröskelvärden.
För Compose-applikationer tillhandahåller WindowManager WindowSizeClass och modifierare som tar hänsyn till vikning. Komponenten BoxWithConstraints anpassar sig till ändringar av skärmdimensioner i realtid utan att återskapa Activity. Compose utlöser automatiskt recomposition vid ändring av WindowMetrics.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Låt oss titta på ett komplett exempel på Activity med stöd för Screen Continuity. MainActivity hanterar tre scenarier: vikning, utfällning och halvöppet tillstånd. Data sparas via onRetainNonConfigurationInstance och återställs vid återskapande.
class ContinuityActivity : AppCompatActivity() {
private lateinit var binding: ActivityContinuityBinding
private var itemList = mutableListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityContinuityBinding.inflate(layoutInflater)
setContentView(binding.root)
val savedState = lastNonConfigurationInstance as? ContinuityState
if (savedState != null) {
itemList.addAll(savedState.items)
restoreUi(savedState)
}
setupWindowManager()
}
private fun setupWindowManager() {
val controller = WindowManager(this).screenContinuityController
controller.registerContinuityListener { feature ->
updateLayoutForFeature(feature)
}
}
private fun updateLayoutForFeature(feature: FoldingFeature) {
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
}
}
override fun onRetainNonConfigurationInstance(): Any {
return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
}
}
data class ContinuityState(
val items: List<String>,
val scrollPosition: Int
)
Nyckelelementet är klassen ContinuityState, som lagrar listan över element och scrollposition. Activity sparar den före återskapande och återställer den omedelbart efter anrop av onCreate. WindowManager-kontrollern prenumererar på posändringar och växlar layout mellan lägen.
Android Studio tillhandahåller emulator för vikbar enhet med stöd för alla tre poser. För att testa Screen Continuity räcker det att skapa en virtuell enhet av typen Pixel Fold eller Samsung Galaxy Z Fold och växla pos via emulatorns kontrollpanel.
Skapa en AVD med kategorin Foldable och välj upplösning för en 7,6-tums skärm. I emulatorns utökade kontroller öppnar du fliken Folding Postures och växlar mellan poser. Varje växling utlöser en configuration change som applikationen bör hantera korrekt.
På en verklig enhet (Galaxy Z Fold 5, Pixel Fold) utförs testning genom fysisk utfällning. Samsung DeX och Multi-Window-lägen aktiverar också kontinuitet. För felsökning använd ADB-kommandot adb shell dumpsys window policy, som visar aktuellt vikningsstatus.
Huvudfelen — förlust av RecyclerView-tillstånd, återställning av text i textfält och stängning av dialogrutor. ViewModel löser dessa problem genom att lagra data i minnet oberoende av Activitys livscykel. Det är också viktigt att annotera Activity i manifestet med parametern android:configChanges om applikationen hanterar ändringar manuellt.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Vanliga frågor
Screen Continuity sparar tillstånd vid fysisk ändring av skärmstorlek, inte bara vid rotation. Vanlig onSaveInstanceState garanterar inte bevarande vid växling av poser på en vikbar enhet, medan ScreenContinuityController hanterar just detta scenario.
Alla vikbara enheter med Android 10+ och Google Play-tjänster. Stöd ingår i Pixel Fold, Galaxy Z Fold-serien, Huawei Mate X, Oppo Find N och OnePlus Open. För funktion krävs Jetpack WindowManager version 1.1 och högre.
Jetpack Compose stöder Screen Continuity genom rememberSaveable och WindowSizeClass. Komposition reagerar automatiskt på ändring av WindowMetrics och rememberSaveable sparar tillstånd mellan recompositioner. Modifieraren onSizeChanged gör det möjligt att spåra storleksändringar i realtid.
Vid utfällning eller vikning av enheten återskapas Activity utan att tillstånd sparas. Användaren förlorar inmatade data, scrollning återställs, öppna dialoger stängs. Detta leder till negativa recensioner och sänkt betyg för applikationen i Google Play.
Android Emulator stöder simulering av vikbara enheter. Skapa en AVD av typen Pixel Fold, öppna Extended Controls och välj fliken Folding Postures. Posväxling utlöser configuration change, vilket möjliggör testning av tillståndssparande utan fysisk enhet.
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å