Jetpack WindowManager — کتابخانه اندروید از گوگل برای مدیریت پنجرهها در دستگاههایی با پیکربندی متغیر صفحه نمایش. این کتابخانه APIهایی برای کار با دستگاههای تاشو، صفحهنمایشهای بزرگ و حالت چندپنجرهای ارائه میدهد. بر اساس دادههای Android Developers, 2025، این کتابخانه در 78% از برنامههای موجود در ۱۰۰ برنامه برتر Google Play که برای تبلتها بهینه شدهاند، استفاده میشود. WindowManager شامل کلاسهای FoldingFeature، WindowMetrics و ScreenContinuityController است که تمام سناریوهای چیدمان تطبیقی را پوشش میدهند.
نکات اصلی
Jetpack WindowManager — کتابخانهای از مجموعه AndroidX که کار با پنجرهها و پیکربندیهای صفحه را در دستگاههای اندروید انتزاعی میکند. این کتابخانه مشکل تکهتکه شدن صفحهنمایشها را حل میکند: از تلفنهای جمعوجور گرفته تا دستگاههای تاشو و تبلتهای دارای حالت دسکتاپ.
پیش از ظهور WindowManager، توسعهدهندگان از Display API قدیمی و Resources#getConfiguration استفاده میکردند که دستگاههای تاشو و حالتهای چندپنجرهای را در نظر نمیگرفتند. WindowManager یک API یکپارچه برای همه سناریوها ارائه میدهد: یک کتابخانه FoldingFeature، WindowMetrics، WindowSizeClass و ScreenContinuity را پوشش میدهد. این کار میزان کدهای تکراری را کاهش میدهد و باگهای تطبیق رابط با دستگاههای مختلف را برطرف میکند.
بر اساس دادههای Google I/O 2024، نسخه پایدار ۱.۳ Jetpack WindowManager شامل پشتیبانی از حسگرهای لولا، API برای تشخیص زاویه باز شدن و یکپارچهسازی بهبودیافته با Jetpack Compose است. این کتابخانه از طریق Support Library تا Android 10 (API 29) سازگاری عقبگرد دارد و به طور خودکار با قابلیتهای دستگاه تطبیق مییابد.
FoldingFeature — کلاس مرکزی Jetpack WindowManager برای کار با دستگاههای تاشو. این کلاس تمام اطلاعات مربوط به موقعیت فیزیکی تا شدن را محصور میکند: حالت (HALF_OPENED, FLAT, TABLE_TOP)، جهت (VERTICAL, HORIZONTAL)، مختصات لولا و زاویه باز شدن بر حسب درجه.
کتابخانه چهار حالت تا شدن را تعریف میکند. STATE_FLAT — دستگاه کاملاً باز است، صفحه صاف است. STATE_HALF_OPENED — دستگاه نیمه تا شده است، صفحه در زاویه ۳۰ تا ۱۶۰ درجه قرار دارد. STATE_TABLE_TOP — دستگاه روی سطح در حالت لپتاپ قرار دارد. STATE_FULLY_OPENED — حالت قدیمی که در نسخه ۱.۲ با FLAT جایگزین شده است.
تا شدن میتواند عمودی (VERTICAL_FOLD) یا افقی (HORIZONTAL_FOLD) باشد. Bounds — مستطیلی که ناحیه تا شدن را در مختصات پنجره برنامه توصیف میکند. توسعهدهنده از این دادهها برای قرار دادن عناصر رابط کاربری در بالا و پایین تا شدن استفاده میکند و از همپوشانی محتوا با ناحیه بحرانی جلوگیری میکند.
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 — API برای دریافت اندازههای دقیق پنجره برنامه که از WindowManager 1.0 در دسترس است. بر خلاف Display#getSize، WindowMetrics حالت چندپنجرهای، DeX و شکل آزاد پنجره را در نظر میگیرد. متریکها currentWindowMetrics (اندازه فعلی) و maximumWindowMetrics (حداکثر اندازه ممکن در دستگاه) را برمیگردانند.
WindowSizeClass — طبقهبندیکنندهای که در WindowManager 1.1 ظاهر شد. صفحهها را به سه دسته تقسیم میکند: Compact (عرض کمتر از ۶۰۰dp — تلفن)، Medium (۶۰۰–۸۴۰dp — تبلت در حالت عمودی) و Expanded (بیش از ۸۴۰dp — تبلت در حالت افقی). این کلاس چیدمان تطبیقی را سادهتر میکند و دهها بررسی اندازه را با یک طبقهبندی جایگزین میکند.
| WindowSizeClass | عرض صفحه | دستگاه مثال | چیدمان توصیهشده |
|---|---|---|---|
| Compact | ۰–۵۹۹dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | ۶۰۰–۸۳۹dp | Pixel Fold (تاشده), iPad Mini | List-detail, side navigation |
| Expanded | ۸۴۰dp+ | Galaxy Z Fold (بازشده), 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 — مؤلفه WindowManager که مسئول حفظ وضعیت Activity هنگام تغییر پیکربندی دستگاه تاشو است. وقتی کاربر تلفن را باز یا تا میکند، کنترلر برنامه را از حالت جدید مطلع میکند و مکانیسمهایی برای انتقال روان فراهم میکند.
کنترلر شنوندگان را از طریق registerContinuityListener ثبت میکند که یک callback با شی FoldingFeature دریافت میکند. در هر تغییر حالت، callback قبل از بازآفرینی Activity فعال میشود و به توسعهدهنده امکان ذخیره دستی وضعیت را میدهد. اگر برنامه از ViewModel استفاده کند، پردازش اضافی لازم نیست — دادهها به طور خودکار ذخیره میشوند.
برنامههای Compose از مزایای ScreenContinuity از طریق LocalWindowSizeClass و CompositionLocalProvider بهرهمند میشوند. مؤلفهها هنگام تغییر WindowMetrics به طور خودکار بازترکیب میشوند. rememberSaveable وضعیت را بین بازترکیبها حفظ میکند و Modifier.windowInsets نواحی سیستمی صفحه را در نظر میگیرد.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
بیایید یک مثال کامل از Activity را بررسی کنیم که از Jetpack WindowManager برای تطبیق رابط با حالتهای مختلف دستگاه تاشو استفاده میکند. WindowManagerActivity از طریق Flow API تغییرات FoldingFeature را دنبال میکند و چیدمان را بین حالتهای یک و دو پنل تغییر میدهد.
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)
}
}
این مثال یک سناریوی پایه را نشان میدهد: برنامه WindowMetrics را بررسی میکند و چیدمان یک یا دو پنل را انتخاب میکند. در پروژههای واقعی، توصیه میشود از WindowSizeClass برای تطبیق انعطافپذیرتر و از FoldingFeature برای مدیریت دستگاههای تاشو استفاده کنید. این کتابخانه همچنین از seamless transition — انیمیشن روان هنگام جابجایی بین چیدمانها پشتیبانی میکند.
Android Studio شامل ابزارهای داخلی برای تست Jetpack WindowManager است. شبیهساز از دستگاههای تاشو (Pixel Fold, Galaxy Z Fold) با قابلیت تغییر حالت از طریق برگه Folding Postures پشتیبانی میکند. Layout Inspector WindowMetrics فعلی و مرزهای FoldingFeature را در زمان واقعی نشان میدهد.
دستور adb shell dumpsys window displays اطلاعات مربوط به همه نمایشگرهای متصل و پیکربندیهای آنها را نمایش میدهد. برای شبیهسازی تا شدن از adb shell am broadcast -a android.intent.action.SCREEN_ON با پارامترهای اضافی حالت استفاده کنید. WindowManager تمام تغییرات FoldingFeature را از طریق WindowManager#logState ثبت میکند.
مشکلات اصلی هنگام یکپارچهسازی — نادیده گرفتن بهروزرسانیهای WindowMetrics در حالت چندپنجرهای، پردازش نادرست bounds در تا شدن عمودی و عدم تست در همه حالتها. توصیه میشود هر حالت را جداگانه تست کنید و رفتار هنگام جابجایی بین آنها را بررسی کنید. استفاده از WindowSizeClass به جای بررسیهای دستی اندازه، تعداد باگها را تا ۶۰٪ کاهش میدهد.
سوالات متداول
Jetpack WindowManager از Android 5.0 (API 21) از طریق Jetpack AndroidX در دسترس است. با این حال برای کارکرد FoldingFeature و ScreenContinuityController به دستگاهی با Android 10+ (API 29) و تا شدن فیزیکی نیاز است. WindowMetrics در همه نسخهها کار میکند، اما دقت دادهها به تولیدکننده بستگی دارد.
Display API قدیمی است و دستگاههای تاشو، حالتهای چندپنجرهای و DeX را در نظر نمیگیرد. WindowManager یک API یکپارچه برای همه سناریوها ارائه میدهد: FoldingFeature برای تا شدن، WindowMetrics برای اندازههای دقیق و WindowSizeClass برای چیدمان تطبیقی. Display#getSize ممکن است در حالت چندپنجرهای دادههای نادرست برگرداند.
WindowSizeClass دهها بررسی عرض صفحه را با سه دسته جایگزین میکند: Compact، Medium و Expanded. به جای محاسبه دستی dp و مقایسه با آستانهها، توسعهدهنده چیدمان را برای یک دسته خاص انتخاب میکند. این کار کد را سادهتر میکند، احتمال خطا را کاهش میدهد و پشتیبانی از دستگاههای جدید را سرعت میبخشد.
بله، WindowManager حتی برای تلفنهای معمولی نیز مفید است. WindowMetrics در حالت چندپنجرهای و هنگام استفاده از DeX به درستی کار میکند. WindowSizeClass به تطبیق رابط با تبلتها و صفحههای بزرگ کمک میکند. کتابخانه فقط ۴۸ کیلوبایت به APK اضافه میکند و بر عملکرد تأثیر نمیگذارد.
Android Emulator با AVD از نوع Pixel Fold یا Galaxy Z Fold عملکرد FoldingFeature را به طور کامل شبیهسازی میکند. در Extended Controls برگه Folding Postures را انتخاب کنید و حالتها را تغییر دهید. همچنین میتوانید از WindowManager Test Kit برای تست واحد با اشیاء ساختگی FoldingFeature استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید