پشتیبانی از حالت چند پنجره ای

حالت چند پنجره ای به چندین برنامه امکان می دهد یک صفحه نمایش را به طور همزمان به اشتراک بگذارند. برنامه‌ها می‌توانند در کنار یکدیگر یا روی هم قرار بگیرند (حالت تقسیم صفحه)، یک برنامه در یک پنجره کوچک روی برنامه‌های دیگر (حالت تصویر در تصویر)، یا برنامه‌های جداگانه در پنجره‌های متحرک و قابل تغییر اندازه جداگانه (حالت پنجره‌دهی دسک‌تاپ) .

شکل 1. دو برنامه را در کنار هم در حالت تقسیم صفحه نمایش دهید.

تجربه کاربری به نسخه اندروید و نوع دستگاه بستگی دارد:

  • اندروید 7.0 (سطح API 24) حالت تقسیم صفحه را در دستگاه های صفحه کوچک و حالت تصویر در تصویر را در دستگاه های منتخب معرفی کرد.

    • حالت تقسیم صفحه نمایش را با دو برنامه پر می کند و آنها را در کنار هم یا یکی بالای دیگری نشان می دهد. کاربران می توانند تقسیم کننده جداکننده دو برنامه را بکشند تا یک برنامه بزرگتر و دیگری کوچکتر شود.

    • حالت تصویر در تصویر به کاربران امکان می‌دهد در حین تعامل با یک برنامه دیگر به پخش ویدیو ادامه دهند (به پشتیبانی تصویر در تصویر مراجعه کنید).

    • حالت پنجره دسکتاپ ، که در آن کاربران می توانند آزادانه اندازه هر فعالیت را تغییر دهند، می تواند توسط سازندگان دستگاه های صفحه نمایش بزرگ فعال شود.

      می‌توانید با تعیین حداقل ابعاد مجاز فعالیت، نحوه عملکرد برنامه‌تان در حالت چند پنجره‌ای را پیکربندی کنید. همچنین می توانید با تنظیم resizeabableActivity="false" حالت چند پنجره ای را برای برنامه خود غیرفعال کنید تا مطمئن شوید که سیستم همیشه برنامه شما را تمام صفحه نشان می دهد.

  • Android 8.0 (سطح API 26) حالت تصویر در تصویر را به دستگاه های صفحه نمایش کوچک گسترش می دهد.

  • اندروید 12 (سطح API 31) حالت چند پنجره ای را به حالت استاندارد تبدیل می کند.

    • در صفحه های بزرگ (کلاس اندازه پنجره متوسط ​​یا بزرگ )، پلتفرم از همه برنامه ها در حالت چند پنجره ای بدون در نظر گرفتن پیکربندی برنامه پشتیبانی می کند. اگر resizeableActivity="false" باشد، برنامه در صورت لزوم در حالت سازگاری قرار می گیرد تا ابعاد نمایش را در خود جای دهد.

    • در صفحه‌های کوچک (کلاس اندازه پنجره جمع‌وجور )، سیستم minWidth و minHeight یک فعالیت را بررسی می‌کند تا مشخص کند آیا فعالیت می‌تواند در حالت چند پنجره‌ای اجرا شود یا خیر. اگر resizeableActivity="false" ، برنامه در حالت چند پنجره ای بدون در نظر گرفتن حداقل عرض و ارتفاع اجرا نمی شود.

حالت تقسیم صفحه

کاربران می توانند حالت تقسیم صفحه را با انجام موارد زیر فعال کنند:

  1. صفحه Recents را باز کنید
  2. یک برنامه را به سمت نمایش بکشید
  3. نماد برنامه را در نوار عنوان برنامه فشار دهید
  4. گزینه منوی split screen را انتخاب کنید
  5. برنامه دیگری را از صفحه Recents انتخاب کنید یا صفحه Recents را ببندید و برنامه دیگری را اجرا کنید

کاربران می توانند با کشیدن تقسیم کننده پنجره به لبه صفحه - بالا یا پایین، چپ یا راست از حالت تقسیم صفحه خارج شوند.

راه اندازی مجاور

اگر برنامه شما نیاز به دسترسی به محتوا از طریق intent دارد، می توانید از FLAG_ACTIVITY_LAUNCH_ADJACENT برای باز کردن محتوا در یک پنجره تقسیم صفحه مجاور استفاده کنید.

FLAG_ACTIVITY_LAUNCH_ADJACENT در Android 7.0 (سطح API 24) معرفی شد تا برنامه‌هایی را که در حالت تقسیم صفحه اجرا می‌شوند فعال کنند تا فعالیت‌ها را در پنجره مجاور اجرا کنند.

Android 12L (سطح API 32) و بالاتر، تعریف پرچم را گسترش داده است تا برنامه‌هایی را که تمام صفحه اجرا می‌کنند، فعال کنند تا حالت تقسیم صفحه را فعال کنند و سپس فعالیت‌ها را در پنجره مجاور اجرا کنند.

برای راه‌اندازی یک فعالیت مجاور، FLAG_ACTIVITY_LAUNCH_ADJACENT در ارتباط با FLAG_ACTIVITY_NEW_TASK استفاده کنید، برای مثال:

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }
چرخه عمر فعالیت در حالت چند پنجره ای

حالت چند پنجره ای چرخه عمر فعالیت را تغییر نمی دهد. با این حال، وضعیت از سرگیری برنامه‌ها در چندین پنجره در نسخه‌های مختلف اندروید متفاوت است.

چند رزومه

Android 10 (سطح API 29) و نسخه‌های بالاتر از چند رزومه پشتیبانی می‌کنند—هنگامی که دستگاه در حالت چند پنجره‌ای قرار دارد، همه فعالیت‌ها در حالت RESUMED باقی می‌مانند. اگر یک فعالیت شفاف در بالای فعالیت باشد یا فعالیت قابل تمرکز نباشد، برای مثال، فعالیت در حالت تصویر در تصویر باشد، می‌توان یک فعالیت را متوقف کرد. همچنین ممکن است هیچ فعالیتی در یک زمان معین تمرکز نداشته باشد، برای مثال، اگر کشوی اعلان باز باشد. متد onStop() طبق معمول کار می کند: هر زمانی که یک فعالیت از روی صفحه نمایش حذف شود، متد فراخوانی می شود.

رزومه چندگانه همچنین در دستگاه‌های منتخب دارای Android 9 (سطح API 28) در دسترس است. برای شرکت در چند رزومه در دستگاه‌های Android 9، متادیتای مانیفست زیر را اضافه کنید:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

برای تأیید اینکه دستگاه معینی از این فراداده مانیفست پشتیبانی می کند، به مشخصات دستگاه مراجعه کنید.

اندروید 9

در حالت چند پنجره‌ای در اندروید 9 (سطح API 28) و پایین‌تر، تنها فعالیتی که کاربر اخیراً با آن تعامل داشته است در یک زمان مشخص فعال است. این فعالیت بالاترین در نظر گرفته می شود و تنها فعالیت در حالت RESUMED است. همه فعالیت های قابل مشاهده دیگر STARTED اند اما RESUMED نمی شوند. با این حال، سیستم به این فعالیت‌های قابل مشاهده اما از سر گرفته نشده اولویت بیشتری نسبت به فعالیت‌هایی می‌دهد که قابل مشاهده نیستند. اگر کاربر با یکی از فعالیت های قابل مشاهده تعامل داشته باشد، آن فعالیت از سر گرفته می شود و بالاترین فعالیت قبلی وارد حالت STARTED می شود.

هنگامی که چندین فعالیت در یک فرآیند برنامه فعال وجود دارد، فعالیت با بالاترین مرتبه z از سر گرفته می شود و سایر فعالیت ها متوقف می شوند.

تغییرات پیکربندی

هنگامی که کاربر یک برنامه را در حالت چند پنجره ای قرار می دهد، سیستم فعالیت یک تغییر پیکربندی را همانطور که در Handle configuration changes مشخص شده است اطلاع می دهد. این همچنین زمانی اتفاق می افتد که کاربر اندازه برنامه را تغییر دهد یا برنامه را به حالت تمام صفحه بازگرداند.

اساساً، این تغییر همان پیامدهای چرخه حیات فعالیت را دارد که وقتی سیستم به برنامه اطلاع می‌دهد که دستگاه از جهت عمودی به جهت افقی تغییر کرده است، با این تفاوت که ابعاد برنامه به جای تعویض فقط تغییر می‌کند. فعالیت شما می تواند خود تغییر پیکربندی را کنترل کند، یا برنامه شما می تواند به سیستم اجازه دهد فعالیت را از بین ببرد و آن را با ابعاد جدید بازسازی کند.

اگر کاربر در حال تغییر اندازه یک پنجره باشد و آن را در هر بعد بزرگتر کند، سیستم اندازه فعالیت را برای مطابقت با عملکرد کاربر تغییر می دهد و در صورت نیاز تغییرات پیکربندی را صادر می کند. اگر برنامه در طراحی در مناطقی که به تازگی در معرض دید قرار گرفته اند عقب بماند، سیستم به طور موقت آن مناطق را با رنگ مشخص شده توسط ویژگی windowBackground یا با ویژگی سبک پیش فرض windowBackgroundFallback پر می کند.

دسترسی انحصاری به منابع

برای کمک به پشتیبانی از ویژگی چند رزومه، از چرخه حیات onTopResumedActivityChanged() استفاده کنید.

زمانی که یک فعالیت بالاترین موقعیت فعالیت از سر گرفته شده را به دست می آورد یا از دست می دهد، تماس برگشتی فراخوانی می شود، که وقتی یک فعالیت از یک منبع تکی مشترک، مانند میکروفون یا دوربین استفاده می کند، مهم است:

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

توجه داشته باشید که یک برنامه ممکن است منابع خود را به دلایل دیگری از دست بدهد، مانند حذف یک قطعه سخت افزار مشترک.

در هر صورت، یک برنامه باید به خوبی رویدادها را مدیریت کند و تغییراتی را که بر منابع موجود تأثیر می‌گذارند، بیان کند.

برای برنامه‌هایی که از دوربین استفاده می‌کنند، CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() راهنمایی می‌کند که ممکن است زمان خوبی برای دسترسی به دوربین باشد. این روش از اندروید 10 (سطح API 29) در دسترس است.

به یاد داشته باشید که resizeableActivity=false تضمینی برای دسترسی انحصاری به دوربین نیست، زیرا سایر برنامه هایی که از دوربین استفاده می کنند را می توان در نمایشگرهای دیگر باز کرد.

شکل 2. دوربین در حالت چند پنجره ای.

وقتی برنامه فوکوس خود را از دست داد، لازم نیست برنامه شما دوربین را آزاد کند. برای مثال، ممکن است بخواهید پیش‌نمایش دوربین را در حالی که کاربر با برنامه‌ای که به‌تازگی فوکوس شده است، ادامه دهید. برای برنامه شما خوب است که دوربین را در زمانی که بالاترین برنامه از سرگیری شده نیست، به کار ببرد، اما باید به درستی با قاب قطع ارتباط کار کند. هنگامی که بالاترین برنامه از سرگیری شده بخواهد از دوربین استفاده کند، می تواند آن را باز کند و برنامه شما دسترسی را از دست خواهد داد. هنگامی که برنامه فوکوس را دوباره دریافت کرد، برنامه شما می‌تواند دوربین را دوباره باز کند.

پس از اینکه برنامه یک CameraDevice.StateCallback#onDisconnected() را دریافت کرد، تماس‌های بعدی روی دستگاه دوربین یک CameraAccessException ایجاد می‌کند.

چند نمایشگر

اندروید 10 (سطح API 29) از فعالیت های نمایشگرهای ثانویه پشتیبانی می کند. اگر فعالیتی در دستگاهی با نمایشگرهای متعدد در حال اجرا باشد، کاربران می توانند فعالیت را از یک نمایشگر به نمایشگر دیگر منتقل کنند. چند رزومه برای سناریوهای چند صفحه ای نیز اعمال می شود. چندین فعالیت می توانند ورودی کاربر را به طور همزمان دریافت کنند.

یک برنامه می‌تواند مشخص کند که هنگام راه‌اندازی یا زمانی که فعالیت دیگری ایجاد می‌کند، روی کدام نمایشگر اجرا شود. این رفتار به حالت راه‌اندازی فعالیت تعریف‌شده در فایل مانیفست و به پرچم‌ها و گزینه‌های intent که توسط نهادی که فعالیت را راه‌اندازی می‌کند، بستگی دارد. برای جزئیات بیشتر به کلاس ActivityOptions مراجعه کنید.

هنگامی که یک فعالیت به یک نمایشگر ثانویه منتقل می شود، می تواند از طریق یک به روز رسانی زمینه، تغییر اندازه پنجره، و تنظیمات و تغییرات منابع انجام شود. اگر اکتیویتی تغییر پیکربندی را انجام دهد، اکتیویتی در onConfigurationChanged() اطلاع داده می شود. در غیر این صورت، فعالیت دوباره راه اندازی می شود.

یک اکتیویتی باید نمایش فعلی را در onCreate() و onConfigurationChanged() در صورت مدیریت تغییر پیکربندی بررسی کند. هنگام تغییر صفحه نمایش، حتماً منابع و طرح‌بندی‌ها را به‌روزرسانی کنید.

اگر حالت راه‌اندازی انتخاب‌شده برای یک فعالیت اجازه چند نمونه را می‌دهد، راه‌اندازی در صفحه ثانویه می‌تواند نمونه جدیدی از فعالیت ایجاد کند. هر دو فعالیت به طور همزمان از سر گرفته می شوند.

شکل 3. نمونه های متعدد از یک فعالیت در نمایشگرهای متعدد.

همچنین ممکن است بخواهید در مورد API های چند صفحه نمایشی که در اندروید 8.0 معرفی شده اند بخوانید.

فعالیت در مقابل زمینه برنامه

استفاده از زمینه مناسب در نمایش چندگانه بسیار مهم است. هنگام دسترسی به منابع، زمینه فعالیت (که نمایش داده می شود) با زمینه برنامه (که نیست) متفاوت است.

زمینه فعالیت حاوی اطلاعاتی درباره نمایشگر است و همیشه برای ناحیه نمایشی که فعالیت در آن ظاهر می شود تنظیم می شود. این به شما امکان می دهد اطلاعات صحیحی در مورد تراکم نمایشگر یا معیارهای پنجره برنامه خود دریافت کنید. همیشه باید از زمینه فعالیت (یا زمینه مبتنی بر رابط کاربری دیگر) برای دریافت اطلاعات در مورد پنجره یا نمایشگر فعلی استفاده کنید. این همچنین بر برخی از APIهای سیستم که از اطلاعات مربوط به زمینه استفاده می کنند تأثیر می گذارد (به عنوان مثال، به نمای کلی Toasts مراجعه کنید).

پیکربندی پنجره فعالیت و نمایش والد منابع و زمینه را تعریف می کنند. صفحه نمایش فعلی را به صورت زیر دریافت کنید:

val activityDisplay = activity.getDisplay()

معیارهای پنجره فعالیت فعلی را دریافت کنید:

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

حداکثر معیارهای پنجره را برای پیکربندی سیستم فعلی دریافت کنید:

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

حداکثر معیارهای پنجره برای انجام محاسبات، انتخاب چیدمان یا تعیین اندازه منابع برای واکشی زودتر از زمان است. وجود این مورد در onCreate() به شما امکان می‌دهد تا قبل از اولین layout این تصمیم‌ها را بگیرید. این معیارها نباید برای چیدمان عناصر نمای خاص استفاده شوند. در عوض از اطلاعات شی Configuration استفاده کنید.

نمایش برش ها

دستگاه‌های تاشو ممکن است هنگام تا شدن و باز شدن، هندسه برش متفاوتی داشته باشند. برای جلوگیری از مشکلات بریدگی، به پشتیبانی از بریدگی‌های نمایشگر مراجعه کنید.

نمایشگرهای ثانویه

می توانید نمایشگرهای موجود را از سرویس سیستم DisplayManager دریافت کنید:

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

از کلاس Display برای به دست آوردن اطلاعاتی در مورد یک نمایشگر خاص، مانند اندازه نمایشگر یا پرچم هایی که نشان دهنده ایمن بودن صفحه نمایش هستند، استفاده کنید. با این حال، تصور نکنید که اندازه صفحه نمایش با ناحیه نمایش اختصاص داده شده به برنامه شما یکسان است. به یاد داشته باشید که در حالت چند پنجره ای، برنامه شما بخشی از نمایشگر را اشغال می کند.

تعیین اینکه آیا یک فعالیت می تواند روی یک نمایشگر راه اندازی شود یا خیر:

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

سپس فعالیت را روی صفحه نمایش اجرا کنید:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())
پشتیبانی از چند نمایشگر

اندروید از صفحه کلیدهای نرم افزاری، والپیپرها و لانچرها از چند نمایشگر پشتیبانی می کند.

صفحه کلید نرم افزار

اگر صفحه‌کلید برای پشتیبانی از تزئینات سیستم پیکربندی شده باشد، می‌تواند روی یک صفحه ثانویه نشان داده شود. اگر یک فیلد متنی در آن نمایشگر درخواست ورودی کند، ویرایشگر روش ورودی به طور خودکار ظاهر می شود.

شکل 4. صفحه کلید روی یک نمایشگر ثانویه.
کاغذ دیواری

در اندروید 10 (سطح API 29)، صفحه‌های ثانویه می‌توانند تصویر زمینه داشته باشند. چارچوب یک نمونه جداگانه از WallpaperService.Engine برای هر صفحه نمایش ایجاد می کند. مطمئن شوید که سطح هر موتور به طور مستقل کشیده شده است. توسعه دهندگان می توانند دارایی ها را با استفاده از زمینه نمایش در WallpaperService.Engine#getDisplayContext() بارگیری کنند. همچنین، مطمئن شوید که فایل WallpaperInfo.xml شما android:supportsMultipleDisplays="true" را تنظیم می کند.

شکل 5. تصویر زمینه روی گوشی و نمایشگر ثانویه.
پرتاب کننده ها

یک دسته فیلتر قصد جدید، SECONDARY_HOME ، یک فعالیت اختصاصی برای صفحه‌های ثانویه فراهم می‌کند. نمونه‌هایی از فعالیت در تمام نمایشگرهایی که از تزئینات سیستم پشتیبانی می‌کنند، استفاده می‌شود، یک مورد در هر نمایش.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

فعالیت باید حالت راه اندازی داشته باشد که از چندین نمونه جلوگیری نمی کند و می تواند با اندازه های مختلف صفحه سازگار شود. حالت راه اندازی نمی تواند singleInstance یا singleTask باشد.

به عنوان مثال، اجرای AOSP Launcher3 از یک فعالیت SECONDARY_HOME پشتیبانی می کند.

شکل 6. لانچر طراحی متریال روی گوشی.
شکل 7. پرتاب کننده متریال طراحی روی یک نمایشگر ثانویه.
معیارهای پنجره

اندروید 11 (سطح API 30) روش های WindowManager زیر را برای ارائه محدودیت های برنامه های در حال اجرا در حالت چند پنجره ای معرفی کرد:

روش های کتابخانه Jetpack WindowManager computeCurrentWindowMetrics() و computeMaximumWindowMetrics() به ترتیب عملکردهای مشابهی را ارائه می دهند، اما با سازگاری با API سطح 14.

برای به دست آوردن معیارهایی برای نمایشگرهایی غیر از نمایشگر فعلی، موارد زیر را انجام دهید (همانطور که در قطعه کد نشان داده شده است):

  • یک زمینه نمایش ایجاد کنید
  • یک زمینه پنجره برای نمایش ایجاد کنید
  • WindowManager زمینه پنجره را دریافت کنید
  • WindowMetrics حداکثر ناحیه نمایش در دسترس برنامه را دریافت کنید

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics
روش های منسوخ شده

متدهای Display getSize() و getMetrics() در سطح API 30 به نفع روش های جدید WindowManager منسوخ شدند.

Android 12 (سطح API 31) متدهای Display getRealSize() و getRealMetrics() را منسوخ می کند و رفتار آنها را به روز می کند تا با رفتار getMaximumWindowMetrics() مطابقت بیشتری داشته باشد.

پیکربندی حالت چند پنجره ای

اگر برنامه شما Android 7.0 (سطح API 24) یا بالاتر را هدف قرار می‌دهد، می‌توانید نحوه و اینکه آیا فعالیت‌های برنامه شما از حالت چند پنجره‌ای پشتیبانی می‌کند یا خیر، پیکربندی کنید. می‌توانید ویژگی‌هایی را در مانیفست خود تنظیم کنید تا هم اندازه و هم طرح‌بندی را کنترل کنید. تنظیمات ویژگی یک اکتیویتی ریشه برای همه فعالیت های درون پشته وظیفه آن اعمال می شود. به عنوان مثال، اگر اکتیویتی ریشه دارای android:resizeableActivity="true" باشد، همه فعالیت‌های موجود در پشته وظیفه قابل تغییر اندازه هستند. در برخی از دستگاه‌های بزرگ‌تر، مانند Chromebook، برنامه شما ممکن است در یک پنجره قابل تغییر اندازه اجرا شود، حتی اگر android:resizeableActivity="false" را مشخص کنید. اگر برنامه شما را خراب کرد، می‌توانید از فیلترها در Google Play برای محدود کردن در دسترس بودن برنامه خود در چنین دستگاه‌هایی استفاده کنید.

اندروید 12 (سطح API 31) حالت پیش‌فرض چند پنجره‌ای دارد. در صفحه های بزرگ (کلاس اندازه پنجره متوسط ​​یا بزرگ )، همه برنامه ها بدون در نظر گرفتن پیکربندی برنامه در حالت چند پنجره ای اجرا می شوند. در صفحه‌های کوچک، سیستم تنظیمات minWidth ، minHeight و resizeableActivity یک فعالیت را بررسی می‌کند تا مشخص کند آیا فعالیت می‌تواند در حالت چند پنجره‌ای اجرا شود یا خیر.

resizeableActivity

این ویژگی را در عنصر <activity> یا <application> مانیفست خود تنظیم کنید تا حالت چند پنجره‌ای را برای سطح API 30 و پایین‌تر فعال یا غیرفعال کند:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

اگر این مشخصه روی true تنظیم شود، فعالیت را می توان در حالت های پنجره دوپارچه و دسکتاپ راه اندازی کرد. اگر ویژگی روی false تنظیم شود، فعالیت از حالت چند پنجره ای پشتیبانی نمی کند. اگر مقدار نادرست باشد و کاربر تلاش کند فعالیت را در حالت چند پنجره ای راه اندازی کند، فعالیت تمام صفحه را اشغال می کند.

اگر برنامه شما سطح API 24 یا بالاتر را هدف قرار می دهد، اما مقداری برای این ویژگی مشخص نمی کنید، مقدار مشخصه به طور پیش فرض روی true است.

اگر برنامه شما سطح API 31 یا بالاتر را هدف قرار می‌دهد، این ویژگی در صفحه‌های کوچک و بزرگ متفاوت عمل می‌کند:

  • صفحه نمایش بزرگ (کلاس اندازه پنجره متوسط ​​یا بزرگ ): همه برنامه ها از حالت چند پنجره ای پشتیبانی می کنند. این ویژگی نشان می دهد که آیا می توان اندازه یک فعالیت را تغییر داد یا خیر. اگر resizeableActivity="false" باشد، برنامه در صورت لزوم در حالت سازگاری قرار می گیرد تا با ابعاد نمایش مطابقت داشته باشد.
  • صفحه نمایش های کوچک (کلاس اندازه پنجره جمع و جور ): اگر resizeableActivity="true" و حداقل عرض و حداقل ارتفاع فعالیت در شرایط چند پنجره ای باشد، فعالیت از حالت چند پنجره ای پشتیبانی می کند. اگر resizeableActivity="false" , فعالیت بدون در نظر گرفتن حداقل عرض و ارتفاع فعالیت از حالت چند پنجره ای پشتیبانی نمی کند.
supportsPictureInPicture

این ویژگی را در گره <activity> مانیفست خود تنظیم کنید تا نشان دهد آیا فعالیت از حالت تصویر در تصویر پشتیبانی می کند یا خیر.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />
configChanges

برای مدیریت تغییرات پیکربندی چند پنجره ای، مانند زمانی که کاربر اندازه یک پنجره را تغییر می دهد، ویژگی android:configChanges به گره <activity> مانیفست برنامه خود با حداقل مقادیر زیر اضافه کنید:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

پس از افزودن android:configChanges ، اکتیویتی و فرگمنت های شما به جای تخریب و ایجاد مجدد، به onConfigurationChanged() پاسخ تماس دریافت می کنند. سپس می‌توانید به‌صورت دستی نماهای خود را به‌روزرسانی کنید، منابع را مجدداً بارگیری کنید و سایر عملیات‌ها را در صورت نیاز انجام دهید.

<layout>

در Android 7.0 (سطح API 24) و بالاتر، عنصر مانیفست <layout> از چندین ویژگی پشتیبانی می کند که بر نحوه رفتار یک فعالیت در حالت چند پنجره ای تأثیر می گذارد:

  • android:defaultHeight ، android:defaultWidth : ارتفاع و عرض پیش‌فرض فعالیت هنگام راه‌اندازی در حالت پنجره دسک‌تاپ.

  • android:gravity : محل اولیه فعالیت هنگام راه اندازی در حالت پنجره دسکتاپ. برای مقادیر مناسب به کلاس Gravity مراجعه کنید.

  • android:minHeight ، android:minWidth : حداقل ارتفاع و حداقل عرض برای فعالیت در هر دو حالت پنجره دوپارچه و دسکتاپ. اگر کاربر تقسیم کننده را در حالت تقسیم صفحه حرکت دهد تا یک فعالیت کوچکتر از حداقل مشخص شده باشد، سیستم فعالیت را به اندازه ای که کاربر درخواست می کند برش می دهد.

کد زیر نشان می دهد که چگونه می توان اندازه و مکان پیش فرض یک فعالیت و حداقل اندازه آن را زمانی که فعالیت در حالت پنجره دسکتاپ نمایش داده می شود، مشخص کرد:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>
حالت چند پنجره ای در زمان اجرا

با شروع Android 7.0، این سیستم عملکردی را برای پشتیبانی از برنامه هایی که می توانند در حالت چند پنجره ای اجرا شوند، ارائه می دهد.

ویژگی های غیرفعال در حالت چند پنجره ای

در حالت چند پنجره‌ای، Android ممکن است ویژگی‌هایی را که برای فعالیتی که صفحه دستگاه را با سایر فعالیت‌ها یا برنامه‌ها به اشتراک می‌گذارد اعمال نمی‌شود، غیرفعال یا نادیده بگیرد.

علاوه بر این، برخی از گزینه‌های سفارشی‌سازی رابط کاربری سیستم غیرفعال هستند. برای مثال، اگر برنامه‌ها در حالت چند پنجره‌ای اجرا می‌شوند، نمی‌توانند نوار وضعیت را پنهان کنند ( به کنترل نمایان شدن رابط کاربری سیستم مراجعه کنید).

سیستم تغییرات مربوط به ویژگی android:screenOrientation را نادیده می گیرد.

پرس و جوهای حالت چند پنجره ای و پاسخ به تماس ها

کلاس Activity روش های زیر را برای پشتیبانی از حالت چند پنجره ای ارائه می دهد:

  • isInMultiWindowMode() : نشان می دهد که آیا فعالیت در حالت چند پنجره ای است یا خیر.

  • isInPictureInPictureMode() : نشان می دهد که آیا فعالیت در حالت تصویر در تصویر است یا خیر.

  • onMultiWindowModeChanged() : سیستم هر زمان که اکتیویتی وارد حالت چند پنجره ای یا خارج از آن شود، این متد را فراخوانی می کند. اگر اکتیویتی وارد حالت چندپنجره ای شود، سیستم به روش مقدار true یا اگر اکتیویتی از حالت چند پنجره ای خارج شود false می دهد.

  • onPictureInPictureModeChanged() : سیستم هر زمان که اکتیویتی وارد یا خارج از حالت تصویر در تصویر شود، این متد را فراخوانی می کند. اگر اکتیویتی وارد حالت تصویر در تصویر شود، سیستم مقدار true یا اگر فعالیت از حالت تصویر در تصویر خارج شود، مقدار false را به روش ارسال می کند.

کلاس Fragment نسخه های بسیاری از این روش ها را در معرض نمایش می گذارد. برای مثال، Fragment.onMultiWindowModeChanged() .

حالت تصویر در تصویر

برای قرار دادن یک اکتیویتی در حالت تصویر در تصویر، enterPictureInPictureMode() را فراخوانی کنید اگر دستگاه از حالت تصویر در تصویر پشتیبانی نکند، این روش تاثیری ندارد. برای اطلاعات بیشتر، به افزودن ویدیوها با استفاده از تصویر در تصویر (PiP) مراجعه کنید.

فعالیت های جدید در حالت چند پنجره ای

هنگامی که یک فعالیت جدید را راه اندازی می کنید، می توانید نشان دهید که در صورت امکان فعالیت جدید باید در مجاورت فعالیت فعلی نمایش داده شود. از پرچم قصد FLAG_ACTIVITY_LAUNCH_ADJACENT استفاده کنید، که به سیستم می گوید سعی کند فعالیت جدید را در یک پنجره مجاور ایجاد کند، بنابراین این دو فعالیت صفحه را به اشتراک می گذارند. سیستم بهترین تلاش را برای انجام این کار انجام می دهد، اما تضمینی برای تحقق آن نیست.

اگر دستگاهی در حالت پنجره دسکتاپ است و شما در حال راه اندازی یک فعالیت جدید هستید، می توانید با فراخوانی ActivityOptions.setLaunchBounds() ابعاد فعالیت و مکان صفحه نمایش جدید را مشخص کنید. اگر دستگاه در حالت چند پنجره ای نباشد، این روش تاثیری ندارد.

در سطح API 30 و پایین‌تر، اگر فعالیتی را در یک پشته وظیفه راه‌اندازی کنید، این اکتیویتی جایگزین فعالیت روی صفحه می‌شود و تمام ویژگی‌های چند پنجره‌ای آن را به ارث می‌برد. اگر می خواهید فعالیت جدید را به عنوان یک پنجره جداگانه در حالت چند پنجره ای راه اندازی کنید، باید آن را در یک پشته وظیفه جدید راه اندازی کنید.

