Screen Continuity — buklangan va ochilgan holat o'rtasida dasturning uzluksiz o'tishini ta'minlaydigan Android mexanizmi. Ochishda ekran jismoniy o'lchamlarini o'zgartiradi va tizim Activity-ni yangi konfiguratsiyalar bilan qayta ishga tushiradi. Google Developer, 2025 ma'lumotlariga ko'ra, continuity-ni to'g'ri qayta ishlash foydalanuvchi tajribasini 40% ga yaxshilaydi va holatni tiklash haqidagi shikoyatlar sonini kamaytiradi. ScreenContinuity API Jetpack WindowManager tarkibiga 1.1 versiyasidan boshlab kiritilgan va dasturchiga qurilma pozasini o'zgartirishda hayotiy tsiklni boshqarish imkonini beradi.
Asosiy
Screen Continuity buklanadigan qurilmalarda ekranning jismoniy konfiguratsiyasi o'zgarganda Activity holatini saqlaydigan Android mexanizmidir. Foydalanuvchi telefonni ochgan yoki buklaganda tizim Activity-ni yangi oyna o'lchamlari bilan qayta ishga tushirishi mumkin. Uzluksizlik kiritilgan ma'lumotlarning, aylantirish holatining va joriy ekranning yo'qolishining oldini oladi.
Oddiy ekran aylantirishdan farqli o'laroq, Android shunchaki Activity-ni yangi yo'nalish bilan qayta yaratadi, buklanadigan qurilmalar butunlay yangi stsenariylarni joriy etadi. HALF_OPENED pozasi dasturning yarim ekranda ishlashiga imkon beradi, FLAT esa to'liq ochilgan planshet rejimida. Screen Continuity qo'llab-quvvatlamasdan, har bir poza o'zgarishi interfeysni boshlang'ich holatga qaytaradi.
Google I/O 2024 ma'lumotlariga ko'ra, buklanadigan qurilma foydalanuvchilarining 62% dan ortig'i holatlar o'rtasida o'tishni noto'g'ri boshqaradigan dasturlarga duch kelgan. Screen Continuity bu muammoni API darajasida hal qiladi va dasturchiga UI ni saqlash va tiklash uchun tayyor vositalarni taqdim etadi.
Jetpack WindowManager FoldingFeature sinfi orqali buklanadigan qurilmaning uchta asosiy pozasini belgilaydi. Har bir poza ilgakning ma'lum bir jismoniy holatiga mos keladi va maxsus interfeysni qayta ishlashni talab qiladi.
Qurilma 30 dan 160 darajagacha burchak ostida. Ekran ikkita mantiqiy hududga bo'lingan. Dastur tarkibni yuqori yarmida va boshqaruv elementlarini pastki yarmida ko'rsatishi mumkin. Tabletop rejimi video qo'ng'iroqlar va media pleerlar uchun aynan shu pozadan foydalanadi.
Qurilma 180 darajaga ochilib, bitta katta ekranni hosil qiladi. Dastur kengaytirilgan ish maydoni bilan planshet rejimiga o'tadi. Bu pozada navigatsiya paneli va batafsil tarkibni yonma-yon ko'rsatadigan ko'p panelli layout tavsiya etiladi.
Qurilma sirt ustida taxminan 120 daraja burchak ostida turadi. Ekranning pastki yarmi sensorli panel yoki klaviatura sifatida xizmat qiladi. Touchpad rejimi bu pozada ekranning pastki qismida trekpaddi emulyatsiya qilish imkonini beradi.
Android buklanadigan qurilma konfiguratsiyasining o'zgarishini configuration changes mexanizmi orqali qayta ishlaydi. Foydalanuvchi telefonni ochganda tizim oyna o'lchamining o'zgarishini qayd etadi va Activity-ni qayta yaratishning standart tsiklini boshlaydi. Screen Continuity bu jarayonni tutib oladi va asosiy ma'lumotlarni saqlaydi.
Holatni saqlashning asosiy metodi onRetainNonConfigurationInstance bo'lib, Activity yo'q qilinishidan oldin chaqiriladi. Dasturchi unda ma'lumot modelini, ro'yxat o'rnini va joriy navigatsiya ekranini saqlaydi. Qayta yaratilgandan so'ng, Activity bu ma'lumotlarni getLastNonConfigurationInstance orqali oladi va UI ni buklash vaqtigacha tiklaydi.
Fragments uchun mexanizm setRetainInstance(true) orqali amalga oshiriladi, bu konfiguratsiya o'zgarishida fragmentning yo'q qilinishini oldini oladi. Jetpack Compose-da Window Metrics o'zgarganda holatni avtomatik saqlaydigan rememberSaveable ishlatiladi.
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+ versiyasi ScreenContinuityController sinfini o'z ichiga oladi, u ekran uzluksizligini boshqarish uchun tayyor mexanizmlarni taqdim etadi. API avtomatik ravishda poza o'zgarishini qayta ishlaydi va callback interfeyslari orqali dasturga xabar beradi.
Poza o'zgarishi tinglovchilarini ro'yxatdan o'tkazadigan markaziy sinf. registerContinuityListener buklanadigan qurilma holatlari o'rtasidagi har bir o'tishda ishga tushadigan callbackni qabul qiladi. Kontroller shuningdek getCurrentFoldingFeature metodi orqali joriy poza haqida ma'lumot beradi.
FoldingFeature ma'lumotlarini dastur uchun tushunarli holatlarga aylantirish uchun yordamchi sinf. FoldingFeatureAdapter ilgak koordinatalarini normallashtiradi va joriy poza HALF_OPENED, FLAT yoki TABLE_TOP ekanligini aniqlaydi. Bu dasturchini burchaklar va chegara qiymatlarini qo'lda hisoblashdan ozod qiladi.
Compose dasturlari uchun WindowManager WindowSizeClass va buklanishni hisobga oladigan modifikatorlarni taqdim etadi. BoxWithConstraints komponenti Activity-ni qayta yaratmasdan ekran o'lchamlarining o'zgarishiga real vaqtda moslashadi. Compose WindowMetrics o'zgarganda avtomatik ravishda rekompozitsiyani ishga tushiradi.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Screen Continuity qo'llab-quvvatlaydigan Activity ning to'liq misolini ko'rib chiqaylik. MainActivity uchta stsenariyni qayta ishlaydi: buklash, ochish va yarim ochiq holat. Ma'lumotlar onRetainNonConfigurationInstance orqali saqlanadi va qayta yaratishda tiklanadi.
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
)
Asosiy element ContinuityState sinfidir, u elementlar ro'yxati va aylantirish o'rnini saqlaydi. Activity uni qayta yaratishdan oldin saqlaydi va onCreate chaqirilgandan so'ng darhol tiklaydi. WindowManager kontrolleri poza o'zgarishlariga obuna bo'ladi va layoutni rejimlar o'rtasida almashtiradi.
Android Studio uchala pozani qo'llab-quvvatlaydigan buklanadigan qurilma emulyatorini taqdim etadi. Screen Continuity ni sinash uchun Pixel Fold yoki Samsung Galaxy Z Fold tipidagi virtual qurilma yaratish va emulyator boshqaruv paneli orqali pozani o'zgartirish kifoya.
Foldable toifasi bilan AVD yarating va 7,6 dyuymli ekran o'lchamini tanlang. Emulyatorning kengaytirilgan boshqaruvida Folding Postures yorlig'ini oching va pozalar o'rtasida o'ting. Har bir o'tish dastur tomonidan to'g'ri qayta ishlanishi kerak bo'lgan configuration change ni ishga tushiradi.
Haqiqiy qurilmada (Galaxy Z Fold 5, Pixel Fold) sinov jismoniy ochish orqali amalga oshiriladi. Samsung DeX va Multi-Window rejimlari ham uzluksizlikni faollashtiradi. Disk raskadrovka uchun joriy buklanish holatini ko'rsatadigan adb shell dumpsys window policy ADB buyrug'idan foydalaning.
Asosiy xatolar — RecyclerView holatini yo'qotish, matn maydonlarida matnni tiklash va dialog oynalarini yopish. ViewModel bu muammolarni Activity hayotiy tsiklidan mustaqil ravishda ma'lumotlarni xotirada saqlash orqali hal qiladi. Shuningdek, agar dastur o'zgarishlarni qo'lda qayta ishlasa, Activity ni manifestda android:configChanges parametri bilan belgilash muhimdir.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Tez-tez beriladigan savollar
Screen Continuity ekranning jismoniy o'lchami o'zgarganda holatni saqlaydi, faqat aylantirishda emas. Oddiy onSaveInstanceState buklanadigan qurilma pozalari o'rtasida o'tishda saqlanishni kafolatlamaydi, ScreenContinuityController esa aynan shu stsenariyni qayta ishlaydi.
Android 10+ va Google Play xizmatlari bo'lgan barcha buklanadigan qurilmalar. Qo'llab-quvvatlash Pixel Fold, Galaxy Z Fold seriyasi, Huawei Mate X, Oppo Find N va OnePlus Open-ga kiritilgan. Ishlash uchun Jetpack WindowManager 1.1 versiyasi va undan yuqorisi talab qilinadi.
Jetpack Compose Screen Continuity-ni rememberSaveable va WindowSizeClass orqali qo'llab-quvvatlaydi. Kompozitsiya WindowMetrics o'zgarishiga avtomatik reaksiya beradi va rememberSaveable rekompozitsiyalar o'rtasida holatni saqlaydi. onSizeChanged modifikatori o'lcham o'zgarishlarini real vaqtda kuzatish imkonini beradi.
Qurilma ochilganda yoki buklanganda Activity holatni saqlamasdan qayta yaratiladi. Foydalanuvchi kiritilgan ma'lumotlarni yo'qotadi, aylantirish tiklanadi, ochiq dialoglar yopiladi. Bu salbiy sharhlarga va Google Play-da dastur reytingining pasayishiga olib keladi.
Android Emulator buklanadigan qurilmalarni simulyatsiya qilishni qo'llab-quvvatlaydi. Pixel Fold tipida AVD yarating, Extended Controls-ni oching va Folding Postures yorlig'ini tanlang. Pozalar o'rtasida o'tish jismoniy qurilmasiz holatni saqlashni sinash imkonini beradigan configuration change ni ishga tushiradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.