Multi-Window — مجموعهای از حالتهای چندوظیفهای در اندروید است که به اجرای همزمان چندین برنامه روی صفحه نمایش میدهد. سیستم شامل سه حالت است: Split Screen برای تقسیم صفحه به دو بخش، Picture-in-Picture برای ویدیو در پنجره کوچک و Freeform برای پنجرههای با اندازه دلخواه در صفحههای بزرگ. طبق Android Developers (2025)، پشتیبانی از Multi-Window برای دستگاههایی با عرض صفحه 600 dp و بیشتر اجباری است و هر توسعهدهنده باید برنامه را برای تغییرات اندازه پنجره تطبیق دهد.
نکات اصلی
Multi-Window — قابلیتی در اندروید است که در نسخه 7.0 Nougat (API 24) معرفی شد و به اجرای همزمان دو یا چند برنامه روی صفحه نمایش میدهد. این حالت پاسخی از سوی گوگل به محبوبیت روزافزون تبلتها و دستگاههای با صفحه بزرگ بود، جایی که حالت تکوظیفهای بهرهوری را محدود میکند.
قبل از اندروید 7.0 هر برنامه تمام صفحه را اشغال میکرد — هنگام جابجایی بین برنامهها، برنامه قبلی جمع میشد. Multi-Window این مدل را تغییر داد: اکنون برنامه میتواند بخشی از صفحه را اشغال کرده و فعال بماند. برای توسعهدهنده این意味着 onConfigurationChanged و مدیریت تغییر اندازه اجباری میشود.
در اندروید 12L (2022) گوگل Multi-Window را به حالت پیشفرض برای دستگاههای با صفحه بزرگ تبدیل کرد — همه برنامهها در تبلتها در حالتی اجرا میشوند که چندپنجرهای را مجاز میکند. استثنا فقط برنامههایی هستند که در مانیفست صراحتاً ممنوع شدهاند.
Split Screen — رایجترین حالت. صفحه به دو بخش افقی یا عمودی تقسیم میشود، کاربر جداکننده را میکشد. در تلفنها و تبلتها در دسترس است. از طریق Overview (Recents) فعال میشود — با کشیدن آیکون برنامه به لبه بالایی یا پایینی.
Picture-in-Picture (PiP) — حالت برای برنامههای ویدیویی و ناوبری. محتوا در یک پنجره کوچک شناور (حدود 15–25% صفحه) نمایش داده میشود که قابل جابجایی است. در اندروید 8.0+ در دسترس است. برای فعالسازی از enterPictureInPictureMode() در Activity استفاده میشود.
Freeform — حالت پنجرههای با اندازه دلخواه، شبیه به مدیران پنجره دسکتاپ. در Android TV و برخی دستگاههای با صفحه بزرگ تولیدکنندگان (Samsung DeX) در دسترس است. برنامهها در پنجرههایی با عنوان و دکمههای کنترل اجرا میشوند.
وقتی کاربر Multi-Window را فعال میکند، اندروید یک نمونه Activity جدید برای هر برنامه ایجاد میکند و فضای موجود صفحه را توزیع میکند. فعالیتها در Taskهای جداگانه قرار میگیرند، اما از یک StackView با جداکننده بین آنها استفاده میکنند.
سیستم هر Activity را از تغییر اندازه از طریق onConfigurationChanged() مطلع میکند. اگر Activity این رویداد را مدیریت نکند — دوباره ایجاد میشود (recreate). برای Split Screen عرض پنجره میتواند تا 220 dp — حداقل عرض پشتیبانی شده توسط پلتفرم — کاهش یابد.
اندروید به برنامه اجازه میدهد حداقل عرض را از طریق android:minWidth و android:minHeight در مانیفست اعلام کند. اگر فضای موجود کمتر از مقادیر مشخص شده باشد — Activity به حالت مکث میرود.
برای پشتیبانی از Multi-Window باید پرچم android:resizeableActivity="true" را در مانیفست تنظیم کنید. این به این معنی است که برنامه میتواند با تغییر پنجره اندازه خود را تغییر دهد. به طور پیشفرض در اندروید 12L+ همه برنامهها resizeable محسوب میشوند — پرچم نادیده گرفته میشود.
هنگام تغییر اندازه پنجره، Activity میتواند دوباره ایجاد شود (پیشفرض) یا رویداد را در onConfigurationChanged مدیریت کند، اگر در مانیفست configChanges="screenSize|smallestScreenSize" مشخص شده باشد. توصیه میشود برای Activityهای کلیدی configChanges مشخص کنید تا از از دست رفتن حالت جلوگیری شود.
<activity
android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|orientation" />
برای برنامههایی که تغییر اندازه را پشتیبانی نمیکنند، اندروید یک کادر محاورهای با هشدار نمایش میدهد. در این حالت هنگام تغییر به حالت چندپنجرهای، سیستم میتواند Activity را خاتمه داده و snackbar با پیشنهاد راهاندازی مجدد نشان دهد.
Multi-Window چرخه حیات استاندارد Activity را تغییر میدهد. وقتی برنامه دیگری در پنجره مجاور فعال میشود، Activity فعلی فراخوانی onPause() را دریافت میکند، اما onStop() را نه — هنوز قابل مشاهده است، اگرچه در فوکوس نیست. این مهم است: پخشکننده ویدیو باید پخش را در onPause ادامه دهد، نه در onStop.
توسعهدهنده باید حالتها را تشخیص دهد: onPause + isInMultiWindowMode() = true فقط به معنی از دست دادن فوکوس است، نه خروج از صفحه. برای ویدیو و انیمیشنها این سیگنالی است که پخش را متوقف نکنید، فقط برجستهسازی را از عناصر کنترل بردارید.
در خروج از Multi-Window، onMultiWindowModeChanged() قبل از onResume() فراخوانی میشود. این امکان را میدهد که قبل از شروع تعامل کاربر، رابط را برای حالت تمام صفحه بازسازی کنید.
اولین قانون — حفظ حالت. در حالت چندپنجرهای Activity میتواند در هر لحظه دوباره ایجاد شود. از SavedStateHandle در ViewModel یا onSaveInstanceState برای تمام دادههایی که باید بین تغییرات پیکربندی حفظ شوند استفاده کنید.
دوم — آزمایش در حداقل عرض 220 dp. این مقدار باریکترین پنجره در Split Screen در نظر گرفته میشود. رابط باید خوانا و کاربردی باقی بماند. اگر برخی عناصر از مرزها خارج میشوند — از Window Size Class برای جابجایی بین چیدمانها استفاده کنید.
سوم — غیرفعال کردن عملکردی که در Multi-Window کار نمیکند. به عنوان مثال، Camera ممکن است اگر صفحه خیلی کوچک باشد در دسترس نباشد. قبل از راهاندازی دوربین یا سایر عملکردهای تمام صفحه، isInMultiWindowMode() را بررسی کنید.
سوالات متداول
android:resizeableActivity="false" را در مانیفست تنظیم کنید. در اندروید 12L+ پرچم برای دستگاههای با صفحه بزرگ نادیده گرفته میشود، بنابراین برای ممنوعیت کامل از android:maxAspectRatio استفاده کنید.
isInMultiWindowMode() را از Activity فراخوانی کنید. اگر برنامه در Split Screen، PiP یا Freeform کار کند، متد true برمیگرداند. همچنین میتوانید روی onMultiWindowModeChanged() مشترک شوید.
در Android TV فقط حالت Picture-in-Picture در دسترس است. Split Screen و Freeform پشتیبانی نمیشوند — تلویزیونها از یک صفحه اصلی با پنجره PiP در گوشه استفاده میکنند.
Foreground-service صرفنظر از حالت به کار خود ادامه میدهد. اما اگر برنامه به PiP برود، سیستم ممکن است برای صرفهجویی در منابع اجرا را موقتاً متوقف کند.
اندروید از Drag and Drop بین پنجرهها در Multi-Window از طریق ClipData و View.OnDragListener پشتیبانی میکند. دادهها از طریق ContentProvider یا Intent با FLAG_GRANT_READ_URI_PERMISSION منتقل میشوند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید