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 — 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 — 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.
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'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.
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 — 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.
| WindowSizeClass | Ekran kengligi | Misol qurilma | Tavsiya etilgan layout |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | 600–839dp | Pixel Fold (yig'ilgan), iPad Mini | List-detail, side navigation |
| Expanded | 840dp+ | Galaxy Z Fold (ochilgan), iPad Pro | Multi-pane, navigation rail |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
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.
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.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
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.
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.
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 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.
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
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.
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 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.
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.
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
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.