Screen Continuity: шта је то, API склопивости и прилагођавање интерфејса

Аутор: IT Sectr Објављено: 2026-06-09 Време читања: 5 мин

Screen Continuity — механизам Android-а који обезбеђује беспрекорни прелаз апликације између склопљеног и расклопљеног стања склопивог уређаја. При расклапању екран мења физичке димензије, а систем поново покреће Activity са новим конфигурацијама. Према Google Developer, 2025, правилна обрада континуитета побољшава корисничко искуство за 40% и смањује број жалби на ресетовање стања. API ScreenContinuity је део Jetpack WindowManager-а од верзије 1.1 и омогућава програмеру да управља животним циклусом при промени позе уређаја.

Главно

  • Screen Continuity — технологија очувања стања Activity при промени физичке конфигурације екрана на склопивим Android уређајима.
  • Jetpack WindowManager пружа API за праћење поза уређаја: HALF_OPENED, FLAT, TABLE_TOP.
  • onRetainNonConfigurationInstance — кључни метод за очување података при поновном креирању Activity након склапања или расклапања.
  • Тестирање континуитета се врши на емулатору склопивог уређаја кроз Android Studio или на физичким уређајима Galaxy Z Fold.
  • Игнорисање континуитета доводи до губитка стања екрана, ресетовања података форме и погоршања корисничког искуства.

Шта је Screen Continuity?

Screen Continuity је механизам Android-а који чува стање Activity при промени физичке конфигурације екрана на склопивим уређајима. Када корисник расклопи или склопи телефон, систем може поново покренути Activity са новим димензијама прозора. Континуитет спречава губитак унетих података, позиције померања и тренутног екрана.

За разлику од обичне ротације екрана, где Android једноставно поново креира Activity са новом оријентацијом, склопиви уређаји уводе потпуно нове сценарије. Поза HALF_OPENED омогућава апликацији да ради на пола екрана, а FLAT — у потпуно расклопљеном таблет режиму. Без подршке за Screen Continuity свака промена позе ресетује интерфејс на почетно стање.

Према Google I/O 2024, више од 62% корисника склопивих уређаја сусрело се са апликацијама које некоректно обрађују прелаз између стања. Screen Continuity решава овај проблем на нивоу API-ја, пружајући програмеру готове алате за чување и враћање UI-ја.

Стања склопивих уређаја: позе екрана

Jetpack WindowManager дефинише три основне позе склопивог уређаја кроз класу FoldingFeature. Свака поза одговара одређеном физичком положају шарке и захтева посебну обраду интерфејса.

HALF_OPENED — полуотворено стање

Уређај се налази под углом од 30 до 160 степени. Екран је подељен на две логичке области. Апликација може приказивати садржај на горњој половини и контролне елементе на доњој. Tabletop режим за видео позиве и медиа плејере користи управо ову позу.

FLAT — потпуно расклопљено стање

Уређај је отворен на 180 степени, формирајући један велики екран. Апликација прелази у таблет режим са увећаном радном површином. У овој пози се препоручује приказ мулти-панел распореда са навигационом траком и детаљним садржајем један поред другог.

TABLE_TOP — поза лаптопа

Уређај стоји на површини под углом од око 120 степени. Доња половина екрана служи као додирна табла или тастатура. Touchpad режим у овој пози омогућава емулацију трекпада на доњем делу екрана.

Како функционише континуитет екрана у Android-у?

Android обрађује промену конфигурације склопивог уређаја кроз механизам configuration changes. Када корисник расклопи телефон, систем бележи промену величине прозора и покреће стандардни циклус поновног креирања Activity. Screen Continuity пресреће овај процес и чува кључне податке.

Основни метод за чување стања је onRetainNonConfigurationInstance, који се позива пре уништења Activity. Програмер у њему чува модел података, позицију листе и тренутни екран навигације. Након поновног креирања, Activity прима ове податке кроз getLastNonConfigurationInstance и враћа UI тачно до тренутка склапања.

За Fragments механизам је имплементиран кроз setRetainInstance(true), који спречава уништење фрагмента при промени конфигурације. У Jetpack Compose-у се користи rememberSaveable, који аутоматски чува стање при промени 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 у Jetpack WindowManager-у

Jetpack WindowManager верзије 1.1+ укључује класу ScreenContinuityController, која пружа готове механизме за управљање континуитетом екрана. API аутоматски обрађује промену позе и обавештава апликацију кроз callback интерфејсе.

ScreenContinuityController

Централна класа која региструје слушаоце промене позе. registerContinuityListener прима callback који се активира при сваком прелазу између стања склопивог уређаја. Контролер такође пружа информације о тренутној пози кроз метод getCurrentFoldingFeature.

FoldingFeatureAdapter

Утилитарна класа за претварање података FoldingFeature у стања разумљива апликацији. FoldingFeatureAdapter нормализује координате шарке и одређује да ли је тренутна поза HALF_OPENED, FLAT или TABLE_TOP. Ово ослобађа програмера ручног израчунавања углова и граничних вредности.

Интеграција са Jetpack Compose

За Compose апликације WindowManager пружа WindowSizeClass и модификаторе који узимају у обзир склопивост. Компонента BoxWithConstraints прилагођава се променама димензија екрана у реалном времену без поновног креирања Activity. Compose аутоматски покреће рекомпозицију при промени 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()
    }
}

Пример имплементације у Kotlin-у

Размотримо комплетан пример Activity-ја са подршком за Screen Continuity. MainActivity обрађује три сценарија: склапање, расклапање и полуотворено стање. Подаци се чувају кроз onRetainNonConfigurationInstance и враћају при поновном креирању.

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
)

Кључни елемент је класа ContinuityState, која чува листу елемената и позицију померања. Activity је чува пре поновног креирања и враћа одмах након позива onCreate. WindowManager контролер се претплаћује на промене позе и пребацује распоред између режима.

Тестирање континуитета на емулатору и уређају

Android Studio пружа емулатор склопивог уређаја са подршком за све три позе. За тестирање Screen Continuity-ја довољно је креирати виртуелни уређај типа Pixel Fold или Samsung Galaxy Z Fold и пребацивати позу кроз контролну таблу емулатора.

Подешавање емулатора

Креирајте AVD са категоријом Foldable и изаберите резолуцију екрана од 7,6 инча. У проширеним контролама емулатора отворите картицу Folding Postures и пребацујте се између поза. Свако пребацивање покреће configuration change који апликација треба да обради коректно.

Физички уређај

На реалном уређају (Galaxy Z Fold 5, Pixel Fold) тестирање се врши физичким расклапањем. Samsung DeX и Multi-Window режими такође активирају континуитет. За отклањање грешака користите ADB команду adb shell dumpsys window policy, која приказује тренутно стање склопивости.

Типични проблеми

Главне грешке — губитак стања RecyclerView-а, ресетовање текста у текстуалним пољима и затварање дијалошких прозора. ViewModel решава ове проблеме чувањем података у меморији независно од животног циклуса Activity. Такође је важно означити Activity у манифесту параметром android:configChanges ако апликација ручно обрађује промене.

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

Често постављана питања

Чим се Screen Continuity разликује од обичног чувања стања?

Screen Continuity чува стање при физичкој промени величине екрана, а не само при ротацији. Обични onSaveInstanceState не гарантује очување при пребацивању поза склопивог уређаја, док ScreenContinuityController обрађује управо овај сценарио.

Који Android уређаји подржавају Screen Continuity?

Сви склопиви уређаји са Android 10+ и Google Play услугама. Подршка је укључена у Pixel Fold, серију Galaxy Z Fold, Huawei Mate X, Oppo Find N и OnePlus Open. За рад је потребан Jetpack WindowManager верзије 1.1 и више.

Како Screen Continuity ради са Jetpack Compose-ом?

Jetpack Compose подржава Screen Continuity кроз rememberSaveable и WindowSizeClass. Композиција аутоматски реагује на промену WindowMetrics, а rememberSaveable чува стање између рекомпозиција. Модификатор onSizeChanged омогућава праћење промена димензија у реалном времену.

Шта се дешава ако се не имплементира Screen Continuity?

При расклапању или склапању уређаја, Activity се поново креира без чувања стања. Корисник губи унете податке, померање се ресетује, отворени дијалози се затварају. То доводи до негативних рецензија и пада рејтинга апликације у Google Play-у.

Како тестирати Screen Continuity без физичког уређаја?

Android Emulator подржава симулацију склопивих уређаја. Креирајте AVD типа Pixel Fold, отворите Extended Controls и изаберите картицу Folding Postures. Пребацивање поза покреће configuration change, омогућавајући тестирање чувања стања без физичког уређаја.

Закључак

  • Screen Continuity — Android механизам за очување стања Activity при промени физичке конфигурације склопивог уређаја.
  • Jetpack WindowManager пружа ScreenContinuityController за праћење поза HALF_OPENED, FLAT и TABLE_TOP.
  • onRetainNonConfigurationInstance — главни метод за чување података пре поновног креирања Activity при расклапању.
  • ViewModel и rememberSaveable у Compose-у решавају проблем губитка стања без ручног управљања животним циклусом.
  • Емулатор Android Studio-а омогућава тестирање свих поза склопивог уређаја без физичког уређаја.
  • Игнорисање Screen Continuity-ја доводи до ресетовања корисничког интерфејса и губитка унетих података при склапању.
  • Препоручује се додавање подршке за континуитет у све апликације намењене склопивим уређајима и таблетима.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође