Screen Continuity: co to je, API skládání a adaptace rozhraní

Autor: IT Sectr Publikováno: 2026-06-09 Doba čtení: 5 min

Screen Continuity — mechanismus Androidu zajišťující bezproblémový přechod aplikace mezi složeným a rozloženým stavem skládacího zařízení. Při rozkládání obrazovka mění fyzické rozměry a systém restartuje Activity s novými konfiguracemi. Podle Google Developer, 2025, správné zpracování kontinuity zlepšuje uživatelský zážitek o 40% a snižuje počet stížností na resetování stavu. API ScreenContinuity je součástí Jetpack WindowManager od verze 1.1 a umožňuje vývojáři spravovat životní cyklus při změně pózy zařízení.

Hlavní body

  • Screen Continuity — technologie pro zachování stavu Activity při změně fyzické konfigurace obrazovky na skládacích Android zařízeních.
  • Jetpack WindowManager poskytuje API pro sledování póz zařízení: HALF_OPENED, FLAT, TABLE_TOP.
  • onRetainNonConfigurationInstance — klíčová metoda pro zachování dat při opětovném vytvoření Activity po složení nebo rozložení.
  • Testování kontinuity se provádí na emulátoru skládacího zařízení přes Android Studio nebo na fyzických zařízeních Galaxy Z Fold.
  • Ignorování kontinuity vede ke ztrátě stavu obrazovky, resetování dat formuláře a zhoršení uživatelského zážitku.

Co je Screen Continuity?

Screen Continuity je mechanismus Androidu, který zachovává stav Activity při změně fyzické konfigurace obrazovky na skládacích zařízeních. Když uživatel rozloží nebo složí telefon, systém může restartovat Activity s novými rozměry okna. Kontinuita zabraňuje ztrátě zadaných dat, pozice posouvání a aktuální obrazovky.

Na rozdíl od běžného otáčení obrazovky, kde Android jednoduše znovu vytvoří Activity s novou orientací, skládací zařízení zavádějí zcela nové scénáře. Póza HALF_OPENED umožňuje aplikaci pracovat na polovině obrazovky a FLAT — v plně rozloženém tabletovém režimu. Bez podpory Screen Continuity každá změna pózy resetuje rozhraní do počátečního stavu.

Podle Google I/O 2024 se více než 62% uživatelů skládacích zařízení setkalo s aplikacemi, které nesprávně zpracovávají přepínání mezi stavy. Screen Continuity řeší tento problém na úrovni API a poskytuje vývojáři hotové nástroje pro ukládání a obnovu UI.

Stavy skládacích zařízení: pózy obrazovky

Jetpack WindowManager definuje tři základní pózy skládacího zařízení prostřednictvím třídy FoldingFeature. Každá póza odpovídá určité fyzické poloze pantu a vyžaduje speciální zpracování rozhraní.

HALF_OPENED — polootevřený stav

Zařízení je pod úhlem 30 až 160 stupňů. Obrazovka je rozdělena na dvě logické oblasti. Aplikace může zobrazovat obsah na horní polovině a ovládací prvky na dolní polovině. Tabletop režim pro videohovory a media přehrávače používá právě tuto pózu.

FLAT — plně rozložený stav

Zařízení je otevřeno na 180 stupňů, tvoří jednu velkou obrazovku. Aplikace přechází do tabletového režimu se zvětšeným pracovním prostorem. V této póze se doporučuje zobrazovat vícepanelové rozložení s navigační lištou a podrobným obsahem vedle sebe.

TABLE_TOP — póza notebooku

Zařízení stojí na povrchu pod úhlem asi 120 stupňů. Dolní polovina obrazovky slouží jako dotykový panel nebo klávesnice. Touchpad režim v této póze umožňuje emulovat trackpad na dolní části obrazovky.

Jak funguje kontinuita obrazovky v Androidu?

Android zpracovává změnu konfigurace skládacího zařízení prostřednictvím mechanismu configuration changes. Když uživatel rozloží telefon, systém zaznamená změnu velikosti okna a spustí standardní cyklus opětovného vytvoření Activity. Screen Continuity tento proces zachycuje a ukládá klíčová data.

Hlavní metoda pro ukládání stavu je onRetainNonConfigurationInstance, která je volána před zničením Activity. Vývojář do ní ukládá datový model, pozici seznamu a aktuální obrazovku navigace. Po opětovném vytvoření Activity obdrží tato data prostřednictvím getLastNonConfigurationInstance a obnoví UI přesně do okamžiku složení.

Pro Fragments je mechanismus implementován prostřednictvím setRetainInstance(true), který zabraňuje zničení fragmentu při změně konfigurace. V Jetpack Compose se používá rememberSaveable, který automaticky ukládá stav při změně Window Metrics.

kotlin
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 }
    }
}

API ScreenContinuity v Jetpack WindowManager

Jetpack WindowManager verze 1.1+ obsahuje třídu ScreenContinuityController, která poskytuje hotové mechanismy pro správu kontinuity obrazovky. API automaticky zpracovává změnu pózy a informuje aplikaci prostřednictvím callback rozhraní.

ScreenContinuityController

Centrální třída, která registruje posluchače změny pózy. registerContinuityListener přijímá callback, který se spouští při každém přechodu mezi stavy skládacího zařízení. Kontrolér také poskytuje informace o aktuální póze prostřednictvím metody getCurrentFoldingFeature.

FoldingFeatureAdapter

Užitková třída pro převod dat FoldingFeature do stavů srozumitelných pro aplikaci. FoldingFeatureAdapter normalizuje souřadnice pantu a určuje, zda je aktuální póza HALF_OPENED, FLAT nebo TABLE_TOP. To zbavuje vývojáře ručního výpočtu úhlů a prahových hodnot.

Integrace s Jetpack Compose

Pro aplikace Compose poskytuje WindowManager WindowSizeClass a modifikátory zohledňující skládání. Komponenta BoxWithConstraints se přizpůsobuje změnám rozměrů obrazovky v reálném čase bez opětovného vytvoření Activity. Compose automaticky spouští rekompozici při změně WindowMetrics.

kotlin
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController

controller.registerContinuityListener { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
        FoldingFeature.State.FLAT -> expandToTablet()
    }
}

Příklad implementace v Kotlin

Podívejme se na úplný příklad Activity s podporou Screen Continuity. MainActivity zpracovává tři scénáře: složení, rozložení a polootevřený stav. Data se ukládají prostřednictvím onRetainNonConfigurationInstance a obnovují se při opětovném vytvoření.

kotlin
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
)

Klíčovým prvkem je třída ContinuityState, která ukládá seznam prvků a pozici posouvání. Activity ji ukládá před opětovným vytvořením a obnovuje ihned po volání onCreate. Kontrolér WindowManager se přihlašuje k odběru změn pózy a přepíná rozložení mezi režimy.

Testování kontinuity na emulátoru a zařízení

Android Studio poskytuje emulátor skládacího zařízení s podporou všech tří póz. Pro testování Screen Continuity stačí vytvořit virtuální zařízení typu Pixel Fold nebo Samsung Galaxy Z Fold a přepínat pózu pomocí ovládacího panelu emulátoru.

Nastavení emulátoru

Vytvořte AVD s kategorií Foldable a zvolte rozlišení 7,6palcové obrazovky. V rozšířených ovládacích prvcích emulátoru otevřete kartu Folding Postures a přepínejte mezi pózami. Každé přepnutí spouští configuration change, kterou by aplikace měla správně zpracovat.

Fyzické zařízení

Na reálném zařízení (Galaxy Z Fold 5, Pixel Fold) se testování provádí fyzickým rozkládáním. Režimy Samsung DeX a Multi-Window také aktivují kontinuitu. Pro ladění použijte příkaz ADB adb shell dumpsys window policy, který zobrazuje aktuální stav složení.

Typické problémy

Hlavní chyby — ztráta stavu RecyclerView, resetování textu v textových polích a zavírání dialogových oken. ViewModel tyto problémy řeší ukládáním dat v paměti nezávisle na životním cyklu Activity. Také je důležité označit Activity v manifestu parametrem android:configChanges, pokud aplikace zpracovává změny ručně.

xml
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

Často kladené otázky

Čím se Screen Continuity liší od běžného ukládání stavu?

Screen Continuity ukládá stav při fyzické změně velikosti obrazovky, nejen při otáčení. Běžný onSaveInstanceState nezaručuje zachování při přepínání póz skládacího zařízení, zatímco ScreenContinuityController zpracovává právě tento scénář.

Která Android zařízení podporují Screen Continuity?

Všechna skládací zařízení s Android 10+ a službami Google Play. Podpora je zahrnuta v Pixel Fold, řadě Galaxy Z Fold, Huawei Mate X, Oppo Find N a OnePlus Open. Pro fungování je vyžadován Jetpack WindowManager verze 1.1 a vyšší.

Jak Screen Continuity pracuje s Jetpack Compose?

Jetpack Compose podporuje Screen Continuity prostřednictvím rememberSaveable a WindowSizeClass. Kompozice automaticky reaguje na změnu WindowMetrics a rememberSaveable ukládá stav mezi rekompozicemi. Modifikátor onSizeChanged umožňuje sledovat změny rozměrů v reálném čase.

Co se stane, když není Screen Continuity implementováno?

Při rozložení nebo složení zařízení je Activity znovu vytvořena bez uložení stavu. Uživatel ztrácí zadaná data, posouvání se resetuje, otevřené dialogy se zavírají. To vede k negativním recenzím a poklesu hodnocení aplikace v Google Play.

Jak otestovat Screen Continuity bez fyzického zařízení?

Android Emulator podporuje simulaci skládacích zařízení. Vytvořte AVD typu Pixel Fold, otevřete Extended Controls a vyberte kartu Folding Postures. Přepínání póz spouští configuration change, umožňující testování ukládání stavu bez fyzického zařízení.

Shrnutí

  • Screen Continuity — mechanismus Androidu pro zachování stavu Activity při změně fyzické konfigurace skládacího zařízení.
  • Jetpack WindowManager poskytuje ScreenContinuityController pro sledování póz HALF_OPENED, FLAT a TABLE_TOP.
  • onRetainNonConfigurationInstance — hlavní metoda pro ukládání dat před opětovným vytvořením Activity při rozkládání.
  • ViewModel a rememberSaveable v Compose řeší problém ztráty stavu bez ruční správy životního cyklu.
  • Emulátor Android Studio umožňuje testovat všechny pózy skládacího zařízení bez fyzického zařízení.
  • Ignorování Screen Continuity vede k resetování uživatelského rozhraní a ztrátě zadaných dat při složení.
  • Doporučuje se přidat podporu kontinuity do všech aplikací určených pro skládací zařízení a tablety.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také