Jetpack WindowManager: bu nima, yig'iladigan qurilmalar uchun kutubxona

Muallif: IT Sectr Nashr etilgan: 2026-06-09 O'qish vaqti: 5 daq

Jetpack WindowManager — o'zgaruvchan ekran konfiguratsiyasiga ega qurilmalarda oynalarni boshqarish uchun Google-dan Android kutubxonasi. U yig'iladigan qurilmalar, katta ekranlar va multi-window rejimi bilan ishlash uchun API taqdim etadi. Android Developers, 2025 ma'lumotlariga ko'ra, kutubxona planshetlar uchun optimallashtirilgan Google Play top-100 ilovalarining 78 foizida qo'llaniladi. WindowManager FoldingFeature, WindowMetrics va ScreenContinuityController sinflarini o'z ichiga oladi va adaptiv joylashuvning barcha stsenariylarini qamrab oladi.

Asosiy ma'lumotlar

  • Jetpack WindowManager — Android qurilmalarida turli oyna konfiguratsiyalari bilan ishlash uchun rasmiy AndroidX kutubxonasi.
  • FoldingFeature — qurilmaning yig'ilish holatini tavsiflovchi sinf: holat, burchak va ilgak koordinatalari.
  • WindowMetrics — Activity-ga bog'lanmasdan oynaning joriy o'lchamlari va piksel zichligini olish uchun API.
  • ScreenContinuityController — yig'iladigan qurilmani yig'ish va ochishda ekran uzluksizligini boshqarish uchun komponent.
  • WindowSizeClass — turli qurilmalar uchun adaptiv joylashuvni soddalashtiradigan ekran o'lchamlari tasniflagichi (Compact, Medium, Expanded).

Jetpack WindowManager nima?

Jetpack WindowManager — AndroidX paketidan olingan kutubxona bo'lib, Android qurilmalarida oynalar va ekran konfiguratsiyalari bilan ishlashni abstraksiyalashtiradi. U ekranlarning parchalanish muammosini hal qiladi: ixcham telefonlardan tortib yig'iladigan qurilmalar va desktop rejimiga ega planshetlargacha.

WindowManager paydo bo'lishidan oldin dasturchilar eskirgan Display API va Resources#getConfiguration-dan foydalanardilar, ular yig'iladigan qurilmalar va multi-window rejimlarini hisobga olmas edi. WindowManager barcha stsenariylar uchun yagona API taqdim etadi: bitta kutubxona FoldingFeature, WindowMetrics, WindowSizeClass va ScreenContinuity-ni qamrab oladi. Bu boilerplate-kod miqdorini kamaytiradi va interfeysni turli qurilmalarga moslashtirishdagi xatolarni bartaraf etadi.

Google I/O 2024 ma'lumotlariga ko'ra, Jetpack WindowManager barqaror versiyasi 1.3 ilgak sensorlari, ochilish burchagini aniqlash uchun API va Jetpack Compose bilan yaxshilangan integratsiyani o'z ichiga oladi. Kutubxona Support Library orqali Android 10 (API 29) gacha orqaga mos keladi va avtomatik ravishda qurilma imkoniyatlariga moslashadi.

FoldingFeature: qurilmaning yig'ilishi bilan ishlash

FoldingFeature — yig'iladigan qurilmalar bilan ishlash uchun Jetpack WindowManager-ning markaziy sinfi. U yig'ilishning jismoniy holati haqidagi barcha ma'lumotlarni inkapsulyatsiya qiladi: holat (HALF_OPENED, FLAT, TABLE_TOP), orientatsiya (VERTICAL, HORIZONTAL), ilgak koordinatalari va darajadagi ochilish burchagi.

FoldingFeature holatlari

Kutubxona to'rtta yig'ilish holatini belgilaydi. STATE_FLAT — qurilma to'liq ochilgan, ekran tekis. STATE_HALF_OPENED — qurilma qisman yig'ilgan, ekran 30 dan 160 darajagacha burchak ostida. STATE_TABLE_TOP — qurilma noutbuk holatida sirtda turibdi. STATE_FULLY_OPENED — 1.2 versiyasida FLAT bilan almashtirilgan eskirgan holat.

Yig'ilishning orientatsiyasi va koordinatalari

Yig'ilish vertikal (VERTICAL_FOLD) yoki gorizontal (HORIZONTAL_FOLD) bo'lishi mumkin. Bounds — ilova oynasi koordinatalarida yig'ilish maydonini tavsiflovchi to'rtburchak. Dasturchi bu ma'lumotlardan UI elementlarini yig'ilishning yuqorisiga va pastiga joylashtirish, kontentning kritik maydon bilan qoplanishini oldini olish uchun foydalanadi.

kotlin
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()

flow.collect { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
        FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
        FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
    }
}

WindowMetrics va WindowSizeClass

WindowMetrics — WindowManager 1.0 dan boshlab mavjud bo'lgan, ilova oynasining aniq o'lchamlarini olish uchun API. Display#getSize dan farqli o'laroq, WindowMetrics multi-window rejimi, DeX va oynaning erkin shaklini hisobga oladi. Metriklar currentWindowMetrics (joriy o'lcham) va maximumWindowMetrics (qurilmada mumkin bo'lgan maksimal o'lcham) ni qaytaradi.

WindowSizeClass — WindowManager 1.1 da paydo bo'lgan tasniflagich. Ekranlarni uch toifaga ajratadi: Compact (kengligi 600dp dan kam — telefon), Medium (600–840dp — portret orientatsiyasidagi planshet) va Expanded (840dp dan ko'p — landshaft orientatsiyasidagi planshet). Bu sinf adaptiv joylashuvni soddalashtiradi, o'nlab o'lcham tekshiruvlarini bitta tasnif bilan almashtiradi.

WindowSizeClassEkran kengligiMisol qurilmaTavsiya etilgan layout
Compact0–599dpPixel 8, Galaxy S24Single-pane, bottom navigation
Medium600–839dpPixel Fold (yig'ilgan), iPad MiniList-detail, side navigation
Expanded840dp+Galaxy Z Fold (ochilgan), iPad ProMulti-pane, navigation rail
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityController va ekran uzluksizligi

ScreenContinuityController — yig'iladigan qurilma konfiguratsiyasi o'zgarganda Activity holatini saqlash uchun WindowManager komponenti. Foydalanuvchi telefonni ochganda yoki yig'ganda, kontroller ilovani yangi holat haqida xabardor qiladi va silliq o'tish mexanizmlarini taqdim etadi.

Kontroller registerContinuityListener orqali tinglovchilarni ro'yxatdan o'tkazadi, u FoldingFeature obyekti bilan callback qabul qiladi. Har bir holat o'zgarishida callback Activity qayta yaratilishidan oldin ishga tushadi va dasturchiga holatni qo'lda saqlash imkoniyatini beradi. Agar ilova ViewModel dan foydalansa, qo'shimcha ishlov talab qilinmaydi — ma'lumotlar avtomatik saqlanadi.

Jetpack Compose-da ScreenContinuity

Compose ilovalari ScreenContinuity afzalliklarini LocalWindowSizeClass va CompositionLocalProvider orqali oladi. Komponentlar WindowMetrics o'zgarganda avtomatik ravishda qayta kompozitsiyalanadi. rememberSaveable qayta kompozitsiyalar orasida holatni saqlaydi, Modifier.windowInsets esa ekranning tizim sohalarini hisobga oladi.

kotlin
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
    if (feature.state == FoldingFeature.State.FLAT) {
        logContinuityEvent("Device unfolded")
    }
}

Kotlin-da integratsiya misollari

Yig'iladigan qurilmaning turli holatlariga moslashish uchun Jetpack WindowManager dan foydalanadigan to'liq Activity misolini ko'rib chiqamiz. WindowManagerActivity Flow API orqali FoldingFeature o'zgarishlariga obuna bo'ladi va layout-ni bir va ikki panel rejimlari o'rtasida almashtiradi.

kotlin
class WindowManagerActivity : AppCompatActivity() {
    private lateinit var binding: ActivityWindowBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityWindowBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val windowManager = WindowManager(this)
        val metrics = windowManager.currentWindowMetrics

        if (metrics.bounds.width() > dpToPx(600)) {
            showDualPaneLayout()
        } else {
            showSinglePaneLayout()
        }
    }

    private fun showDualPaneLayout() {
        binding.content.layoutManager = GridLayoutManager(this, 2)
    }

    private fun showSinglePaneLayout() {
        binding.content.layoutManager = LinearLayoutManager(this)
    }
}

Misol asosiy stsenariyni ko'rsatadi: ilova WindowMetrics-ni tekshiradi va bir yoki ikki panel joylashuvini tanlaydi. Haqiqiy loyihalarda yanada moslashuvchan moslashish uchun WindowSizeClass va yig'iladigan qurilmalarni qayta ishlash uchun FoldingFeature dan foydalanish tavsiya etiladi. Kutubxona shuningdek seamless transition — layout-lar o'rtasida o'tishda silliq animatsiyani qo'llab-quvvatlaydi.

WindowManager-ni test qilish va nosozliklarni tuzatish

Android Studio Jetpack WindowManager-ni test qilish uchun o'rnatilgan vositalarni o'z ichiga oladi. Emulator Folding Postures yorlig'i orqali holatlarni almashtirish bilan yig'iladigan qurilmalarni (Pixel Fold, Galaxy Z Fold) qo'llab-quvvatlaydi. Layout Inspector real vaqtda joriy WindowMetrics va FoldingFeature chegaralarini ko'rsatadi.

ADB orqali nosozliklarni tuzatish

adb shell dumpsys window displays buyrug'i barcha ulangan displeylar va ularning konfiguratsiyalari haqida ma'lumot chiqaradi. Yig'ilishni simulyatsiya qilish uchun qo'shimcha holat parametrlari bilan adb shell am broadcast -a android.intent.action.SCREEN_ON dan foydalaning. WindowManager FoldingFeature-dagi barcha o'zgarishlarni WindowManager#logState orqali qayd qiladi.

Oddiy xatolar

Integratsiyadagi asosiy muammolar — multi-window rejimida WindowMetrics yangilanishlarini e'tiborsiz qoldirish, vertikal yig'ilishda bounds-ni noto'g'ri qayta ishlash va barcha holatlarda test qilmaslik. Tavsiya etiladi har bir holatni alohida test qilish va ular o'rtasida o'tishda xatti-harakatni tekshirish. O'lchamlarni qo'lda tekshirish o'rniga WindowSizeClass dan foydalanish xatolar sonini 60% ga kamaytiradi.

Tez-tez beriladigan savollar

Android-ning qaysi versiyasidan Jetpack WindowManager mavjud?

Jetpack WindowManager Android 5.0 (API 21) dan boshlab Jetpack AndroidX orqali mavjud. Biroq FoldingFeature va ScreenContinuityController ishlashi uchun Android 10+ (API 29) va jismoniy yig'iladigan qurilma talab qilinadi. WindowMetrics barcha versiyalarda ishlaydi, lekin ma'lumotlarning aniqligi ishlab chiqaruvchiga bog'liq.

WindowManager Display API-dan qanday farq qiladi?

Display API eskirgan va yig'iladigan qurilmalar, multi-window va DeX rejimlarini hisobga olmaydi. WindowManager barcha stsenariylar uchun yagona API taqdim etadi: yig'ilish uchun FoldingFeature, aniq o'lchamlar uchun WindowMetrics va adaptiv joylashuv uchun WindowSizeClass. Display#getSize multi-window rejimida noto'g'ri ma'lumotlarni qaytarishi mumkin.

WindowSizeClass adaptiv joylashuvda qanday yordam beradi?

WindowSizeClass ekran kengligining o'nlab tekshiruvlarini uchta toifa bilan almashtiradi: Compact, Medium va Expanded. dp ni qo'lda hisoblash va chegaraviy qiymatlar bilan solishtirish o'rniga dasturchi ma'lum bir toifa uchun layout tanlaydi. Bu kodni soddalashtiradi, xatolik ehtimolini kamaytiradi va yangi qurilmalarni qo'llab-quvvatlashni tezlashtiradi.

Agar yig'iladigan qurilmalar bo'lmasa, WindowManager-ni loyihaga qo'shish kerakmi?

Ha, WindowManager oddiy telefonlar uchun ham foydali. WindowMetrics multi-window rejimida va DeX dan foydalanishda to'g'ri ishlaydi. WindowSizeClass interfeysni planshetlar va katta ekranlarga moslashtirishga yordam beradi. Kutubxona APK-ga atigi 48 KB qo'shadi va ishlashga ta'sir qilmaydi.

Yig'iladigan qurilmasiz WindowManager-ni qanday test qilish mumkin?

Android Emulator Pixel Fold yoki Galaxy Z Fold tipidagi AVD bilan FoldingFeature ishini to'liq simulyatsiya qiladi. Extended Controls da Folding Postures yorlig'ini tanlang va holatlarni almashtiring. Shuningdek, FoldingFeature mock-obyektlari bilan unit test uchun WindowManager Test Kit dan foydalanish mumkin.

Xulosa

  • Jetpack WindowManager — oynalarni, yig'iladigan qurilmalarni va adaptiv joylashuvni boshqarish uchun AndroidX kutubxonasi.
  • FoldingFeature yig'ilish holati haqida ma'lumot beradi: ilgak koordinatalari bilan HALF_OPENED, FLAT, TABLE_TOP.
  • WindowMetrics multi-window va DeX rejimlarini hisobga olgan holda oynaning aniq o'lchamlarini qaytaradi.
  • WindowSizeClass adaptiv joylashuvni soddalashtirish uchun ekranlarni Compact, Medium va Expanded ga tasniflaydi.
  • ScreenContinuityController qurilmani yig'ish va ochishda Activity holatini saqlashni ta'minlaydi.
  • Android Emulator jismoniy qurilmasiz test qilish uchun barcha yig'ilish holatlarini simulyatsiya qilishni qo'llab-quvvatlaydi.
  • Tavsiya etiladi planshetlar va yig'iladigan qurilmalarda to'g'ri ishlash uchun WindowManager-ni barcha loyihalarga qo'shish.

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.

Loyihani muhokama qilish

Shuningdek o'qing