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

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

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

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

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

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

  • اندروید ۷.۰ (سطح API ۲۴) حالت تقسیم صفحه را در دستگاه‌های صفحه نمایش کوچک و حالت تصویر در تصویر را در دستگاه‌های منتخب معرفی کرد.

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

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

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

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

  • اندروید ۸.۰ (سطح API ۲۶) حالت تصویر در تصویر را به دستگاه‌های صفحه نمایش کوچک گسترش می‌دهد.

  • اندروید ۱۲ (سطح API 31) حالت چند پنجره‌ای را به یک رفتار استاندارد تبدیل کرده است.

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

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

  • اندروید ۱۶ (سطح API ۳۶) محدودیت‌های جهت‌گیری صفحه نمایش، نسبت ابعاد و تغییر اندازه را لغو می‌کند.

    • در صفحه نمایش‌های بزرگ (کوچکترین عرض >= 600dp) سیستم، ویژگی‌های مانیفست و APIهای زمان اجرا که برای محدود کردن جهت‌گیری، نسبت ابعاد و قابلیت تغییر اندازه برنامه استفاده می‌شوند را نادیده می‌گیرد و تجربه کاربری را در تمام فرم فکتورهای دستگاه بهینه می‌کند.

      برای یادگیری نحوه‌ی مستثنی کردن بازی‌ها از تغییرات اندروید ۱۶، به بخش استثنائات جهت‌گیری برنامه، نسبت ابعاد و تغییر اندازه مراجعه کنید.

استراتژی‌های اجرایی

حالت چند پنجره‌ای را می‌توان به چندین روش فعال کرد.

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

  1. صفحه موارد اخیر را باز کنید
  2. کشیدن انگشت روی یک برنامه به داخل صفحه نمایش
  3. روی آیکون برنامه در نوار عنوان برنامه کلیک کنید
  4. گزینه منوی تقسیم صفحه را انتخاب کنید
  5. برنامه دیگری را از صفحه برنامه‌های اخیر انتخاب کنید

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

تقسیم صفحه نمایش قابل برنامه‌ریزی (اجرای همزمان)

اگر برنامه شما نیاز دارد که یک اکتیویتی دیگر را در پنجره مجاور اجرا کند، از پرچم اینتنت FLAG_ACTIVITY_LAUNCH_ADJACENT استفاده کنید. در اندروید ۱۲L (سطح API ۳۲) و بالاتر، این پرچم به برنامه‌ای که تمام صفحه اجرا می‌شود اجازه می‌دهد تا وارد حالت تقسیم صفحه شود و یک اکتیویتی هدف را در پنجره مجاور اجرا کند. FLAG_ACTIVITY_LAUNCH_ADJACENT در اندروید ۷.۰ (سطح API ۲۴) معرفی شد.

برای اجرای یک اکتیویتی مجاور، از 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) }
}

تعبیه فعالیت (تقسیم فعالیت‌ها در یک وظیفه)

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

چرخه حیات اکتیویتی در حالت چند پنجره‌ای

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

رزومه چندگانه

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

قابلیت از سرگیری چندگانه (Multi-resume) در دستگاه‌های منتخب دارای اندروید ۹ (سطح API 28) نیز موجود است. برای فعال کردن قابلیت از سرگیری چندگانه در دستگاه‌های اندروید ۹، فراداده‌های مانیفست زیر را اضافه کنید:

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

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

اندروید ۹

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

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

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

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

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

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

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

برای پشتیبانی از ویژگی چند-رزومه‌ای (multi-resume)، از فراخوانی چرخه عمر 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() به ما نشان می‌دهد که شاید زمان مناسبی برای تلاش برای دسترسی به دوربین باشد. این متد از اندروید ۱۰ (سطح API 29) در دسترس است.

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

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

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

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

معیارهای پنجره

اندروید ۱۱ (API سطح ۳۰) متدهای WindowManager زیر را برای ارائه محدوده برنامه‌های در حال اجرا در حالت چند پنجره‌ای معرفی کرد:

  • getCurrentWindowMetrics() یک شیء WindowMetrics را برای وضعیت پنجره‌بندی فعلی سیستم برمی‌گرداند.
  • getMaximumWindowMetrics() ، مقدار WindowMetrics مربوط به بزرگترین حالت پنجره‌بندی بالقوه سیستم را برمی‌گرداند.

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

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

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

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

متدهای منسوخ شده

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

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

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

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

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

resizeableActivity

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

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

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

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

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

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

اگر برنامه شما سطح API 36 یا بالاتر را هدف قرار می‌دهد، این ویژگی در نمایشگرهایی با کوچکترین عرض >= 600dp نادیده گرفته می‌شود. با این حال، برنامه کاملاً به انتخاب کاربر در مورد نسبت ابعاد احترام می‌گذارد ( به لغوهای کاربر در هر برنامه مراجعه کنید).

اگر در حال ساخت یک بازی هستید، برای آشنایی با نحوه‌ی مستثنی کردن بازی خود از تغییرات اندروید ۱۶ (سطح API ۳۶)، به بخش جهت‌گیری برنامه، نسبت ابعاد و قابلیت تغییر اندازه مراجعه کنید.

supportsPictureInPicture

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

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

configChanges

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

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

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

<layout>

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

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

  • android:gravity : محل اولیه‌ی activity هنگام اجرا در حالت پنجره‌ای دسکتاپ. برای مقادیر مناسب به کلاس 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:screenOrientation را نادیده می‌گیرد.

کوئری‌ها و فراخوانی‌های حالت چند پنجره‌ای

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

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

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

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

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

کلاس Fragment نسخه‌هایی از بسیاری از این متدها را ارائه می‌دهد؛ برای مثال، Fragment.onMultiWindowModeChanged() .

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

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

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

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

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

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

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

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

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

چند نمونه‌ای

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

اندروید ۱۲ (سطح API 31) و بالاتر به شما این امکان را می‌دهد که دو نمونه از یک فعالیت را در کنار هم در یک پنجره وظیفه در activity embedding اجرا کنید.

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

در اندروید ۱۵ (سطح API 35) و بالاتر، PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI به شما امکان می‌دهد پشتیبانی از چند نمونه‌ای بودن (multi‑instance) را اعلام کنید. این ویژگی یک سیگنال صریح برای رابط کاربری سیستم است تا کنترل‌ها را در اختیار کاربر قرار دهد تا چندین نمونه از برنامه ایجاد کند. این ویژگی مستقل از حالت راه‌اندازی است، اما فقط باید زمانی استفاده شود که حالت راه‌اندازی برای یک فعالیت یا برنامه با آن ویژگی سازگار باشد، به عنوان مثال، وقتی حالت راه‌اندازی singleInstance نباشد.

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

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

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

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

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

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

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

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

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

سطوح API 24 تا 30

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

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

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

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

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

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

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

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

چک لیست آزمایش

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

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

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

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

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

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

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

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

منابع اضافی

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