Android 12 (سطح API 31) به برنامه ها امکان می دهد پنجره وظایف برنامه را بین چندین فعالیت تقسیم کنند. شما با ایجاد یک فایل پیکربندی XML یا برقراری تماس‌های Jetpack WindowManager API تعیین می‌کنید که برنامه‌تان چگونه فعالیت‌های خود را نمایش دهد - تمام صفحه، کنار هم یا پشته‌ای.

بکشید و رها کنید

کاربران می توانند داده ها را از یک فعالیت به فعالیت دیگر بکشند و رها کنند در حالی که این دو فعالیت صفحه نمایش را به اشتراک می گذارند. (قبل از Android 7.0، کاربران فقط می‌توانستند داده‌ها را در یک فعالیت بکشند و رها کنند.) برای افزودن سریع پشتیبانی برای پذیرش محتوای حذف‌شده، به API DropHelper مراجعه کنید. برای راهنمایی جامع کشیدن و رها کردن، به فعال کردن کشیدن و رها کردن مراجعه کنید.

چند نمونه

هر اکتیویتی روت وظیفه خودش را دارد که در یک فرآیند جداگانه اجرا می شود و در پنجره خودش نمایش داده می شود. برای راه‌اندازی یک نمونه جدید از برنامه خود در یک پنجره جداگانه، می‌توانید فعالیت‌های جدیدی را با پرچم FLAG_ACTIVITY_NEW_TASK شروع کنید. می توانید این را با برخی از ویژگی های چند پنجره ای ترکیب کنید تا یک مکان خاص برای پنجره جدید درخواست کنید. به عنوان مثال، یک برنامه خرید می تواند چندین پنجره را برای مقایسه محصولات نمایش دهد.

اندروید 12 (سطح API 31) به شما امکان می دهد دو نمونه از یک فعالیت را در کنار هم در یک پنجره کار اجرا کنید.

اگر می‌خواهید به کاربران اجازه دهید نمونه دیگری از برنامه شما را از راه‌انداز برنامه یا نوار وظیفه شروع کنند، مطمئن شوید که Activity راه‌انداز شما android:resizeableActivity="true" را تنظیم می‌کند و از حالت راه‌اندازی استفاده نمی‌کند که از چندین نمونه جلوگیری می‌کند. به عنوان مثال، هنگامی که FLAG_ACTIVITY_MULTIPLE_TASK یا FLAG_ACTIVITY_NEW_DOCUMENT تنظیم شده است، یک فعالیت singleInstancePerTask می‌تواند چندین بار در کارهای مختلف نمونه‌سازی شود.

چند نمونه را با طرح‌بندی چند پانل اشتباه نگیرید، مانند ارائه فهرست جزئیات که از SlidingPaneLayout استفاده می‌کند، که در یک پنجره اجرا می‌شود.

توجه داشته باشید که وقتی چندین نمونه در پنجره‌های جداگانه در یک دستگاه تاشو اجرا می‌شوند، در صورت تغییر وضعیت ممکن است یک یا چند نمونه به پس‌زمینه ارسال شود. به عنوان مثال، فرض کنید یک دستگاه باز است و دو نمونه برنامه در دو پنجره در دو طرف تاشو اجرا می شود. اگر دستگاه تا شده باشد، ممکن است یکی از نمونه‌ها به جای تلاش برای جا دادن پنجره‌ها برای هر دو نمونه در یک صفحه کوچک‌تر، خاتمه یابد.

تأیید حالت چند پنجره ای

چه برنامه شما سطح API 24 یا بالاتر را هدف قرار دهد یا نه، باید بررسی کنید که چگونه در حالت چند پنجره ای رفتار می کند، در صورتی که کاربر سعی می کند آن را در حالت چند پنجره ای روی دستگاهی که دارای Android نسخه 7.0 یا بالاتر است راه اندازی کند.

دستگاه های تست

دستگاه‌هایی که Android نسخه 7.0 (سطح API 24) یا بالاتر دارند، از حالت چند پنجره‌ای پشتیبانی می‌کنند.

سطح API 23 یا پایین تر

هنگامی که کاربران سعی می کنند از برنامه در حالت چند پنجره ای استفاده کنند، سیستم به اجبار اندازه برنامه را تغییر می دهد مگر اینکه برنامه جهت گیری ثابتی را اعلام کند.

اگر برنامه شما جهت گیری ثابتی را اعلام نمی کند، باید برنامه خود را روی دستگاهی که Android نسخه 7.0 یا بالاتر دارد راه اندازی کنید و سعی کنید برنامه را در حالت تقسیم صفحه قرار دهید. بررسی کنید که وقتی برنامه به اجبار اندازه برنامه تغییر می کند، تجربه کاربری قابل قبول است.

اگر برنامه یک جهت ثابت را اعلام کرد، باید سعی کنید برنامه را در حالت چند پنجره ای قرار دهید. بررسی کنید که با انجام این کار، برنامه در حالت تمام صفحه باقی بماند.

سطوح API 24 تا 30

اگر برنامه شما سطوح 24 تا 30 API را هدف قرار می‌دهد و پشتیبانی چند پنجره‌ای را غیرفعال نمی‌کند، رفتار زیر را در هر دو حالت پنجره دوپارچه و دسکتاپ تأیید کنید:

  • برنامه را تمام صفحه اجرا کنید، سپس با فشار دادن طولانی دکمه Recents به حالت چند پنجره ای بروید. بررسی کنید که برنامه به درستی جابجا شود.

  • برنامه را مستقیماً در حالت چند پنجره ای راه اندازی کنید و بررسی کنید که برنامه به درستی اجرا می شود. می‌توانید با فشار دادن دکمه Recents ، یک برنامه را در حالت چند پنجره‌ای راه‌اندازی کنید، سپس نوار عنوان برنامه خود را به مدت طولانی فشار دهید و آن را به یکی از قسمت‌های برجسته‌شده روی صفحه بکشید.

  • با کشیدن تقسیم کننده صفحه، اندازه برنامه خود را در حالت تقسیم صفحه تغییر دهید. بررسی کنید که اندازه برنامه بدون خرابی تغییر می‌کند و عناصر رابط کاربری ضروری قابل مشاهده هستند.

  • اگر حداقل ابعاد را برای برنامه خود مشخص کرده اید، سعی کنید اندازه برنامه را طوری تغییر دهید که اندازه پنجره آن کوچکتر از آن ابعاد باشد. بررسی کنید که نمی‌توانید اندازه برنامه را کوچک‌تر از حداقل ابعاد مشخص‌شده تغییر دهید.

  • از طریق همه آزمایش‌ها، تأیید کنید که عملکرد برنامه شما قابل قبول است. برای مثال، بررسی کنید که پس از تغییر اندازه برنامه، تاخیر زیادی برای به‌روزرسانی رابط کاربری وجود نداشته باشد.

سطح API 31 یا بالاتر

اگر برنامه شما سطح API 31 یا بالاتر را هدف قرار می دهد و حداقل عرض و حداقل ارتفاع فعالیت اصلی کمتر یا مساوی با ابعاد مربوط به ناحیه نمایش موجود است، همه رفتارهای فهرست شده برای سطوح API 24 تا 30 را تأیید کنید.

چک لیست تست

برای تأیید عملکرد برنامه خود در حالت چند پنجره ای، عملیات زیر را امتحان کنید. شما باید این عملیات را در حالت پنجره دوپارچه و دسکتاپ امتحان کنید، مگر در مواردی که غیر از این ذکر شده باشد.

  • وارد و خروج از حالت چند پنجره ای شوید.

  • از برنامه خود به برنامه دیگری بروید و بررسی کنید که برنامه در حالی که قابل مشاهده است اما فعال نیست درست عمل می کند. به عنوان مثال، اگر برنامه شما در حال پخش ویدیو است، بررسی کنید که در حالی که کاربر در حال تعامل با برنامه دیگری است، ویدیو همچنان پخش می شود.

  • در حالت تقسیم صفحه، جداکننده صفحه را حرکت دهید تا برنامه خود را بزرگتر و کوچکتر کنید. این عملیات را در هر دو پیکربندی کنار هم و یکی بالاتر از سایر تنظیمات امتحان کنید. بررسی کنید که برنامه خراب نمی شود، عملکردهای ضروری قابل مشاهده است و عملیات تغییر اندازه خیلی طول نمی کشد.

  • چندین عملیات تغییر اندازه را به صورت متوالی انجام دهید. اطمینان حاصل کنید که برنامه شما خراب نمی شود یا حافظه نشتی ندارد. نمایه‌ساز حافظه Android Studio اطلاعاتی درباره میزان مصرف حافظه برنامه شما ارائه می‌دهد (به بررسی میزان مصرف حافظه برنامه خود با Memory Profiler مراجعه کنید).

  • از برنامه خود به طور معمول در تعدادی از تنظیمات مختلف پنجره استفاده کنید و بررسی کنید که برنامه به درستی عمل می کند. بررسی کنید که متن قابل خواندن است و عناصر رابط کاربری برای تعامل با آنها خیلی کوچک نیستند.

پشتیبانی از چند پنجره غیرفعال است

در سطوح API 24 تا 30، اگر با تنظیم android:resizeableActivity="false" ، پشتیبانی از چند پنجره را غیرفعال کردید، باید برنامه خود را روی دستگاهی که Android نسخه 7.0 تا 11 دارد راه اندازی کنید و سعی کنید برنامه را در پنجره تقسیم صفحه و دسکتاپ قرار دهید. حالت ها بررسی کنید که با انجام این کار، برنامه در حالت تمام صفحه باقی بماند.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد پشتیبانی از چند پنجره در اندروید، به زیر مراجعه کنید:

{% کلمه به کلمه %} {% آخر کلمه %}

به شما توصیه می شود * توجه: متن پیوند زمانی که جاوا اسکریپت خاموش است نمایش داده می شود * حالت سازگاری دستگاه * پشتیبانی از قابلیت تغییر اندازه صفحه نمایش بزرگ * کنترل تغییرات پیکربندی

{% کلمه به کلمه %}
{% endverbatim %}،

حالت چند پنجره ای به چندین برنامه امکان می دهد یک صفحه نمایش را به طور همزمان به اشتراک بگذارند. برنامه‌ها می‌توانند در کنار یکدیگر یا روی هم قرار بگیرند (حالت تقسیم صفحه)، یک برنامه در یک پنجره کوچک روی برنامه‌های دیگر (حالت تصویر در تصویر)، یا برنامه‌های جداگانه در پنجره‌های متحرک و قابل تغییر اندازه جداگانه (حالت پنجره‌دهی دسک‌تاپ) .

شکل 1. دو برنامه را در کنار هم در حالت تقسیم صفحه نمایش دهید.

تجربه کاربری به نسخه اندروید و نوع دستگاه بستگی دارد:

  • اندروید 7.0 (سطح API 24) حالت تقسیم صفحه را در دستگاه های صفحه کوچک و حالت تصویر در تصویر را در دستگاه های منتخب معرفی کرد.

    • حالت تقسیم صفحه نمایش را با دو برنامه پر می کند و آنها را در کنار هم یا یکی بالای دیگری نشان می دهد. کاربران می توانند تقسیم کننده جداکننده دو برنامه را بکشند تا یک برنامه بزرگتر و دیگری کوچکتر شود.

    • حالت تصویر در تصویر به کاربران امکان می‌دهد در حین تعامل با یک برنامه دیگر به پخش ویدیو ادامه دهند (به پشتیبانی تصویر در تصویر مراجعه کنید).

    • حالت پنجره دسکتاپ ، که در آن کاربران می توانند آزادانه اندازه هر فعالیت را تغییر دهند، می تواند توسط سازندگان دستگاه های صفحه نمایش بزرگ فعال شود.

      می‌توانید با تعیین حداقل ابعاد مجاز فعالیت، نحوه عملکرد برنامه‌تان در حالت چند پنجره‌ای را پیکربندی کنید. همچنین می توانید با تنظیم resizeabableActivity="false" حالت چند پنجره ای را برای برنامه خود غیرفعال کنید تا مطمئن شوید که سیستم همیشه برنامه شما را تمام صفحه نشان می دهد.

  • Android 8.0 (سطح API 26) حالت تصویر در تصویر را به دستگاه های صفحه نمایش کوچک گسترش می دهد.

  • اندروید 12 (سطح API 31) حالت چند پنجره ای را به حالت استاندارد تبدیل می کند.

    • در صفحه های بزرگ (کلاس اندازه پنجره متوسط ​​یا بزرگ )، پلتفرم از همه برنامه ها در حالت چند پنجره ای بدون در نظر گرفتن پیکربندی برنامه پشتیبانی می کند. اگر resizeableActivity="false" باشد، برنامه در صورت لزوم در حالت سازگاری قرار می گیرد تا ابعاد نمایش را در خود جای دهد.

    • در صفحه های کوچک (کلاس اندازه پنجره جمع و جور ) ، سیستم minWidth و minHeight یک فعالیت را بررسی می کند تا مشخص کند که آیا این فعالیت می تواند در حالت چند پنجره اجرا شود. اگر resizeableActivity="false" ، بدون در نظر گرفتن حداقل عرض و ارتفاع ، از برنامه در حالت چند پنجره جلوگیری می شود.

حالت تقسیم صفحه

کاربران می توانند با انجام موارد زیر حالت صفحه تقسیم را فعال کنند:

  1. صفحه Recents را باز کنید
  2. یک برنامه را به سمت خود بکشید
  3. نماد برنامه را در نوار عنوان برنامه فشار دهید
  4. گزینه منوی Split Screen را انتخاب کنید
  5. برنامه دیگری را از صفحه Recents انتخاب کنید ، یا صفحه Recents را ببندید و برنامه دیگری را اجرا کنید

کاربران می توانند با کشیدن تقسیم کننده پنجره به لبه صفحه-بالا یا پایین ، چپ یا راست ، از حالت اسپلیت صفحه خارج شوند.

راه اندازی مجاور

اگر برنامه شما نیاز به دسترسی به محتوا از طریق یک هدف دارد ، می توانید از FLAG_ACTIVITY_LAUNCH_ADJACENT برای باز کردن محتوا در یک پنجره اسپلیت صفحه مجاور استفاده کنید.

FLAG_ACTIVITY_LAUNCH_ADJACENT در Android 7.0 (سطح API 24) معرفی شد تا برنامه هایی را که در حالت اسپلیت صفحه اجرا می شوند فعال کنند تا فعالیت ها را در پنجره مجاور راه اندازی کنند.

Android 12L (API سطح 32) و بالاتر تعریف پرچم را گسترش داده اند تا برنامه هایی را که در حال اجرا هستند ، برای فعال کردن حالت صفحه تقسیم شده فعال کرده و سپس فعالیت ها را در پنجره مجاور راه اندازی کنید.

برای راه اندازی یک فعالیت مجاور ، به عنوان مثال FLAG_ACTIVITY_LAUNCH_ADJACENT در رابطه با FLAG_ACTIVITY_NEW_TASK استفاده کنید:

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }
چرخه عمر فعالیت در حالت چند پنجره

حالت چند پنجره چرخه عمر فعالیت را تغییر نمی دهد. با این حال ، وضعیت رزومه برنامه ها در ویندوز متعدد در نسخه های مختلف اندروید متفاوت است.

چند برگه

Android 10 (API سطح 29) و نسخه های بالاتر از چند رزومه پشتیبانی می کنند-همه فعالیت ها در حالت RESUMED باقی می مانند وقتی دستگاه در حالت چند پنجره قرار دارد. اگر یک فعالیت شفاف در بالای فعالیت باشد یا فعالیت قابل توجه نباشد ، می توان یک فعالیت را متوقف کرد ، به عنوان مثال ، فعالیت در حالت تصویر در تصویر است. همچنین ممکن است که هیچ فعالیتی در یک زمان معین تمرکز داشته باشد ، به عنوان مثال ، اگر کشو اعلان باز باشد. روش onStop() طبق معمول کار می کند: این روش هر زمان که فعالیتی از صفحه خارج شود ، نامیده می شود.

Multi-Resume در دستگاه های منتخب در حال اجرا Android 9 (API سطح 28) نیز موجود است. برای انتخاب چند وضوح در دستگاه های Android 9 ، ابرداده مانیفست زیر را اضافه کنید:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

برای تأیید اینکه یک دستگاه خاص از این ابرداده آشکار پشتیبانی می کند ، به مشخصات دستگاه مراجعه کنید.

اندروید 9

در حالت چند پنجره در Android 9 (API سطح 28) و پایین تر ، فقط فعالیتی که کاربر اخیراً با آن تعامل کرده است در یک زمان معین فعال است. این فعالیت بالاترین در نظر گرفته می شود و تنها فعالیت در حالت RESUMED است. همه فعالیت های قابل مشاهده دیگر STARTED اند اما RESUMED نمی شوند. با این حال ، این سیستم این فعالیت های قابل مشاهده اما از سر گرفته شده را در اولویت بالاتر از فعالیت هایی که قابل مشاهده نیستند ، می دهد. اگر کاربر با یکی از فعالیتهای قابل مشاهده در تعامل باشد ، آن فعالیت از سر گرفته می شود و بیشترین فعالیت قبلاً وارد حالت STARTED می شود.

هنگامی که چندین فعالیت در یک فرآیند برنامه فعال واحد وجود دارد ، فعالیت با بالاترین مرتبه Z از سر گرفته می شود و سایرین متوقف می شوند.

تغییر پیکربندی

هنگامی که کاربر یک برنامه را در حالت چند پنجره قرار می دهد ، سیستم فعالیت تغییر پیکربندی را همانطور که در تغییر پیکربندی دسته مشخص شده است ، اطلاع می دهد. این همچنین زمانی اتفاق می افتد که کاربر برنامه را تغییر اندازه دهد یا برنامه را دوباره در حالت تمام صفحه قرار دهد.

در اصل ، این تغییر دارای همان پیامدهای چرخه عمر فعالیت است ، همانطور که وقتی سیستم به برنامه اطلاع می دهد که دستگاه از پرتره به جهت گیری منظره تغییر یافته است ، به جز اینکه ابعاد برنامه به جای اینکه فقط تعویض شود تغییر می کند. فعالیت شما می تواند تغییر پیکربندی خود را کنترل کند ، یا برنامه شما می تواند به سیستم اجازه دهد فعالیت را از بین ببرد و آن را با ابعاد جدید بازآفرینی کند.

اگر کاربر در حال تغییر اندازه یک پنجره باشد و آن را در هر دو بعد بزرگتر کند ، سیستم فعالیت را برای مطابقت با عملکرد کاربر تغییر می دهد و در صورت لزوم تغییرات پیکربندی را ایجاد می کند. اگر برنامه در طراحی در مناطق تازه در معرض عقب مانده باشد ، سیستم به طور موقت آن مناطق را با رنگ مشخص شده توسط ویژگی windowBackground یا توسط ویژگی پیش فرض windowBackgroundFallback Style پر می کند.

دسترسی انحصاری منابع

برای کمک به پشتیبانی از ویژگی چند وضوح ، از پاسخ به پاسخ به چرخه چرخه عمر onTopResumedActivityChanged() استفاده کنید.

پاسخ به تماس هنگامی که یک فعالیت به دست می آید یا موقعیت فعالیت از سرگیری را از دست می دهد ، مورد استفاده قرار می گیرد ، که مهم است وقتی یک فعالیت از یک منبع مشترک مشترک مانند میکروفون یا دوربین استفاده می کند:

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

توجه داشته باشید که یک برنامه به دلایل دیگر می تواند منابع را از دست بدهد ، مانند حذف یک قطعه سخت افزاری مشترک.

در هر صورت ، یک برنامه باید با ظرافت از وقایع برخورد کند و تغییراتی را که بر منابع موجود تأثیر می گذارد ، اداره کند.

برای برنامه هایی که از یک دوربین استفاده می کنند ، CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() اشاره ای را ارائه می دهد که ممکن است زمان خوبی برای دسترسی به دوربین باشد. این روش از طریق Android 10 (API سطح 29) در دسترس است.

به یاد داشته باشید که resizeableActivity=false ضمانت دسترسی منحصر به فرد دوربین نیست ، زیرا سایر برنامه هایی که از دوربین استفاده می کنند می توانند در سایر نمایشگرها باز شوند.

شکل 2 دوربین در حالت چند پنجره.

برنامه شما لازم نیست که وقتی برنامه تمرکز خود را از دست داد ، دوربین را آزاد کنید. به عنوان مثال ، شما ممکن است بخواهید پیش نمایش دوربین را ادامه دهید در حالی که کاربر با برنامه تازه متمرکز شده از سر گرفته شده است. برای برنامه شما خوب است که وقتی دوربین از سر گرفته نشده است ، دوربین را اجرا کنید ، اما باید پرونده قطع اتصال را به درستی انجام دهد. هنگامی که بالاترین برنامه از سرگیری شده می خواهد از دوربین استفاده کند ، می تواند آن را باز کند و برنامه شما دسترسی را از دست می دهد. برنامه شما می تواند دوربین را مجدداً بازگرداند.

پس از دریافت یک برنامه یک CameraDevice.StateCallback#onDisconnected() پاسخ به تماس ، تماس های بعدی با دستگاه دوربین ، یک CameraAccessException پرتاب می کند.

چند نمایشگر

Android 10 (API سطح 29) از فعالیت های نمایشگرهای ثانویه پشتیبانی می کند. اگر فعالیتی بر روی دستگاه با نمایشگرهای متعدد اجرا شود ، کاربران می توانند فعالیت را از یک صفحه نمایش به صفحه دیگر منتقل کنند. چند رزومه در مورد سناریوهای چند صفحه ای نیز اعمال می شود. چندین فعالیت می تواند ورودی کاربر را همزمان دریافت کند.

یک برنامه می تواند مشخص کند که هنگام راه اندازی یا چه زمانی فعالیت دیگری را ایجاد می کند ، کدام صفحه نمایش را باید اجرا کند. این رفتار به حالت راه اندازی فعالیت تعریف شده در پرونده مانیفست و پرچم ها و گزینه های تعیین شده توسط موجودیت راه اندازی فعالیت بستگی دارد. برای اطلاعات بیشتر به کلاس ActivityOptions مراجعه کنید.

هنگامی که یک فعالیت به یک صفحه نمایش ثانویه منتقل می شود ، می تواند به روزرسانی زمینه ، تغییر اندازه پنجره و پیکربندی و تغییرات منابع را طی کند. اگر فعالیت تغییر پیکربندی را انجام دهد ، فعالیت در onConfigurationChanged() اطلاع داده می شود. در غیر این صورت ، فعالیت دوباره راه اندازی می شود.

در صورت تغییر پیکربندی ، یک فعالیت باید صفحه نمایش فعلی را در onCreate() و onConfigurationChanged() بررسی کند. هنگام تغییر صفحه ، حتماً منابع و چیدمان ها را به روز کنید.

اگر حالت پرتاب انتخاب شده برای یک فعالیت امکان پذیر باشد ، راه اندازی روی صفحه ثانویه می تواند نمونه جدیدی از فعالیت را ایجاد کند. هر دو فعالیت در همان زمان از سر گرفته می شوند.

شکل 3 نمونه های متعدد فعالیت در نمایشگرهای متعدد.

همچنین ممکن است بخواهید در مورد API های چند منظوره که در Android 8.0 معرفی شده اند ، بخوانید.

فعالیت در مقابل زمینه برنامه

استفاده از زمینه مناسب در چند صفحه نمایش بسیار مهم است. هنگام دسترسی به منابع ، زمینه فعالیت (که نمایش داده می شود) با متن برنامه (که اینگونه نیست) متفاوت است.

زمینه فعالیت حاوی اطلاعاتی در مورد صفحه نمایش است و همیشه برای منطقه نمایش که در آن فعالیت ظاهر می شود تنظیم می شود. این به شما امکان می دهد تا اطلاعات صحیح در مورد چگالی صفحه نمایش یا معیارهای پنجره برنامه خود را بدست آورید. شما همیشه باید از زمینه فعالیت (یا یک زمینه مبتنی بر UI) استفاده کنید تا اطلاعات مربوط به پنجره یا صفحه نمایش فعلی را بدست آورید. این همچنین بر برخی از API های سیستم که از اطلاعات از متن استفاده می کنند ، تأثیر می گذارد (به عنوان مثال ، به نمای اجمالی نان تست ها مراجعه کنید).

پیکربندی پنجره فعالیت و نمایشگر والدین منابع و زمینه را تعریف می کنند. صفحه نمایش فعلی را به شرح زیر دریافت کنید:

val activityDisplay = activity.getDisplay()

معیارهای پنجره فعالیت فعلی را دریافت کنید:

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

حداکثر معیارهای پنجره را برای پیکربندی سیستم فعلی دریافت کنید:

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

حداکثر معیارهای پنجره برای انجام محاسبات ، انتخاب طرح یا تعیین اندازه منابع برای واکشی قبل از زمان است. در دسترس بودن این موارد در onCreate() شما را قادر می سازد قبل از اولین تصویب طرح ، این تصمیمات را بگیرید. از این معیارها نباید برای بیان عناصر دید خاص استفاده شود. در عوض از اطلاعات از شیء Configuration استفاده کنید.

برش های نمایش

دستگاه های تاشو ممکن است هنگام تاشو و آشکار شدن هندسه برش متفاوتی داشته باشند. برای جلوگیری از مشکلات قطع ، به برش های صفحه نمایش پشتیبانی مراجعه کنید.

نمایشگرهای ثانویه

می توانید نمایشگرهای موجود را از سرویس سیستم DisplayManager دریافت کنید:

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

برای به دست آوردن اطلاعات در مورد یک صفحه نمایش خاص ، مانند اندازه صفحه نمایش یا پرچم هایی که نشان می دهد صفحه نمایش امن است ، از کلاس Display استفاده کنید. با این حال ، فرض نکنید که اندازه صفحه نمایش همان منطقه نمایشگر اختصاص یافته به برنامه شما خواهد بود. به یاد داشته باشید که در حالت چند پنجره ، برنامه شما بخشی از صفحه نمایش را اشغال می کند.

تعیین کنید که آیا یک فعالیت می تواند روی صفحه نمایش راه اندازی شود:

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

سپس فعالیت را روی صفحه نمایش راه اندازی کنید:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())
پشتیبانی چند صفحه ای

Android پشتیبانی چند منظوره برای صفحه کلید نرم افزاری ، تصاویر پس زمینه و پرتاب کننده ها را ارائه می دهد.

صفحه کلید نرم افزاری

اگر صفحه نمایش برای پشتیبانی از تزئینات سیستم پیکربندی شده باشد ، می توان صفحه کلید را در صفحه ثانویه نشان داد. اگر یک متن متن درخواست کند در آن نمایشگر درخواست کند ، ویرایشگر روش ورودی به طور خودکار ظاهر می شود.

شکل 4. صفحه کلید روی صفحه نمایش ثانویه.
کاغذ دیواری

در Android 10 (API سطح 29) ، صفحه های ثانویه می توانند تصویر زمینه داشته باشند. این چارچوب نمونه جداگانه ای از WallpaperService.Engine برای هر صفحه نمایش ایجاد می کند. اطمینان حاصل کنید که سطح هر موتور به طور مستقل کشیده شده است. توسعه دهندگان می توانند دارایی ها را با استفاده از زمینه نمایش در WallpaperService.Engine#getDisplayContext() بارگیری کنند. همچنین ، اطمینان حاصل کنید که پرونده WallpaperInfo.xml خود را تنظیم می کند android:supportsMultipleDisplays="true" .

شکل 5 تصویر زمینه در تلفن و صفحه ثانویه.
پرتاب کننده ها

یک دسته جدید فیلتر با هدف ، SECONDARY_HOME ، یک فعالیت اختصاصی برای صفحه های ثانویه فراهم می کند. نمونه های این فعالیت در کلیه نمایشگرهایی که از تزئینات سیستم پشتیبانی می کنند ، یکی در هر صفحه نمایش استفاده می شود.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

این فعالیت باید دارای یک حالت پرتاب باشد که از چندین مورد جلوگیری نمی کند و می تواند با اندازه های مختلف صفحه سازگار باشد. حالت پرتاب نمی تواند singleInstance یا singleTask باشد.

به عنوان مثال ، اجرای AOSP Launcher3 از یک فعالیت SECONDARY_HOME پشتیبانی می کند.

شکل 6. پرتاب طراحی مواد از طریق تلفن.
شکل 7. پرتاب طراحی مواد در صفحه نمایش ثانویه.
معیارهای پنجره

Android 11 (API سطح 30) روشهای زیر WindowManager را برای ارائه مرزهای برنامه هایی که در حالت چند پنجره اجرا می شوند ، معرفی کرد:

کتابخانه Jetpack Windowmanager Methods computeCurrentWindowMetrics() و computeMaximumWindowMetrics() به ترتیب عملکرد مشابهی را ارائه می دهند ، اما با سازگاری عقب مانده با سطح API 14.

برای به دست آوردن معیارهایی برای نمایشگرهای غیر از صفحه نمایش فعلی ، موارد زیر را انجام دهید (همانطور که در قطعه کد نشان داده شده است):

  • یک زمینه نمایش ایجاد کنید
  • برای نمایش یک زمینه پنجره ایجاد کنید
  • WindowManager از متن پنجره را دریافت کنید
  • WindowMetrics حداکثر منطقه نمایشگر را در دسترس برنامه دریافت کنید

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics
روشهای مستهلک

روشهای Display getSize() و getMetrics() در سطح API 30 به نفع روش های New WindowManager کاهش یافت.

Android 12 (API سطح 31) روشهای Display getRealSize() و getRealMetrics() را به روز می کند و رفتار خود را به روز می کند تا با رفتار getMaximumWindowMetrics() مطابقت بیشتری داشته باشد.

پیکربندی حالت چند پنجره

اگر برنامه شما Android 7.0 (API سطح 24) یا بالاتر را هدف قرار داده است ، می توانید نحوه و اینکه آیا فعالیت های برنامه شما از حالت چند پنجره پشتیبانی می کند ، پیکربندی کنید. برای کنترل هر دو اندازه و طرح می توانید ویژگی هایی را در مانیفست خود تنظیم کنید. تنظیمات ویژگی یک فعالیت ریشه ای برای کلیه فعالیت های موجود در پشته وظیفه خود اعمال می شود. به عنوان مثال ، اگر فعالیت ریشه دارای android:resizeableActivity="true" ، پس تمام فعالیت های موجود در پشته وظیفه قابل انعطاف است. در برخی از دستگاه های بزرگتر ، مانند Chromebooks ، برنامه شما ممکن است در یک پنجره قابل تنظیم اجرا شود حتی اگر android:resizeableActivity="false" . اگر این برنامه شما را بشکند ، می توانید از فیلترهای موجود در Google Play استفاده کنید تا در دسترس بودن برنامه خود در چنین دستگاه هایی محدود شود.

Android 12 (API سطح 31) به طور پیش فرض به حالت چند پنجره. در صفحه های بزرگ (کلاس اندازه متوسط ​​یا گسترده پنجره) ، همه برنامه ها بدون در نظر گرفتن پیکربندی برنامه در حالت چند پنجره اجرا می شوند. در صفحه های کوچک ، سیستم تنظیمات minWidth ، minHeight و resizeableActivity یک فعالیت را بررسی می کند تا تعیین کند که آیا این فعالیت می تواند در حالت چند پنجره اجرا شود.

resizeableActivity

این ویژگی را در عنصر <activity> angary> یا <application> مانیفست خود تنظیم کنید تا حالت چند پنجره ای را برای سطح 30 و پایین API فعال یا غیرفعال کنید:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

اگر این ویژگی روی true تنظیم شده باشد ، می توان فعالیت را در حالت های اسپلیت صفحه و پنجره های دسک تاپ راه اندازی کرد. اگر این ویژگی روی false تنظیم شده باشد ، فعالیت از حالت چند پنجره پشتیبانی نمی کند. اگر مقدار نادرست باشد ، و کاربر سعی می کند فعالیت را در حالت چند پنجره راه اندازی کند ، این فعالیت تمام صفحه را به خود می گیرد.

اگر برنامه شما API سطح 24 یا بالاتر را هدف قرار دهد ، اما شما مقداری برای این ویژگی مشخص نمی کنید ، مقدار این ویژگی به درستی پیش فرض می کند.

اگر برنامه شما API سطح 31 یا بالاتر را هدف قرار دهد ، این ویژگی در صفحه های کوچک و بزرگ متفاوت است:

  • صفحه های بزرگ (کلاس اندازه پنجره متوسط ​​یا گسترده ): همه برنامه ها از حالت چند پنجره پشتیبانی می کنند. این ویژگی نشان می دهد که آیا می توان یک فعالیت را تغییر اندازه داد. اگر resizeableActivity="false" ، برنامه در صورت لزوم در حالت سازگاری قرار می گیرد تا با نمایش ابعاد مطابقت داشته باشد.
  • صفحه های کوچک (کلاس اندازه پنجره جمع و جور ): اگر resizeableActivity="true" و فعالیت حداقل عرض و حداقل ارتفاع در شرایط چند پنجره باشد ، فعالیت از حالت چند پنجره پشتیبانی می کند. اگر resizeableActivity="false" ، فعالیت بدون در نظر گرفتن حداقل عرض و ارتفاع فعالیت ، از حالت چند پنجره پشتیبانی نمی کند.
supportsPictureInPicture

این ویژگی را در گره <activity> مانیفست خود تنظیم کنید تا نشان دهد که آیا این فعالیت از حالت تصویر در تصویر پشتیبانی می کند یا خیر.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />
configChanges

برای رسیدگی به پیکربندی چند پنجره ، خود را تغییر می دهد ، مانند زمانی که کاربر یک پنجره را تغییر می دهد ، android:configChanges ویژگی را به برنامه خود آشکار <activity> با حداقل مقادیر زیر اضافه کنید:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

پس از افزودن android:configChanges ، فعالیت و قطعات شما به جای از بین رفتن و بازآفرینی ، پاسخ به تماس با onConfigurationChanged() را دریافت می کنند. سپس می توانید نظرات خود را به صورت دستی به روز کنید ، منابع را بارگیری کنید و در صورت لزوم عملیات دیگری را انجام دهید.

<layout>

در Android 7.0 (API سطح 24) و بالاتر ، عنصر <layout> مانیفست از چندین ویژگی پشتیبانی می کند که بر نحوه رفتار یک فعالیت در حالت چند پنجره تأثیر می گذارد:

  • android:defaultHeight ، android:defaultWidth : ارتفاع پیش فرض و عرض فعالیت هنگام راه اندازی در حالت پنجره دسک تاپ.

  • android:gravity : قرار دادن اولیه فعالیت هنگام راه اندازی در حالت پنجره دسک تاپ. برای مقادیر مناسب ، کلاس Gravity را ببینید.

  • android:minHeight ، android:minWidth : حداقل ارتفاع و حداقل عرض برای فعالیت در هر دو حالت پنجره اسپلیت و دسک تاپ. اگر کاربر تقسیم کننده را در حالت اسپلیت صفحه حرکت کند تا یک فعالیت کوچکتر از حداقل مشخص شده باشد ، سیستم فعالیت را به اندازه ای که کاربر درخواست می کند ، تولید می کند.

کد زیر نحوه مشخص کردن اندازه و مکان پیش فرض فعالیت و حداقل اندازه آن را هنگام نمایش فعالیت در حالت پنجره دسک تاپ نشان می دهد:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>
حالت چند پنجره در زمان اجرا

با شروع Android 7.0 ، سیستم برای پشتیبانی از برنامه هایی که می توانند در حالت چند پنجره اجرا شوند ، عملکردی را ارائه می دهد.

ویژگی های غیرفعال در حالت چند پنجره

در حالت چند پنجره ، Android ممکن است ویژگی هایی را که برای فعالیتی که صفحه نمایش دستگاه را با سایر فعالیت ها یا برنامه ها به اشتراک می گذارد ، غیرفعال یا نادیده بگیرد.

علاوه بر این ، برخی از گزینه های سفارشی سازی UI سیستم غیرفعال هستند. به عنوان مثال ، برنامه ها در صورت کار در حالت چند پنجره نمی توانند نوار وضعیت را پنهان کنند ( به کنترل سیستم UI سیستم مراجعه کنید).

این سیستم تغییر در ویژگی android:screenOrientation را نادیده می گیرد.

نمایش داده ها و تماس های حالت چند پنجره

کلاس Activity روشهای زیر را برای پشتیبانی از حالت چند پنجره ارائه می دهد:

  • isInMultiWindowMode() : نشان می دهد که آیا این فعالیت در حالت چند پنجره است یا خیر.

  • isInPictureInPictureMode() : نشان می دهد که آیا این فعالیت در حالت تصویر در تصویر است یا خیر.

  • onMultiWindowModeChanged() : سیستم هر زمان که فعالیت از حالت چند پنجره خارج شود یا از آن خارج شود ، این روش را فراخوانی می کند. اگر فعالیت در حال ورود به حالت چند پنجره باشد ، اگر فعالیت در حال ترک حالت چند پنجره باشد ، سیستم مقدار واقعی را عبور می دهد.

  • onPictureInPictureModeChanged() : سیستم هر زمان که فعالیت از حالت تصویر در تصویر خارج شود یا خارج شود ، این روش را فراخوانی می کند. اگر فعالیت در حال ورود به حالت تصویر یا نادرست باشد ، اگر این فعالیت در حالت تصویر در حالت تصویر قرار بگیرد ، این روش مقدار واقعی را عبور می دهد.

کلاس Fragment نسخه های بسیاری از این روش ها را در معرض دید قرار می دهد. به عنوان مثال ، Fragment.onMultiWindowModeChanged() .

حالت تصویر در تصویر

برای قرار دادن فعالیتی در حالت تصویر در تصویر ، با enterPictureInPictureMode() این روش در صورت عدم پشتیبانی از حالت تصویر در تصویر ، هیچ تاثیری ندارد. برای اطلاعات بیشتر ، به افزودن فیلم ها با استفاده از تصویر-تصویر (PIP) مراجعه کنید.

فعالیت های جدید در حالت چند پنجره

هنگامی که یک فعالیت جدید را آغاز می کنید ، می توانید نشان دهید که در صورت امکان فعالیت جدید باید در مجاورت فعلی نمایش داده شود. از FLAG_ACTIVITY_LAUNCH_ADJACENT استفاده کنید ، که به سیستم می گوید سعی می کند فعالیت جدید را در یک پنجره مجاور ایجاد کند ، بنابراین این دو فعالیت صفحه را به اشتراک می گذارند. این سیستم برای انجام این کار بهترین تلاش را می کند ، اما تضمین نمی شود که اتفاق بیفتد.

اگر دستگاهی در حالت پنجره دسک تاپ قرار دارد و فعالیت جدیدی را راه اندازی می کنید ، می توانید با فراخوانی ActivityOptions.setLaunchBounds() ابعاد و مکان صفحه نمایش جدید را مشخص کنید. اگر دستگاه در حالت چند پنجره نباشد ، این روش تاثیری ندارد.

در سطح API 30 و پایین ، اگر فعالیتی را در یک پشته کار انجام دهید ، فعالیت جایگزین فعالیت روی صفحه می شود و تمام خصوصیات چند پنجره آن را به ارث می برد. اگر می خواهید فعالیت جدید را به عنوان یک پنجره جداگانه در حالت چند پنجره راه اندازی کنید ، باید آن را در یک پشته وظیفه جدید راه اندازی کنید.

Android 12 (API سطح 31) برنامه ها را قادر می سازد تا پنجره کار یک برنامه را در بین چندین فعالیت تقسیم کنند. شما تعیین می کنید که چگونه برنامه شما با ایجاد یک فایل پیکربندی XML یا تماس با JetPack Windowmanager API ، فعالیت های خود را - صفحه نمایش کامل ، کنار هم یا انباشته - نمایش می دهد.

بکشید و رها کنید

کاربران می توانند داده ها را از یک فعالیت به فعالیت دیگر بکشند و در حالی که این دو فعالیت در حال اشتراک گذاری صفحه هستند. (قبل از Android 7.0 ، کاربران فقط می توانند داده ها را در یک فعالیت واحد بکشند و رها کنند.) برای اضافه کردن سریع پشتیبانی از پذیرش محتوای افتاده ، به API DropHelper مراجعه کنید. برای راهنمایی جامع کشیدن و رها کردن ، به Drag and Drop مراجعه کنید.

چند نمونه

هر فعالیت ریشه ای وظیفه خاص خود را دارد که با یک فرآیند جداگانه اجرا می شود و در پنجره خاص خود نمایش داده می شود. برای راه اندازی نمونه جدیدی از برنامه خود در یک پنجره جداگانه ، می توانید فعالیت های جدید را با پرچم FLAG_ACTIVITY_NEW_TASK شروع کنید. می توانید این کار را با برخی از ویژگی های چند پنجره ترکیب کنید تا یک مکان خاص برای پنجره جدید درخواست کنید. به عنوان مثال ، یک برنامه خرید می تواند چندین ویندوز را برای مقایسه محصولات نمایش دهد.

Android 12 (API سطح 31) شما را قادر می سازد تا دو نمونه از یک فعالیت را در کنار هم در همان پنجره کار راه اندازی کنید.

اگر می خواهید به کاربران اجازه دهید نمونه دیگری از برنامه خود را از راه اندازی برنامه یا نوار وظیفه شروع کنند ، اطمینان حاصل کنید که فعالیت پرتاب شما android:resizeableActivity="true" و از حالت پرتاب استفاده نمی کند که از چندین نمونه جلوگیری می کند. به عنوان مثال ، هنگامی که FLAG_ACTIVITY_MULTIPLE_TASK یا singleInstancePerTask تنظیم می شود FLAG_ACTIVITY_NEW_DOCUMENT می توان چندین بار در کارهای مختلف فوری کرد.

چند منظوره را با یک طرح چند پنل اشتباه نکنید ، مانند ارائه لیست لیستی که SlidingPaneLayout استفاده می کند ، که درون یک پنجره واحد اجرا می شود.

توجه داشته باشید که وقتی چندین نمونه در ویندوزهای جداگانه در یک دستگاه تاشو اجرا می شود ، در صورت تغییر وضعیت ممکن است یک یا چند نمونه به پس زمینه ارسال شود. به عنوان مثال ، فرض کنید یک دستگاه آشکار شده است و دارای دو نمونه برنامه در دو ویندوز در هر دو طرف برابر است. در صورت تاشو دستگاه ، یکی از موارد ممکن است به جای تلاش برای جاکردن ویندوز برای هر دو مورد در صفحه کوچکتر ، خاتمه یابد.

تأیید حالت چند پنجره

برنامه شما API سطح 24 یا بالاتر را هدف قرار دهد یا خیر ، باید در صورتی که کاربر سعی کند آن را در حالت چند پنجره بر روی دستگاهی که Android 7.0 یا بالاتر دارد ، آن را راه اندازی کند ، بررسی کنید.

دستگاه های آزمایشی

دستگاه هایی که Android 7.0 (API سطح 24) یا بالاتر از حالت چند پنجره پشتیبانی می کنند.

API سطح 23 یا پایین

هنگامی که کاربران سعی می کنند از برنامه در حالت چند پنجره استفاده کنند ، سیستم به اجبار برنامه را تغییر می دهد مگر اینکه برنامه جهت گیری ثابت را اعلام کند.

اگر برنامه شما جهت گیری ثابت را اعلام نمی کند ، باید برنامه خود را بر روی دستگاهی که Android 7.0 یا بالاتر را اجرا می کند ، راه اندازی کنید و سعی کنید برنامه را در حالت اسپلیت صفحه قرار دهید. تأیید کنید که تجربه کاربر هنگام تغییر مجدد برنامه قابل قبول است.

اگر برنامه جهت گیری ثابت را اعلام کند ، باید سعی کنید برنامه را در حالت چند پنجره قرار دهید. تأیید کنید که هنگام انجام این کار ، برنامه در حالت تمام صفحه باقی می ماند.

سطح API 24 تا 30

اگر برنامه شما سطح API 24 تا 30 را هدف قرار داده و پشتیبانی چند پنجره را غیرفعال نمی کند ، رفتار زیر را تحت هر دو حالت اسپلیت و پنجره های دسک تاپ تأیید کنید:

  • برنامه کامل را راه اندازی کنید ، سپس با فشار طولانی دکمه Recents به حالت چند پنجره بروید. تأیید کنید که برنامه به درستی تغییر می کند.

  • برنامه را مستقیماً در حالت چند پنجره راه اندازی کرده و تأیید کنید که برنامه به درستی راه اندازی می شود. می توانید با فشار دادن دکمه Recents ، یک برنامه را در حالت Multi Window راه اندازی کنید ، سپس با فشار طولانی مدت نوار برنامه خود را فشار داده و آن را به یکی از مناطق برجسته روی صفحه بکشید.

  • با کشیدن تقسیم صفحه ، برنامه خود را در حالت صفحه تقسیم تغییر دهید. تأیید کنید که برنامه بدون تصادف تغییر اندازه می دهد و عناصر UI لازم قابل مشاهده است.

  • اگر حداقل ابعاد را برای برنامه خود مشخص کرده اید ، سعی کنید برنامه را تغییر اندازه دهید تا اندازه پنجره آن از آن ابعاد کوچکتر باشد. تأیید کنید که شما نمی توانید تغییر اندازه برنامه را کوچکتر از حداقل ابعاد مشخص کنید.

  • از طریق تمام آزمایشات ، تأیید کنید که عملکرد برنامه شما قابل قبول است. به عنوان مثال ، تأیید کنید که پس از تغییر اندازه برنامه ، یک تاخیر طولانی برای به روزرسانی UI وجود ندارد.

سطح 31 یا بالاتر API

اگر برنامه شما API سطح 31 یا بالاتر را هدف قرار می دهد و حداقل عرض و حداقل ارتفاع فعالیت اصلی کمتر یا مساوی با ابعاد مربوط به منطقه نمایشگر موجود است ، تمام رفتارهای ذکر شده برای سطح API 24 تا 30 را تأیید کنید.

لیست چک

برای تأیید عملکرد برنامه خود در حالت چند پنجره ، عملیات زیر را امتحان کنید. شما باید این عملیات را در هر دو حالت پنجره اسپلیت و دسک تاپ امتحان کنید ، به جز مواردی که در غیر این صورت ذکر شده است.

  • حالت چند پنجره را وارد کرده و بگذارید.

  • از برنامه خود به برنامه دیگری تغییر دهید و تأیید کنید که برنامه به درستی رفتار می کند در حالی که قابل مشاهده است اما فعال نیست. به عنوان مثال ، اگر برنامه شما در حال پخش ویدیو است ، تأیید کنید که این فیلم همچنان در حالی که کاربر با برنامه دیگری در تعامل است ، پخش می شود.

  • در حالت Split-Screen ، سعی کنید تقسیم کننده صفحه را حرکت دهید تا برنامه خود را بزرگتر و کوچکتر کند. این عملیات را در هر دو طرف و یکی بالاتر از تنظیمات دیگر امتحان کنید. تأیید کنید که برنامه خراب نمی شود ، عملکرد اساسی قابل مشاهده است و عملکرد اندازه گیری خیلی طولانی نمی شود.

  • چندین عمل تغییر اندازه را در پشت سر هم انجام دهید. تأیید کنید که برنامه شما حافظه خراب یا نشت نمی کند. Profiler حافظه Android Studio اطلاعاتی در مورد استفاده از حافظه برنامه شما ارائه می دهد ( به بازرسی از استفاده از حافظه برنامه خود با Profiler حافظه مراجعه کنید).

  • از برنامه خود به طور معمول در تعدادی از تنظیمات مختلف پنجره استفاده کنید و تأیید کنید که برنامه به درستی رفتار می کند. تأیید کنید که متن قابل خواندن است و عناصر UI برای تعامل با آنها خیلی کوچک نیستند.

پشتیبانی چند پنجره غیرفعال

در سطح API 24 تا 30 ، اگر با تنظیم android:resizeableActivity="false" پشتیبانی چند پنجره را غیرفعال کردید ، باید برنامه خود را بر روی دستگاهی که Android 7.0 تا 11 را اجرا می کند راه اندازی کنید و سعی کنید برنامه را در صفحه نمایش اسپلیت و پنجره دسک تاپ قرار دهید حالت ها تأیید کنید که هنگام انجام این کار ، برنامه در حالت تمام صفحه باقی می ماند.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد پشتیبانی چند پنجره در Android ، به:

{٪ کلمه ٪} {٪ EndverBatim ٪}

برای شما توصیه می شود * توجه: هنگامی که JavaScript خاموش است ، متن پیوند نمایش داده می شود * حالت سازگاری دستگاه * پشتیبانی از انعطاف پذیری صفحه بزرگ * تغییر پیکربندی دسته

{٪ کلمه ٪}
{٪ EndverBatim ٪} ،

حالت Multi Window چندین برنامه را قادر می سازد تا یک صفحه را همزمان به اشتراک بگذارند. برنامه ها می توانند در کنار هم یا یکی بالاتر از طرف دیگر (حالت اسپلیت-صفحه) ، یک برنامه در یک پنجره کوچک که برنامه های دیگر (حالت تصویر در تصویر) یا برنامه های جداگانه را در ویندوزهای متحرک و قابل حمل جداگانه (حالت پنجره دسکتاپ) پوشانده است ، قرار دهند. .

شکل 1. نمایش دو برنامه در کنار هم در حالت اسپلیت صفحه.

تجربه کاربر به نسخه Android و نوع دستگاه بستگی دارد:

  • Android 7.0 (API سطح 24) حالت اسپلیت صفحه را در دستگاه های صفحه نمایش کوچک و حالت تصویر در تصویر در دستگاه های انتخابی معرفی کرد.

    • حالت اسپلیت صفحه نمایش را با دو برنامه پر می کند ، و آنها را در کنار هم یا یکی بالاتر از طرف دیگر نشان می دهد. کاربران می توانند تقسیم کننده دو برنامه را جدا کنند تا یک برنامه بزرگتر شود و دیگری کوچکتر.

    • حالت تصویر در تصویر ، کاربران را قادر می سازد ضمن تعامل با یک برنامه دیگر ، پخش ویدیویی را ادامه دهند ( به پشتیبانی تصویر در تصویر مراجعه کنید).

    • حالت پنجره دسکتاپ ، که در آن کاربران می توانند آزادانه هر فعالیت را تغییر اندازه دهند ، توسط تولید کنندگان دستگاه های صفحه نمایش بزرگ فعال می شوند.

      شما می توانید با مشخص کردن حداقل ابعاد مجاز فعالیت خود ، نحوه کنترل برنامه شما را با حالت چند پنجره پیکربندی کنید. همچنین می توانید با تنظیم resizeabableActivity="false" حالت چند پنجره را برای برنامه خود غیرفعال کنید تا اطمینان حاصل شود که سیستم همیشه برنامه شما را به صورت کامل نشان می دهد.

  • Android 8.0 (API سطح 26) حالت تصویر در تصویر را به دستگاه های صفحه نمایش کوچک گسترش می دهد.

  • Android 12 (API سطح 31) رفتار استاندارد حالت چند پنجره را ایجاد می کند.

    • در صفحه های بزرگ (کلاس اندازه متوسط ​​یا گسترده پنجره) ، این پلتفرم بدون در نظر گرفتن پیکربندی برنامه ، از همه برنامه ها در حالت چند پنجره پشتیبانی می کند. اگر resizeableActivity="false" ، برنامه در صورت لزوم در حالت سازگاری قرار می گیرد تا ابعاد نمایش را در خود جای دهد.

    • در صفحه های کوچک (کلاس اندازه پنجره جمع و جور ) ، سیستم minWidth و minHeight یک فعالیت را بررسی می کند تا مشخص کند که آیا این فعالیت می تواند در حالت چند پنجره اجرا شود. اگر resizeableActivity="false" ، بدون در نظر گرفتن حداقل عرض و ارتفاع ، از برنامه در حالت چند پنجره جلوگیری می شود.

حالت تقسیم صفحه

کاربران می توانند با انجام موارد زیر حالت صفحه تقسیم را فعال کنند:

  1. صفحه Recents را باز کنید
  2. یک برنامه را به سمت خود بکشید
  3. نماد برنامه را در نوار عنوان برنامه فشار دهید
  4. گزینه منوی Split Screen را انتخاب کنید
  5. برنامه دیگری را از صفحه Recents انتخاب کنید ، یا صفحه Recents را ببندید و برنامه دیگری را اجرا کنید

کاربران می توانند با کشیدن تقسیم کننده پنجره به لبه صفحه-بالا یا پایین ، چپ یا راست ، از حالت اسپلیت صفحه خارج شوند.

راه اندازی مجاور

اگر برنامه شما نیاز به دسترسی به محتوا از طریق یک هدف دارد ، می توانید از FLAG_ACTIVITY_LAUNCH_ADJACENT برای باز کردن محتوا در یک پنجره اسپلیت صفحه مجاور استفاده کنید.

FLAG_ACTIVITY_LAUNCH_ADJACENT در Android 7.0 (سطح API 24) معرفی شد تا برنامه هایی را که در حالت اسپلیت صفحه اجرا می شوند فعال کنند تا فعالیت ها را در پنجره مجاور راه اندازی کنند.

Android 12L (API سطح 32) و بالاتر تعریف پرچم را گسترش داده اند تا برنامه هایی را که در حال اجرا هستند ، برای فعال کردن حالت صفحه تقسیم شده فعال کرده و سپس فعالیت ها را در پنجره مجاور راه اندازی کنید.

برای راه اندازی یک فعالیت مجاور ، به عنوان مثال FLAG_ACTIVITY_LAUNCH_ADJACENT در رابطه با FLAG_ACTIVITY_NEW_TASK استفاده کنید:

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }
چرخه عمر فعالیت در حالت چند پنجره

حالت چند پنجره چرخه عمر فعالیت را تغییر نمی دهد. However, the resumed state of apps in multiple windows differs on different versions of Android.

Multi-resume

Android 10 (API level 29) and higher versions support multi-resume—all activities remain in the RESUMED state when the device is in multi-window mode. An activity can be paused if a transparent activity is on top of the activity or the activity is not focusable, for example, the activity is in picture-in-picture mode . It's also possible that no activity has focus at a given time, for example, if the notification drawer is open. The onStop() method works as usual: the method is called any time an activity is taken off the screen.

Multi-resume is also available on select devices running Android 9 (API level 28). To opt in to multi-resume on Android 9 devices, add the following manifest metadata:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

To verify that a given device supports this manifest metadata, refer to the device specifications.

اندروید 9

In multi-window mode on Android 9 (API level 28) and lower, only the activity the user has most recently interacted with is active at a given time. This activity is considered topmost , and is the only activity in the RESUMED state. همه فعالیت های قابل مشاهده دیگر STARTED اند اما RESUMED نمی شوند. However, the system gives these visible but not resumed activities higher priority than activities that are not visible. If the user interacts with one of the visible activities, that activity is resumed, and the previously topmost activity enters the STARTED state.

When there are multiple activities within a single active app process, the activity with the highest z-order is resumed, and the others are paused.

Configuration changes

When the user puts an app into multi-window mode, the system notifies the activity of a configuration change as specified in Handle configuration changes . This also happens when the user resizes the app or puts the app back into full screen mode.

Essentially, this change has the same activity lifecycle implications as when the system notifies the app that the device has switched from portrait to landscape orientation, except that the app dimensions are changed instead of just being swapped. Your activity can handle the configuration change itself, or your app can allow the system to destroy the activity and recreate it with the new dimensions.

If the user is resizing a window and makes it larger in either dimension, the system resizes the activity to match the user action and issues configuration changes as needed. If the app lags behind in drawing in newly exposed areas, the system temporarily fills those areas with the color specified by the windowBackground attribute or by the default windowBackgroundFallback style attribute.

Exclusive resource access

To help support the multi-resume feature, use the onTopResumedActivityChanged() lifecycle callback.

The callback is invoked when an activity gains or loses the top resumed activity position, which is important when an activity uses a shared singleton resource, such as the microphone or camera:

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

Note that an app can lose resources for other reasons, such as removal of a shared piece of hardware.

In any case, an app should gracefully handle events and state changes that affect available resources.

For apps that use a camera, CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() provides a hint that it might be a good time to try to get access to the camera. This method is available as of Android 10 (API level 29).

Remember that resizeableActivity=false is not a guarantee of exclusive camera access, since other apps that use the camera can be opened on other displays.

Figure 2. Camera in multi-window mode.

Your app does not necessary have to release the camera when the app loses focus. For example, you might want to continue camera preview while the user interacts with the newly focused topmost resumed app. It's fine for your app to keep running the camera when it's not the topmost resumed app, but it has to handle the disconnect case properly. When the topmost resumed app wants to use the camera, it can open it, and your app will lose access. Your app can reopen the camera when the app gets the focus back.

After an app receives a CameraDevice.StateCallback#onDisconnected() callback, subsequent calls on the camera device will throw a CameraAccessException .

چند نمایشگر

Android 10 (API level 29) supports activities on secondary displays. If an activity is running on a device with multiple displays, users can move the activity from one display to another. Multi-resume applies to multi-screen scenarios as well; several activities can receive user input at the same time.

An app can specify which display it should run on when it launches or when it creates another activity. This behavior depends on the activity launch mode defined in the manifest file and on the intent flags and options set by the entity launching the activity. See the ActivityOptions class for more details.

When an activity moves to a secondary display, it can go through a context update, window resizing, and configuration and resource changes. If the activity handles the configuration change, the activity is notified in onConfigurationChanged() ; otherwise, the activity is relaunched.

An activity should check the current display in onCreate() and onConfigurationChanged() if handling the configuration change. Make sure to update the resources and layouts when the display changes.

If the selected launch mode for an activity allows multiple instances, launching on a secondary screen can create a new instance of the activity. Both activities are resumed at the same time.

Figure 3. Multiple instances of an activity on multiple displays.

You may also want to read about the multi-display APIs that were introduced in Android 8.0.

Activity vs application context

Using the right context is crucial in multi-display. When accessing resources, the activity context (which is displayed) is different from the application context (which is not).

The activity context contains information about the display and is always adjusted for the display area in which the activity appears. This enables you to get the correct information about the display density or window metrics of your app. You should always be using the activity context (or another UI-based context) to get information about the current window or display. This also affects some system APIs that use information from the context (for example, see Toasts overview ).

The activity window configuration and parent display define resources and context. Get the current display as follows:

val activityDisplay = activity.getDisplay()

Get the current activity window metrics:

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Get the maximum window metrics for the current system configuration:

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

The maximum window metrics are for making calculations, layout choices, or determining the size of resources to fetch ahead of time. Having this available in onCreate() enables you to make these decisions before the first layout pass. These metrics shouldn't be used for laying out specific view elements; instead use information from the Configuration object.

Display cutouts

Foldable devices might have different cutout geometry when folded and unfolded. To avoid cutout issues, see Support display cutouts .

Secondary displays

You can get the available displays from the DisplayManager system service:

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Use the Display class to get information about a particular display, such as the display size or flags that indicate whether a display is secure. However, don't assume that the display size is going to be the same as the display area allocated to your application. Remember that in multi-window mode, your application occupies a portion of the display.

Determine whether an activity can launch on a display:

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Then launch the activity on the display:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())
Multi-display support

Android provides multi-display support for software keyboards, wallpapers, and launchers.

Software keyboard

A keyboard can be shown on a secondary screen if the display is configured to support system decorations. The input method editor automatically appears if a text field requests input on that display.

Figure 4. Keyboard on a secondary display.
کاغذ دیواری

In Android 10 (API level 29), secondary screens can have wallpaper. The framework creates a separate instance of WallpaperService.Engine for each display. Make sure the surface of each engine is drawn independently. Developers can load assets using the display context in WallpaperService.Engine#getDisplayContext() . Also, make sure your WallpaperInfo.xml file sets android:supportsMultipleDisplays="true" .

Figure 5. Wallpaper on phone and secondary display.
پرتاب کننده ها

A new intent filter category, SECONDARY_HOME , provides a dedicated activity for secondary screens. Instances of the activity are used on all displays that support system decorations, one per each display.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

The activity must have a launch mode that does not prevent multiple instances and that can adapt to different screen sizes. The launch mode cannot be singleInstance or singleTask .

For example, the AOSP implementation of Launcher3 supports a SECONDARY_HOME activity.

Figure 6. Material Design launcher on a phone.
Figure 7. Material Design launcher on a secondary display.
Window metrics

Android 11 (API level 30) introduced the following WindowManager methods to provide the bounds of apps running in multi-window mode:

The Jetpack WindowManager library methods computeCurrentWindowMetrics() and computeMaximumWindowMetrics() offer similar functionality respectively, but with backward compatibility to API level 14.

To obtain metrics for displays other than the current display, do the following (as shown in the code snippet):

  • Create a display context
  • Create a window context for the display
  • Get the WindowManager of the window context
  • Get the WindowMetrics of the maximum display area available to the app

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics
Deprecated methods

Display methods getSize() and getMetrics() were deprecated in API level 30 in favor of the new WindowManager methods.

Android 12 (API level 31) deprecates Display methods getRealSize() and getRealMetrics() and updates their behavior to more closely match the behavior of getMaximumWindowMetrics() .

Multi-window mode configuration

If your app targets Android 7.0 (API level 24) or higher, you can configure how and whether your app's activities support multi-window mode. You can set attributes in your manifest to control both size and layout. A root activity's attribute settings apply to all activities within its task stack. For example, if the root activity has android:resizeableActivity="true" , then all activities in the task stack are resizable. On some larger devices, such as Chromebooks, your app might run in a resizable window even if you specify android:resizeableActivity="false" . If this breaks your app, you can use filters on Google Play to restrict your app's availability on such devices.

Android 12 (API level 31) defaults to multi-window mode. On large screens ( medium or expanded window size class), all apps run in multi-window mode regardless of app configuration. On small screens, the system checks an activity's minWidth , minHeight , and resizeableActivity settings to determine whether the activity can run in multi-window mode.

resizeableActivity

Set this attribute in your manifest's <activity> or <application> element to enable or disable multi-window mode for API level 30 and lower:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

If this attribute is set to true , the activity can be launched in split-screen and desktop windowing modes. If the attribute is set to false , the activity does not support multi-window mode. If the value is false, and the user attempts to launch the activity in multi-window mode, the activity takes over the full screen.

If your app targets API level 24 or higher, but you don't specify a value for this attribute, the attribute's value defaults to true.

If your app targets API level 31 or higher, this attribute works differently on small and large screens:

  • Large screens ( medium or expanded window size class): All apps support multi-window mode. The attribute indicates whether an activity can be resized. If resizeableActivity="false" , the app is put into compatibility mode when necessary to conform to display dimensions.
  • Small screens ( compact window size class): If resizeableActivity="true" and activity minimum width and minimum height are within the multi-window requirements, the activity supports multi-window mode. If resizeableActivity="false" , the activity does not support multi-window mode regardless of activity minimum width and height.
supportsPictureInPicture

Set this attribute in your manifest's <activity> node to indicate whether the activity supports picture-in-picture mode.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />
configChanges

To handle multi-window configuration changes yourself, such as when a user resizes a window, add the android:configChanges attribute to your app manifest <activity> node with at least the following values:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

After adding android:configChanges , your activity and fragments receive a callback to onConfigurationChanged() instead of being destroyed and recreated. You can then manually update your views, reload resources, and perform other operations as needed.

<layout>

On Android 7.0 (API level 24) and higher, the <layout> manifest element supports several attributes that affect how an activity behaves in multi-window mode:

  • android:defaultHeight , android:defaultWidth : Default height and width of the activity when launched in desktop windowing mode.

  • android:gravity : Initial placement of the activity when launched in desktop windowing mode. See the Gravity class for suitable values.

  • android:minHeight , android:minWidth : Minimum height and minimum width for the activity in both split-screen and desktop windowing modes. If the user moves the divider in split-screen mode to make an activity smaller than the specified minimum, the system crops the activity to the size the user requests.

The following code shows how to specify an activity's default size and location and its minimum size when the activity is displayed in desktop windowing mode:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>
Multi-window mode at runtime

Beginning with Android 7.0, the system offers functionality to support apps that can run in multi-window mode.

Disabled features in multi-window mode

In multi-window mode, Android might disable or ignore features that don't apply to an activity that is sharing the device screen with other activities or apps.

Additionally, some system UI customization options are disabled. For example, apps cannot hide the status bar if they are running in multi-window mode (see Control the system UI visibility ).

The system ignores changes to the android:screenOrientation attribute.

Multi-window mode queries and callbacks

The Activity class offers the following methods to support multi-window mode:

  • isInMultiWindowMode() : Indicates whether the activity is in multi-window mode.

  • isInPictureInPictureMode() : Indicates whether the activity is in picture-in-picture mode.

  • onMultiWindowModeChanged() : The system calls this method whenever the activity goes into or out of multi-window mode. The system passes the method a value of true if the activity is entering multi-window mode or false if the activity is leaving multi-window mode.

  • onPictureInPictureModeChanged() : The system calls this method whenever the activity goes into or out of picture-in-picture mode. The system passes the method a value of true if the activity is entering picture-in-picture mode or false if the activity is leaving picture-in-picture mode.

The Fragment class exposes versions of many of these methods; for example, Fragment.onMultiWindowModeChanged() .

Picture-in-picture mode

To put an activity in picture-in-picture mode, call enterPictureInPictureMode() This method has no effect if the device does not support picture-in-picture mode. For more information, see Add videos using picture-in-picture (PiP) .

New activities in multi-window mode

When you launch a new activity, you can indicate that the new activity should be displayed adjacent to the current one if possible. Use the intent flag FLAG_ACTIVITY_LAUNCH_ADJACENT , which tells the system to try to create the new activity in an adjacent window, so the two activities share the screen. The system makes a best effort to do this, but it is not guaranteed to happen.

If a device is in desktop windowing mode and you are launching a new activity, you can specify the new activity's dimensions and screen location by calling ActivityOptions.setLaunchBounds() . The method has no effect if the device is not in multi-window mode.

On API level 30 and lower, if you launch an activity within a task stack, the activity replaces the activity on the screen, inheriting all of its multi-window properties. If you want to launch the new activity as a separate window in multi-window mode, you must launch it in a new task stack.

Android 12 (API level 31) enables apps to split an application's task window among multiple activities. You determine how your app displays its activities—full screen, side by side, or stacked—by creating an XML configuration file or making Jetpack WindowManager API calls.

بکشید و رها کنید

Users can drag and drop data from one activity to another while the two activities are sharing the screen. (Prior to Android 7.0, users could only drag and drop data within a single activity.) To quickly add support for accepting dropped content see the DropHelper API. For comprehensive drag-and-drop guidance, see Enable drag and drop .

چند نمونه

Each root activity has its own task, which runs on a separate process and is displayed in its own window. To launch a new instance of your app in a separate window, you can start new activities with the FLAG_ACTIVITY_NEW_TASK flag. You can combine this with some of the multi-window attributes to request a specific location for the new window. For example, a shopping app can display multiple windows to compare products.

Android 12 (API level 31) enables you to launch two instances of an activity side by side in the same task window.

If you want to allow users to start another instance of your application from the application launcher or the taskbar, make sure that your launcher Activity sets android:resizeableActivity="true" and does not use a launch mode that prevents multiple instances. For example a singleInstancePerTask activity can be instantiated multiple times in different tasks when FLAG_ACTIVITY_MULTIPLE_TASK or FLAG_ACTIVITY_NEW_DOCUMENT is set.

Don't confuse multi-instance with a multi-panel layout, such as a list-detail presentation that uses SlidingPaneLayout , which runs inside a single window.

Note that when multiple instances are running in separate windows on a foldable device, one or more instances might be sent to the background if the posture changes. For example, assume a device is unfolded and has two app instances running in two windows on either side of the fold. If the device is folded, one of the instances might be terminated instead of trying to fit the windows for both instances on a smaller screen.

Multi-window mode verification

Whether or not your app targets API level 24 or higher, you should verify how it behaves in multi-window mode in case a user tries to launch it in multi-window mode on a device running Android 7.0 or higher.

Test devices

Devices that run Android 7.0 (API level 24) or higher support multi-window mode.

API level 23 or lower

When users attempt to use the app in multi-window mode, the system forcibly resizes the app unless the app declares a fixed orientation.

If your app does not declare a fixed orientation, you should launch your app on a device running Android 7.0 or higher and attempt to put the app in split-screen mode. Verify that the user experience is acceptable when the app is forcibly resized.

If the app declares a fixed orientation, you should attempt to put the app in multi-window mode. Verify that when you do so, the app remains in full screen mode.

API levels 24 through 30

If your app targets API levels 24 through 30 and does not disable multi-window support, verify the following behavior under both split-screen and desktop windowing modes:

  • Launch the app full screen, then switch to multi-window mode by long-pressing the Recents button. Verify that the app switches properly.

  • Launch the app directly in multi-window mode and verify that the app launches properly. You can launch an app in multi-window mode by pressing the Recents button, then long-pressing the title bar of your app and dragging it to one of the highlighted areas on the screen.

  • Resize your app in split-screen mode by dragging the screen divider. Verify that the app resizes without crashing and that necessary UI elements are visible.

  • If you have specified minimum dimensions for your app, attempt to resize the app so that its window size is smaller than those dimensions. Verify that you can't resize the app to be smaller than the specified minimum dimensions.

  • Through all tests, verify that your app's performance is acceptable. For example, verify that there is not too long a lag to update the UI after the app is resized.

API level 31 or higher

If your app targets API level 31 or higher and the main activity's minimum width and minimum height are less than or equal to the respective dimensions of the available display area, verify all the behaviors listed for API levels 24 through 30 .

Test checklist

To verify your app's performance in multi-window mode, try the following operations. You should try these operations in both split-screen and desktop windowing mode, except where otherwise noted.

  • Enter and leave multi-window mode.

  • Switch from your app to another app, and verify that the app behaves properly while it is visible but not active. For example, if your app is playing video, verify that the video continues to play while the user is interacting with another app.

  • In split-screen mode, try moving the screen divider to make your app both larger and smaller. Try these operations in both side by side and one above the other configurations. Verify that the app does not crash, essential functionality is visible, and the resize operation doesn't take too long.

  • Perform several resize operations in rapid succession. Verify that your app doesn't crash or leak memory. Android Studio's Memory Profiler provides information about your app's memory usage (see Inspect your app's memory usage with Memory Profiler ).

  • Use your app normally in a number of different window configurations, and verify that the app behaves properly. Verify that text is readable and that UI elements aren't too small to interact with.

Multi-window support disabled

On API levels 24 through 30, if you disabled multi-window support by setting android:resizeableActivity="false" , you should launch your app on a device running Android 7.0 through 11 and attempt to put the app in split-screen and desktop windowing حالت ها Verify that when you do so, the app remains in full-screen mode.

منابع اضافی

For further information about multi-window support in Android, see:

{% verbatim %} {% endverbatim %}

Recommended for you * Note: link text is displayed when JavaScript is off * Device compatibility mode * Support large screen resizability * Handle configuration changes

{% verbatim %}
{% endverbatim %} ,

Multi-window mode enables multiple apps to share the same screen simultaneously. Apps can be side by side or one above the other (split-screen mode), one app in a small window overlaying other apps (picture-in-picture mode), or individual apps in separate movable, resizable windows (desktop windowing mode) .

Figure 1. Display two apps side by side in split-screen mode.

The user experience depends on the version of Android and type of device:

  • Android 7.0 (API level 24) introduced split-screen mode on small screen devices and picture-in-picture mode on select devices.

    • Split-screen mode fills the screen with two apps, showing them either side by side or one above the other. Users can drag the divider separating the two apps to make one app larger and the other smaller.

    • Picture-in-picture mode enables users to continue video playback while interacting with another app (see Picture-in-picture support ).

    • Desktop windowing mode , in which users can freely resize each activity, can be enabled by manufacturers of large screen devices.

      You can configure how your app handles multi-window mode by specifying your activity's minimum allowable dimensions. You can also disable multi-window mode for your app by setting resizeabableActivity="false" to ensure the system always shows your app full screen.

  • Android 8.0 (API level 26) extends picture-in-picture mode to small screen devices.

  • Android 12 (API level 31) makes multi-window mode standard behavior.

    • On large screens ( medium or expanded window size class), the platform supports all apps in multi-window mode regardless of app configuration. If resizeableActivity="false" , the app is put into compatibility mode when necessary to accommodate display dimensions.

    • On small screens ( compact window size class), the system checks an activity's minWidth and minHeight to determine whether the activity can run in multi-window mode. If resizeableActivity="false" , the app is prevented from running in multi-window mode regardless of minimum width and height.

حالت تقسیم صفحه

Users can activate split-screen mode by doing the following:

  1. Open the Recents screen
  2. Swipe an app into view
  3. Press the app icon in the app title bar
  4. Select the split screen menu option
  5. Select another app from the Recents screen, or close the Recents screen and run another app

Users can exit split-screen mode by dragging the window divider to the edge of the screen—up or down, left or right.

Launch adjacent

If your app needs to access content through an intent, you can use FLAG_ACTIVITY_LAUNCH_ADJACENT to open the content in an adjacent split-screen window.

FLAG_ACTIVITY_LAUNCH_ADJACENT was introduced in Android 7.0 (API level 24) to enable apps running in split-screen mode to launch activities in the adjacent window.

Android 12L (API level 32) and higher have extended the flag's definition to enable apps running full screen to activate split-screen mode and then launch activities in the adjacent window.

To launch an adjacent activity, use FLAG_ACTIVITY_LAUNCH_ADJACENT in conjunction with FLAG_ACTIVITY_NEW_TASK , for example:

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }
Activity lifecycle in multi-window mode

Multi-window mode does not change the activity lifecycle . However, the resumed state of apps in multiple windows differs on different versions of Android.

Multi-resume

Android 10 (API level 29) and higher versions support multi-resume—all activities remain in the RESUMED state when the device is in multi-window mode. An activity can be paused if a transparent activity is on top of the activity or the activity is not focusable, for example, the activity is in picture-in-picture mode . It's also possible that no activity has focus at a given time, for example, if the notification drawer is open. The onStop() method works as usual: the method is called any time an activity is taken off the screen.

Multi-resume is also available on select devices running Android 9 (API level 28). To opt in to multi-resume on Android 9 devices, add the following manifest metadata:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

To verify that a given device supports this manifest metadata, refer to the device specifications.

اندروید 9

In multi-window mode on Android 9 (API level 28) and lower, only the activity the user has most recently interacted with is active at a given time. This activity is considered topmost , and is the only activity in the RESUMED state. همه فعالیت های قابل مشاهده دیگر STARTED اند اما RESUMED نمی شوند. However, the system gives these visible but not resumed activities higher priority than activities that are not visible. If the user interacts with one of the visible activities, that activity is resumed, and the previously topmost activity enters the STARTED state.

When there are multiple activities within a single active app process, the activity with the highest z-order is resumed, and the others are paused.

Configuration changes

When the user puts an app into multi-window mode, the system notifies the activity of a configuration change as specified in Handle configuration changes . This also happens when the user resizes the app or puts the app back into full screen mode.

Essentially, this change has the same activity lifecycle implications as when the system notifies the app that the device has switched from portrait to landscape orientation, except that the app dimensions are changed instead of just being swapped. Your activity can handle the configuration change itself, or your app can allow the system to destroy the activity and recreate it with the new dimensions.

If the user is resizing a window and makes it larger in either dimension, the system resizes the activity to match the user action and issues configuration changes as needed. If the app lags behind in drawing in newly exposed areas, the system temporarily fills those areas with the color specified by the windowBackground attribute or by the default windowBackgroundFallback style attribute.

Exclusive resource access

To help support the multi-resume feature, use the onTopResumedActivityChanged() lifecycle callback.

The callback is invoked when an activity gains or loses the top resumed activity position, which is important when an activity uses a shared singleton resource, such as the microphone or camera:

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

Note that an app can lose resources for other reasons, such as removal of a shared piece of hardware.

In any case, an app should gracefully handle events and state changes that affect available resources.

For apps that use a camera, CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() provides a hint that it might be a good time to try to get access to the camera. This method is available as of Android 10 (API level 29).

Remember that resizeableActivity=false is not a guarantee of exclusive camera access, since other apps that use the camera can be opened on other displays.

Figure 2. Camera in multi-window mode.

Your app does not necessary have to release the camera when the app loses focus. For example, you might want to continue camera preview while the user interacts with the newly focused topmost resumed app. It's fine for your app to keep running the camera when it's not the topmost resumed app, but it has to handle the disconnect case properly. When the topmost resumed app wants to use the camera, it can open it, and your app will lose access. Your app can reopen the camera when the app gets the focus back.

After an app receives a CameraDevice.StateCallback#onDisconnected() callback, subsequent calls on the camera device will throw a CameraAccessException .

چند نمایشگر

Android 10 (API level 29) supports activities on secondary displays. If an activity is running on a device with multiple displays, users can move the activity from one display to another. Multi-resume applies to multi-screen scenarios as well; several activities can receive user input at the same time.

An app can specify which display it should run on when it launches or when it creates another activity. This behavior depends on the activity launch mode defined in the manifest file and on the intent flags and options set by the entity launching the activity. See the ActivityOptions class for more details.

When an activity moves to a secondary display, it can go through a context update, window resizing, and configuration and resource changes. If the activity handles the configuration change, the activity is notified in onConfigurationChanged() ; otherwise, the activity is relaunched.

An activity should check the current display in onCreate() and onConfigurationChanged() if handling the configuration change. Make sure to update the resources and layouts when the display changes.

If the selected launch mode for an activity allows multiple instances, launching on a secondary screen can create a new instance of the activity. Both activities are resumed at the same time.

Figure 3. Multiple instances of an activity on multiple displays.

You may also want to read about the multi-display APIs that were introduced in Android 8.0.

Activity vs application context

Using the right context is crucial in multi-display. When accessing resources, the activity context (which is displayed) is different from the application context (which is not).

The activity context contains information about the display and is always adjusted for the display area in which the activity appears. This enables you to get the correct information about the display density or window metrics of your app. You should always be using the activity context (or another UI-based context) to get information about the current window or display. This also affects some system APIs that use information from the context (for example, see Toasts overview ).

The activity window configuration and parent display define resources and context. Get the current display as follows:

val activityDisplay = activity.getDisplay()

Get the current activity window metrics:

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Get the maximum window metrics for the current system configuration:

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

The maximum window metrics are for making calculations, layout choices, or determining the size of resources to fetch ahead of time. Having this available in onCreate() enables you to make these decisions before the first layout pass. These metrics shouldn't be used for laying out specific view elements; instead use information from the Configuration object.

Display cutouts

Foldable devices might have different cutout geometry when folded and unfolded. To avoid cutout issues, see Support display cutouts .

Secondary displays

You can get the available displays from the DisplayManager system service:

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Use the Display class to get information about a particular display, such as the display size or flags that indicate whether a display is secure. However, don't assume that the display size is going to be the same as the display area allocated to your application. Remember that in multi-window mode, your application occupies a portion of the display.

Determine whether an activity can launch on a display:

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Then launch the activity on the display:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())
Multi-display support

Android provides multi-display support for software keyboards, wallpapers, and launchers.

Software keyboard

A keyboard can be shown on a secondary screen if the display is configured to support system decorations. The input method editor automatically appears if a text field requests input on that display.

Figure 4. Keyboard on a secondary display.
کاغذ دیواری

In Android 10 (API level 29), secondary screens can have wallpaper. The framework creates a separate instance of WallpaperService.Engine for each display. Make sure the surface of each engine is drawn independently. Developers can load assets using the display context in WallpaperService.Engine#getDisplayContext() . Also, make sure your WallpaperInfo.xml file sets android:supportsMultipleDisplays="true" .

Figure 5. Wallpaper on phone and secondary display.
پرتاب کننده ها

A new intent filter category, SECONDARY_HOME , provides a dedicated activity for secondary screens. Instances of the activity are used on all displays that support system decorations, one per each display.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

The activity must have a launch mode that does not prevent multiple instances and that can adapt to different screen sizes. The launch mode cannot be singleInstance or singleTask .

For example, the AOSP implementation of Launcher3 supports a SECONDARY_HOME activity.

Figure 6. Material Design launcher on a phone.
Figure 7. Material Design launcher on a secondary display.
Window metrics

Android 11 (API level 30) introduced the following WindowManager methods to provide the bounds of apps running in multi-window mode:

The Jetpack WindowManager library methods computeCurrentWindowMetrics() and computeMaximumWindowMetrics() offer similar functionality respectively, but with backward compatibility to API level 14.

To obtain metrics for displays other than the current display, do the following (as shown in the code snippet):

  • Create a display context
  • Create a window context for the display
  • Get the WindowManager of the window context
  • Get the WindowMetrics of the maximum display area available to the app

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics
Deprecated methods

Display methods getSize() and getMetrics() were deprecated in API level 30 in favor of the new WindowManager methods.

Android 12 (API level 31) deprecates Display methods getRealSize() and getRealMetrics() and updates their behavior to more closely match the behavior of getMaximumWindowMetrics() .

Multi-window mode configuration

If your app targets Android 7.0 (API level 24) or higher, you can configure how and whether your app's activities support multi-window mode. You can set attributes in your manifest to control both size and layout. A root activity's attribute settings apply to all activities within its task stack. For example, if the root activity has android:resizeableActivity="true" , then all activities in the task stack are resizable. On some larger devices, such as Chromebooks, your app might run in a resizable window even if you specify android:resizeableActivity="false" . If this breaks your app, you can use filters on Google Play to restrict your app's availability on such devices.

Android 12 (API level 31) defaults to multi-window mode. On large screens ( medium or expanded window size class), all apps run in multi-window mode regardless of app configuration. On small screens, the system checks an activity's minWidth , minHeight , and resizeableActivity settings to determine whether the activity can run in multi-window mode.

resizeableActivity

Set this attribute in your manifest's <activity> or <application> element to enable or disable multi-window mode for API level 30 and lower:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

If this attribute is set to true , the activity can be launched in split-screen and desktop windowing modes. If the attribute is set to false , the activity does not support multi-window mode. If the value is false, and the user attempts to launch the activity in multi-window mode, the activity takes over the full screen.

If your app targets API level 24 or higher, but you don't specify a value for this attribute, the attribute's value defaults to true.

If your app targets API level 31 or higher, this attribute works differently on small and large screens:

  • Large screens ( medium or expanded window size class): All apps support multi-window mode. The attribute indicates whether an activity can be resized. If resizeableActivity="false" , the app is put into compatibility mode when necessary to conform to display dimensions.
  • Small screens ( compact window size class): If resizeableActivity="true" and activity minimum width and minimum height are within the multi-window requirements, the activity supports multi-window mode. If resizeableActivity="false" , the activity does not support multi-window mode regardless of activity minimum width and height.
supportsPictureInPicture

Set this attribute in your manifest's <activity> node to indicate whether the activity supports picture-in-picture mode.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />
configChanges

To handle multi-window configuration changes yourself, such as when a user resizes a window, add the android:configChanges attribute to your app manifest <activity> node with at least the following values:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

After adding android:configChanges , your activity and fragments receive a callback to onConfigurationChanged() instead of being destroyed and recreated. You can then manually update your views, reload resources, and perform other operations as needed.

<layout>

On Android 7.0 (API level 24) and higher, the <layout> manifest element supports several attributes that affect how an activity behaves in multi-window mode:

  • android:defaultHeight , android:defaultWidth : Default height and width of the activity when launched in desktop windowing mode.

  • android:gravity : Initial placement of the activity when launched in desktop windowing mode. See the Gravity class for suitable values.

  • android:minHeight , android:minWidth : Minimum height and minimum width for the activity in both split-screen and desktop windowing modes. If the user moves the divider in split-screen mode to make an activity smaller than the specified minimum, the system crops the activity to the size the user requests.

The following code shows how to specify an activity's default size and location and its minimum size when the activity is displayed in desktop windowing mode:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>
Multi-window mode at runtime

Beginning with Android 7.0, the system offers functionality to support apps that can run in multi-window mode.

Disabled features in multi-window mode

In multi-window mode, Android might disable or ignore features that don't apply to an activity that is sharing the device screen with other activities or apps.

Additionally, some system UI customization options are disabled. For example, apps cannot hide the status bar if they are running in multi-window mode (see Control the system UI visibility ).

The system ignores changes to the android:screenOrientation attribute.

Multi-window mode queries and callbacks

The Activity class offers the following methods to support multi-window mode:

  • isInMultiWindowMode() : Indicates whether the activity is in multi-window mode.

  • isInPictureInPictureMode() : Indicates whether the activity is in picture-in-picture mode.

  • onMultiWindowModeChanged() : The system calls this method whenever the activity goes into or out of multi-window mode. The system passes the method a value of true if the activity is entering multi-window mode or false if the activity is leaving multi-window mode.

  • onPictureInPictureModeChanged() : The system calls this method whenever the activity goes into or out of picture-in-picture mode. The system passes the method a value of true if the activity is entering picture-in-picture mode or false if the activity is leaving picture-in-picture mode.

The Fragment class exposes versions of many of these methods; for example, Fragment.onMultiWindowModeChanged() .

Picture-in-picture mode

To put an activity in picture-in-picture mode, call enterPictureInPictureMode() This method has no effect if the device does not support picture-in-picture mode. For more information, see Add videos using picture-in-picture (PiP) .

New activities in multi-window mode

When you launch a new activity, you can indicate that the new activity should be displayed adjacent to the current one if possible. Use the intent flag FLAG_ACTIVITY_LAUNCH_ADJACENT , which tells the system to try to create the new activity in an adjacent window, so the two activities share the screen. The system makes a best effort to do this, but it is not guaranteed to happen.

If a device is in desktop windowing mode and you are launching a new activity, you can specify the new activity's dimensions and screen location by calling ActivityOptions.setLaunchBounds() . The method has no effect if the device is not in multi-window mode.

On API level 30 and lower, if you launch an activity within a task stack, the activity replaces the activity on the screen, inheriting all of its multi-window properties. If you want to launch the new activity as a separate window in multi-window mode, you must launch it in a new task stack.

Android 12 (API level 31) enables apps to split an application's task window among multiple activities. You determine how your app displays its activities—full screen, side by side, or stacked—by creating an XML configuration file or making Jetpack WindowManager API calls.

بکشید و رها کنید

Users can drag and drop data from one activity to another while the two activities are sharing the screen. (Prior to Android 7.0, users could only drag and drop data within a single activity.) To quickly add support for accepting dropped content see the DropHelper API. For comprehensive drag-and-drop guidance, see Enable drag and drop .

چند نمونه

Each root activity has its own task, which runs on a separate process and is displayed in its own window. To launch a new instance of your app in a separate window, you can start new activities with the FLAG_ACTIVITY_NEW_TASK flag. You can combine this with some of the multi-window attributes to request a specific location for the new window. For example, a shopping app can display multiple windows to compare products.

Android 12 (API level 31) enables you to launch two instances of an activity side by side in the same task window.

If you want to allow users to start another instance of your application from the application launcher or the taskbar, make sure that your launcher Activity sets android:resizeableActivity="true" and does not use a launch mode that prevents multiple instances. For example a singleInstancePerTask activity can be instantiated multiple times in different tasks when FLAG_ACTIVITY_MULTIPLE_TASK or FLAG_ACTIVITY_NEW_DOCUMENT is set.

Don't confuse multi-instance with a multi-panel layout, such as a list-detail presentation that uses SlidingPaneLayout , which runs inside a single window.

Note that when multiple instances are running in separate windows on a foldable device, one or more instances might be sent to the background if the posture changes. For example, assume a device is unfolded and has two app instances running in two windows on either side of the fold. If the device is folded, one of the instances might be terminated instead of trying to fit the windows for both instances on a smaller screen.

Multi-window mode verification

Whether or not your app targets API level 24 or higher, you should verify how it behaves in multi-window mode in case a user tries to launch it in multi-window mode on a device running Android 7.0 or higher.

Test devices

Devices that run Android 7.0 (API level 24) or higher support multi-window mode.

API level 23 or lower

When users attempt to use the app in multi-window mode, the system forcibly resizes the app unless the app declares a fixed orientation.

If your app does not declare a fixed orientation, you should launch your app on a device running Android 7.0 or higher and attempt to put the app in split-screen mode. Verify that the user experience is acceptable when the app is forcibly resized.

If the app declares a fixed orientation, you should attempt to put the app in multi-window mode. Verify that when you do so, the app remains in full screen mode.

API levels 24 through 30

If your app targets API levels 24 through 30 and does not disable multi-window support, verify the following behavior under both split-screen and desktop windowing modes:

  • Launch the app full screen, then switch to multi-window mode by long-pressing the Recents button. Verify that the app switches properly.

  • Launch the app directly in multi-window mode and verify that the app launches properly. You can launch an app in multi-window mode by pressing the Recents button, then long-pressing the title bar of your app and dragging it to one of the highlighted areas on the screen.

  • Resize your app in split-screen mode by dragging the screen divider. Verify that the app resizes without crashing and that necessary UI elements are visible.

  • If you have specified minimum dimensions for your app, attempt to resize the app so that its window size is smaller than those dimensions. Verify that you can't resize the app to be smaller than the specified minimum dimensions.

  • Through all tests, verify that your app's performance is acceptable. For example, verify that there is not too long a lag to update the UI after the app is resized.

API level 31 or higher

If your app targets API level 31 or higher and the main activity's minimum width and minimum height are less than or equal to the respective dimensions of the available display area, verify all the behaviors listed for API levels 24 through 30 .

Test checklist

To verify your app's performance in multi-window mode, try the following operations. You should try these operations in both split-screen and desktop windowing mode, except where otherwise noted.

  • Enter and leave multi-window mode.

  • Switch from your app to another app, and verify that the app behaves properly while it is visible but not active. For example, if your app is playing video, verify that the video continues to play while the user is interacting with another app.

  • In split-screen mode, try moving the screen divider to make your app both larger and smaller. Try these operations in both side by side and one above the other configurations. Verify that the app does not crash, essential functionality is visible, and the resize operation doesn't take too long.

  • Perform several resize operations in rapid succession. Verify that your app doesn't crash or leak memory. Android Studio's Memory Profiler provides information about your app's memory usage (see Inspect your app's memory usage with Memory Profiler ).

  • Use your app normally in a number of different window configurations, and verify that the app behaves properly. Verify that text is readable and that UI elements aren't too small to interact with.

Multi-window support disabled

On API levels 24 through 30, if you disabled multi-window support by setting android:resizeableActivity="false" , you should launch your app on a device running Android 7.0 through 11 and attempt to put the app in split-screen and desktop windowing حالت ها Verify that when you do so, the app remains in full-screen mode.

منابع اضافی

For further information about multi-window support in Android, see:

{% verbatim %} {% endverbatim %}

Recommended for you * Note: link text is displayed when JavaScript is off * Device compatibility mode * Support large screen resizability * Handle configuration changes

{% verbatim %}
{% endverbatim %}