Screen Continuity — механизам Android-а који обезбеђује беспрекорни прелаз апликације између склопљеног и расклопљеног стања склопивог уређаја. При расклапању екран мења физичке димензије, а систем поново покреће Activity са новим конфигурацијама. Према Google Developer, 2025, правилна обрада континуитета побољшава корисничко искуство за 40% и смањује број жалби на ресетовање стања. API ScreenContinuity је део Jetpack WindowManager-а од верзије 1.1 и омогућава програмеру да управља животним циклусом при промени позе уређаја.
Главно
Screen Continuity је механизам Android-а који чува стање Activity при промени физичке конфигурације екрана на склопивим уређајима. Када корисник расклопи или склопи телефон, систем може поново покренути Activity са новим димензијама прозора. Континуитет спречава губитак унетих података, позиције померања и тренутног екрана.
За разлику од обичне ротације екрана, где Android једноставно поново креира Activity са новом оријентацијом, склопиви уређаји уводе потпуно нове сценарије. Поза HALF_OPENED омогућава апликацији да ради на пола екрана, а FLAT — у потпуно расклопљеном таблет режиму. Без подршке за Screen Continuity свака промена позе ресетује интерфејс на почетно стање.
Према Google I/O 2024, више од 62% корисника склопивих уређаја сусрело се са апликацијама које некоректно обрађују прелаз између стања. Screen Continuity решава овај проблем на нивоу API-ја, пружајући програмеру готове алате за чување и враћање UI-ја.
Jetpack WindowManager дефинише три основне позе склопивог уређаја кроз класу FoldingFeature. Свака поза одговара одређеном физичком положају шарке и захтева посебну обраду интерфејса.
Уређај се налази под углом од 30 до 160 степени. Екран је подељен на две логичке области. Апликација може приказивати садржај на горњој половини и контролне елементе на доњој. Tabletop режим за видео позиве и медиа плејере користи управо ову позу.
Уређај је отворен на 180 степени, формирајући један велики екран. Апликација прелази у таблет режим са увећаном радном површином. У овој пози се препоручује приказ мулти-панел распореда са навигационом траком и детаљним садржајем један поред другог.
Уређај стоји на површини под углом од око 120 степени. Доња половина екрана служи као додирна табла или тастатура. Touchpad режим у овој пози омогућава емулацију трекпада на доњем делу екрана.
Android обрађује промену конфигурације склопивог уређаја кроз механизам configuration changes. Када корисник расклопи телефон, систем бележи промену величине прозора и покреће стандардни циклус поновног креирања Activity. Screen Continuity пресреће овај процес и чува кључне податке.
Основни метод за чување стања је onRetainNonConfigurationInstance, који се позива пре уништења Activity. Програмер у њему чува модел података, позицију листе и тренутни екран навигације. Након поновног креирања, Activity прима ове податке кроз getLastNonConfigurationInstance и враћа UI тачно до тренутка склапања.
За Fragments механизам је имплементиран кроз setRetainInstance(true), који спречава уништење фрагмента при промени конфигурације. У Jetpack Compose-у се користи rememberSaveable, који аутоматски чува стање при промени 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 верзије 1.1+ укључује класу ScreenContinuityController, која пружа готове механизме за управљање континуитетом екрана. API аутоматски обрађује промену позе и обавештава апликацију кроз callback интерфејсе.
Централна класа која региструје слушаоце промене позе. registerContinuityListener прима callback који се активира при сваком прелазу између стања склопивог уређаја. Контролер такође пружа информације о тренутној пози кроз метод getCurrentFoldingFeature.
Утилитарна класа за претварање података FoldingFeature у стања разумљива апликацији. FoldingFeatureAdapter нормализује координате шарке и одређује да ли је тренутна поза HALF_OPENED, FLAT или TABLE_TOP. Ово ослобађа програмера ручног израчунавања углова и граничних вредности.
За Compose апликације WindowManager пружа WindowSizeClass и модификаторе који узимају у обзир склопивост. Компонента BoxWithConstraints прилагођава се променама димензија екрана у реалном времену без поновног креирања Activity. Compose аутоматски покреће рекомпозицију при промени 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()
}
}
Размотримо комплетан пример Activity-ја са подршком за Screen Continuity. MainActivity обрађује три сценарија: склапање, расклапање и полуотворено стање. Подаци се чувају кроз onRetainNonConfigurationInstance и враћају при поновном креирању.
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 ако апликација ручно обрађује промене.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Често постављана питања
Screen Continuity чува стање при физичкој промени величине екрана, а не само при ротацији. Обични onSaveInstanceState не гарантује очување при пребацивању поза склопивог уређаја, док ScreenContinuityController обрађује управо овај сценарио.
Сви склопиви уређаји са Android 10+ и Google Play услугама. Подршка је укључена у Pixel Fold, серију Galaxy Z Fold, Huawei Mate X, Oppo Find N и OnePlus Open. За рад је потребан Jetpack WindowManager верзије 1.1 и више.
Jetpack Compose подржава Screen Continuity кроз rememberSaveable и WindowSizeClass. Композиција аутоматски реагује на промену WindowMetrics, а rememberSaveable чува стање између рекомпозиција. Модификатор onSizeChanged омогућава праћење промена димензија у реалном времену.
При расклапању или склапању уређаја, Activity се поново креира без чувања стања. Корисник губи унете податке, померање се ресетује, отворени дијалози се затварају. То доводи до негативних рецензија и пада рејтинга апликације у Google Play-у.
Android Emulator подржава симулацију склопивих уређаја. Креирајте AVD типа Pixel Fold, отворите Extended Controls и изаберите картицу Folding Postures. Пребацивање поза покреће configuration change, омогућавајући тестирање чувања стања без физичког уређаја.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође