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

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

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

برای دستورالعمل‌های کاربر درباره نحوه دسترسی به حالت تقسیم صفحه در تلفن‌ها، به دیدن همزمان دو برنامه در تلفن Pixel بروید.

ویژگی های چند پنجره ای مخصوص نسخه

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

  • اندروید 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 دارد راه اندازی کنید و سعی کنید برنامه را در پنجره تقسیم صفحه و دسکتاپ قرار دهید. حالت ها بررسی کنید که با انجام این کار، برنامه در حالت تمام صفحه باقی بماند.

منابع اضافی

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

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

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

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