يتيح وضع النوافذ المتعددة لتطبيقات متعددة مشاركة الشاشة نفسها في الوقت نفسه. ويمكن عرض التطبيقات جنبًا إلى جنب أو فوق بعضها البعض (وضع تقسيم الشاشة)، أو عرض تطبيق واحد في نافذة صغيرة تظهر فوق التطبيقات الأخرى (وضع "نافذة ضمن النافذة")، أو عرض تطبيقات فردية في نوافذ منفصلة قابلة للنقل وتغيير الحجم (وضع النوافذ على سطح المكتب).
للحصول على تعليمات للمستخدمين حول كيفية الوصول إلى وضع تقسيم الشاشة على الهواتف، انتقِل إلى عرض تطبيقين في الوقت نفسه على هاتف Pixel.
ميزات النوافذ المتعددة الخاصة بالإصدار
تعتمد تجربة المستخدم في النوافذ المتعدّدة على إصدار Android ونوع الجهاز:
قدّم الإصدار Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) ميزة "وضع تقسيم الشاشة" على الأجهزة ذات الشاشات الصغيرة وميزة "نافذة ضمن النافذة" على أجهزة محدّدة.
يملأ وضع تقسيم الشاشة الشاشة بتطبيقَين، ويعرضهما إما جنبًا إلى جنب أو أحدهما فوق الآخر. يمكن للمستخدمين سحب الفاصل بين التطبيقين لتكبير أحدهما وتصغير الآخر.
يتيح وضع "نافذة ضمن النافذة" للمستخدمين مواصلة تشغيل الفيديو أثناء التفاعل مع تطبيق آخر (راجِع التوافق مع ميزة "نافذة ضمن النافذة").
يمكن لمصنّعي الأجهزة ذات الشاشات الكبيرة تفعيل وضع النوافذ على سطح المكتب، الذي يتيح للمستخدمين تغيير حجم كل نشاط بحرية.
يمكنك ضبط طريقة تعامل تطبيقك مع وضع النوافذ المتعددة من خلال تحديد الحد الأدنى المسموح به لأبعاد نشاطك. يمكنك أيضًا إيقاف وضع النوافذ المتعددة لتطبيقك من خلال ضبط
resizeableActivity="false"
لضمان أن يعرض النظام تطبيقك دائمًا في وضع ملء الشاشة.
يتيح الإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) استخدام وضع "نافذة ضمن النافذة" على الأجهزة ذات الشاشات الصغيرة.
يوفّر نظام التشغيل Android 12 (المستوى 31 لواجهة برمجة التطبيقات) وضع النوافذ المتعددة كإعداد تلقائي.
على الشاشات الكبيرة (فئة حجم النافذة متوسطة أو موسّعة)، يتيح النظام الأساسي استخدام جميع التطبيقات في وضع النوافذ المتعددة بغض النظر عن إعدادات التطبيق. إذا كانت القيمة
resizeableActivity="false"
، يتم وضع التطبيق في وضع التوافق عند الضرورة لاستيعاب أبعاد الشاشة.على الشاشات الصغيرة (فئة حجم النافذة مضغوطة)، يتحقّق النظام من
minWidth
وminHeight
في النشاط لتحديد ما إذا كان بإمكان النشاط العمل في وضع النوافذ المتعددة. إذا كانت القيمةresizeableActivity="false"
، سيتم منع التطبيق من التشغيل في وضع النوافذ المتعدّدة بغض النظر عن الحد الأدنى للعرض والارتفاع.
يحلّ Android 16 (المستوى 36 لواجهة برمجة التطبيقات) محل القيود المفروضة على اتجاه الشاشة ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم.
على الشاشات الكبيرة (أصغر عرض ≥ 600 وحدة بكسل مستقلة الكثافة)، يتجاهل النظام سمات ملف البيان وواجهات برمجة التطبيقات في وقت التشغيل المستخدَمة لتقييد اتجاه التطبيق ونسبة العرض إلى الارتفاع وإمكانية تغيير حجمه، ما يؤدي إلى تحسين تجربة المستخدم على جميع أشكال الأجهزة.
للتعرّف على كيفية استبعاد الألعاب من تغييرات Android 16، يمكنك الاطّلاع على استثناءات اتجاه التطبيق ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم.
وضع تقسيم الشاشة
يُفعّل المستخدمون وضع تقسيم الشاشة باتّباع الخطوات التالية:
- افتح شاشة "الأحدث"
- مرِّر سريعًا تطبيقًا ليظهر على الشاشة
- اضغط على رمز التطبيق في شريط عنوان التطبيق
- اختَر خيار قائمة تقسيم الشاشة
- اختَر تطبيقًا آخر من شاشة "التطبيقات الحديثة"، أو أغلق شاشة "التطبيقات الحديثة" وشغِّل تطبيقًا آخر
يخرج المستخدمون من وضع تقسيم الشاشة عن طريق سحب أداة تقسيم النافذة إلى حافة الشاشة، سواء للأعلى أو للأسفل أو لليمين أو لليسار.
التشغيل بجانب بعضهما
إذا كان تطبيقك بحاجة إلى الوصول إلى المحتوى من خلال هدف، يمكنك استخدام
FLAG_ACTIVITY_LAUNCH_ADJACENT
لفتح المحتوى في نافذة مجاورة
في وضع تقسيم الشاشة.
تم طرح FLAG_ACTIVITY_LAUNCH_ADJACENT
في نظام التشغيل Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) بهدف السماح للتطبيقات التي تعمل في وضع تقسيم الشاشة بتشغيل الأنشطة في النافذة المجاورة.
أضاف الإصدار Android 12L (المستوى 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.
استئناف متعدد
يتيح الإصدار Android 10 (المستوى 29 من واجهة برمجة التطبيقات) والإصدارات الأحدث ميزة "استئناف متعدّد"، إذ تظل جميع الأنشطة في الحالة RESUMED
عندما يكون الجهاز في وضع النوافذ المتعددة. يمكن إيقاف نشاط مؤقتًا إذا كان هناك نشاط شفاف فوقه أو إذا كان النشاط غير قابل للتركيز، مثلاً إذا كان النشاط في وضع "نافذة ضمن النافذة". من المحتمل أيضًا ألا يكون هناك أي نشاط مركّز عليه في وقت معيّن، مثلاً إذا كانت لوحة الإشعارات مفتوحة. تعمل طريقة onStop()
كالمعتاد: يتم استدعاء الطريقة في أي وقت تتم فيه إزالة نشاط من الشاشة.
تتوفّر ميزة "استئناف الأنشطة المتعددة" أيضًا على أجهزة محدّدة تعمل بالإصدار Android 9 (المستوى 28 لواجهة برمجة التطبيقات). للسماح بتشغيل تطبيقات متعددة في وقت واحد على أجهزة Android 9، أضِف بيانات وصفية إلى البيان على النحو التالي:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
للتحقّق من أنّ جهازًا معيّنًا يتوافق مع البيانات الوصفية لملف البيان هذا، يُرجى الرجوع إلى مواصفات الجهاز.
Android 9
في وضع النوافذ المتعدّدة على الإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات) والإصدارات الأقدم، لا يكون نشطًا في وقت معيّن سوى النشاط الذي تفاعل معه المستخدم مؤخرًا. يُعد هذا النشاط في المقدّمة، وهو النشاط الوحيد في حالة RESUMED
. جميع الأنشطة الأخرى المرئية هي STARTED
ولكنها ليست RESUMED
.
ومع ذلك، يمنح النظام هذه الأنشطة المرئية ولكن غير المستأنَفة أولوية أعلى من الأنشطة غير المرئية. إذا تفاعل المستخدم مع أحد الأنشطة المرئية، سيتم استئناف هذا النشاط، وسيدخل النشاط الذي كان في المقدّمة سابقًا إلى الحالة STARTED
.
عندما تتعدّد الأنشطة ضمن عملية تطبيق نشِطة واحدة، يتم استئناف النشاط الذي يملك أعلى ترتيب z، ويتم إيقاف الأنشطة الأخرى مؤقتًا.
التغييرات في الإعدادات
عندما يضع المستخدم تطبيقًا في وضع النوافذ المتعددة، يُعلم النظام النشاط بتغيير في الإعدادات كما هو موضّح في التعامل مع تغييرات الإعدادات. ويحدث ذلك أيضًا عندما يغيّر المستخدم حجم التطبيق أو يعيده إلى وضع ملء الشاشة.
في الأساس، يؤدي هذا التغيير إلى الآثار نفسها على مراحل نشاط التطبيق كما يحدث عندما يُعلم النظام التطبيق بأنّ الجهاز قد انتقل من الوضع العمودي إلى الوضع الأفقي، إلا أنّه يتم تغيير أبعاد التطبيق بدلاً من مجرد تبديلها. يمكن أن يتعامل النشاط مع تغيير الإعدادات بنفسه، أو يمكن أن يسمح تطبيقك للنظام بإيقاف النشاط وإعادة إنشائه باستخدام الأبعاد الجديدة.
إذا كان المستخدم يغيّر حجم نافذة ويجعلها أكبر في أي من البُعدين، يعيد النظام تغيير حجم النشاط ليتوافق مع إجراء المستخدم ويصدر تغييرات في الإعدادات حسب الحاجة. إذا تأخّر التطبيق في رسم المناطق التي تم عرضها حديثًا، سيملأ النظام هذه المناطق مؤقتًا باللون المحدّد من خلال السمة 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()
تلميحًا بأنّه قد يكون الوقت مناسبًا لمحاولة الحصول على إذن الوصول إلى الكاميرا.
تتوفّر هذه الطريقة بدءًا من الإصدار Android 10 (المستوى 29 لواجهة برمجة التطبيقات).
يُرجى العِلم أنّ resizeableActivity=false
ليس ضمانًا للوصول الحصري إلى الكاميرا، إذ يمكن فتح تطبيقات أخرى تستخدم الكاميرا على شاشات أخرى.

ليس من الضروري أن يوقف تطبيقك الكاميرا عند فقدان التركيز. على سبيل المثال، قد تحتاج إلى مواصلة عرض معاينة الكاميرا أثناء تفاعل المستخدم مع التطبيق الجديد الذي تم التركيز عليه والذي تم استئنافه في المقدّمة. لا بأس في أن يواصل تطبيقك تشغيل الكاميرا عندما لا يكون التطبيق الذي تم استئنافه في المقدّمة، ولكن عليه التعامل مع حالة قطع الاتصال بشكل صحيح. عندما يريد التطبيق الذي تم استئنافه في أعلى الشاشة استخدام الكاميرا، يمكنه فتحها، وسيتم إيقاف إمكانية وصول تطبيقك إليها. يمكن لتطبيقك إعادة فتح الكاميرا عندما يستعيد التركيز.
بعد أن يتلقّى التطبيق CameraDevice.StateCallback#onDisconnected()
رد اتصال، ستؤدي المكالمات اللاحقة على جهاز الكاميرا إلى ظهور
CameraAccessException
.
مقاييس النافذة
قدّم الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) طُرق WindowManager
التالية
لتوفير حدود التطبيقات التي تعمل في وضع النوافذ المتعدّدة:
-
getCurrentWindowMetrics()
: تعرض عنصرWindowMetrics
يمثّل حالة تقسيم النظام إلى نوافذ الحالية. -
getMaximumWindowMetrics()
: تعرضWindowMetrics
لأكبر حالة محتملة لنظام النوافذ.
توفّر طريقتَا مكتبة Jetpack WindowManager computeCurrentWindowMetrics()
وcomputeMaximumWindowMetrics()
وظائف مشابهة
على التوالي، ولكن مع إمكانية التوافق مع الإصدارات القديمة حتى مستوى واجهة برمجة التطبيقات 14.
للحصول على مقاييس لشاشات عرض غير شاشة العرض الحالية، اتّبِع الخطوات التالية (كما هو موضّح في مقتطف الرمز):
- إنشاء سياق عرض
- إنشاء سياق نافذة للعرض
- الحصول على
WindowManager
سياق النافذة - الحصول على
WindowMetrics
من الحد الأقصى لمساحة العرض المتاحة للتطبيق
val windowMetrics = context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java)
.maximumWindowMetrics
الطُرق المتوقّفة
تم إيقاف الطريقتَين Display
getSize()
وgetMetrics()
نهائيًا في المستوى 30 من واجهة برمجة التطبيقات، وتم استبدالهما بالطريقتَين الجديدتَين WindowManager
.
في الإصدار Android 12 (المستوى 31 لواجهة برمجة التطبيقات)، تم إيقاف الطريقتَين Display
getRealSize()
وgetRealMetrics()
، وتم تعديل سلوكهما ليتوافق بشكل أكبر مع سلوك getMaximumWindowMetrics()
.
إعدادات وضع النوافذ المتعددة
إذا كان تطبيقك يستهدف الإصدار 7.0 من نظام التشغيل Android (المستوى 24 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يمكنك ضبط طريقة دعم أنشطة تطبيقك لوضع النوافذ المتعددة وما إذا كانت هذه الأنشطة تدعم هذا الوضع. يمكنك ضبط سمات في ملف البيان للتحكّم في الحجم والتنسيق. تنطبق إعدادات سمات النشاط الأساسي على جميع الأنشطة ضمن حزمة المهام الخاصة به. على سبيل المثال، إذا كان النشاط الجذر يحتوي على android:resizeableActivity="true"
، يمكن تغيير حجم جميع الأنشطة في حزمة المهام. على بعض الأجهزة الأكبر حجمًا، مثل أجهزة Chromebook، قد يتم تشغيل تطبيقك في نافذة قابلة لتغيير الحجم حتى إذا حدّدت android:resizeableActivity="false"
. إذا كان ذلك يؤدي إلى حدوث مشاكل في تطبيقك، يمكنك استخدام الفلاتر على Google Play لحظر توفُّر تطبيقك على هذه الأجهزة.
يتم تلقائيًا تفعيل وضع النوافذ المتعددة في الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات). على الشاشات الكبيرة
(فئة حجم النافذة متوسطة أو موسّعة)، تعمل جميع التطبيقات في وضع النوافذ المتعددة
بغض النظر عن إعدادات التطبيق. على الشاشات الصغيرة، يتحقّق النظام من إعدادات minWidth
وminHeight
وresizeableActivity
لأي نشاط لتحديد ما إذا كان يمكن تشغيل النشاط في وضع النوافذ المتعددة.
resizeableActivity
اضبط هذه السمة في العنصر <activity>
أو <application>
في ملف البيان لتفعيل وضع النوافذ المتعددة أو إيقافه للمستوى 30 من واجهة برمجة التطبيقات والإصدارات الأقدم:
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
إذا تم ضبط هذه السمة على true
، يمكن تشغيل النشاط في وضعَي تقسيم الشاشة والنوافذ على سطح المكتب. إذا تم ضبط السمة على false
، لن يتوافق النشاط مع وضع النوافذ المتعددة. إذا كانت القيمة false وحاول المستخدم تشغيل النشاط في وضع النوافذ المتعددة، سيشغل النشاط الشاشة بأكملها.
إذا كان تطبيقك يستهدف المستوى 24 أو مستوى أحدث لواجهة برمجة التطبيقات، ولكنّك لم تحدّد قيمة لهذه السمة، سيتم تلقائيًا ضبط قيمة السمة على "صحيح".
إذا كان تطبيقك يستهدف المستوى 31 لواجهة برمجة التطبيقات أو أعلى، تعمل هذه السمة بشكل مختلف على الشاشات الصغيرة والكبيرة:
- الشاشات الكبيرة (فئة حجم النافذة متوسطة أو موسّعة): تتوافق جميع التطبيقات مع وضع النوافذ المتعدّدة. تشير السمة إلى ما إذا كان يمكن تغيير حجم النشاط. إذا كانت القيمة
resizeableActivity="false"
، يتم وضع التطبيق في وضع التوافق عند الضرورة ليتوافق مع أبعاد الشاشة. - الشاشات الصغيرة (فئة حجم النافذة مضغوطة): إذا كان
resizeableActivity="true"
والحد الأدنى لعرض النشاط وارتفاعه يستوفيان متطلبات النوافذ المتعددة، سيتوافق النشاط مع وضع النوافذ المتعددة. إذا كانت القيمةresizeableActivity="false"
، لا يتوافق النشاط مع وضع النوافذ المتعددة بغض النظر عن الحد الأدنى لعرض النشاط وارتفاعه.
إذا كان تطبيقك يستهدف المستوى 36 أو مستوى أحدث لواجهة برمجة التطبيقات، سيتم تجاهل هذه السمة على الشاشات التي يبلغ عرضها الأصغر 600 وحدة بكسل مستقلة عن الكثافة أو أكثر. ومع ذلك، يحترم التطبيق بشكل كامل نسبة العرض إلى الارتفاع التي يختارها المستخدم (راجِع عمليات الإلغاء على مستوى التطبيق).
إذا كنت بصدد إنشاء لعبة، يمكنك الاطّلاع على اتجاه التطبيق ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم للتعرّف على كيفية استبعاد لعبتك من التغييرات التي تم إجراؤها على الإصدار 16 من نظام التشغيل Android (المستوى 36 من واجهة برمجة التطبيقات).
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 (المستوى 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>
وضع النوافذ المتعددة في وقت التشغيل
بدءًا من الإصدار 7.0 من نظام التشغيل Android، يوفّر النظام وظائف لدعم التطبيقات التي يمكن تشغيلها في وضع النوافذ المتعددة.
الميزات غير المتاحة في وضع النوافذ المتعددة
في وضع النوافذ المتعددة، قد يوقف نظام التشغيل Android الميزات التي لا تنطبق على نشاط يشارك شاشة الجهاز مع أنشطة أو تطبيقات أخرى أو يتجاهلها.
بالإضافة إلى ذلك، يتم إيقاف بعض خيارات تخصيص واجهة مستخدم النظام. على سبيل المثال، لا يمكن للتطبيقات إخفاء شريط الحالة إذا كانت تعمل في وضع النوافذ المتعدّدة (راجِع التحكّم في إمكانية ظهور واجهة مستخدم النظام).
يتجاهل النظام التغييرات التي تطرأ على السمة android:screenOrientation
.
طلبات البحث وعمليات الرجوع في وضع النوافذ المتعددة
يوفّر الصف Activity
الطرق التالية لتفعيل وضع النوافذ المتعدّدة:
isInMultiWindowMode()
: يشير إلى ما إذا كان النشاط في وضع النوافذ المتعددة.
isInPictureInPictureMode()
: يشير إلى ما إذا كان النشاط في وضع نافذة ضمن النافذة.
onMultiWindowModeChanged()
: يستدعي النظام هذه الطريقة عندما ينتقل النشاط إلى وضع النوافذ المتعددة أو يخرج منه. يمرِّر النظام إلى الطريقة القيمة true إذا كان النشاط سينتقل إلى وضع النوافذ المتعدّدة، أو القيمة false إذا كان النشاط سيخرج من وضع النوافذ المتعدّدة.
onPictureInPictureModeChanged()
: يستدعي النظام هذه الطريقة عندما ينتقل النشاط إلى وضع "نافذة ضمن النافذة" أو يخرج منه. يُمرِّر النظام إلى الطريقة القيمة "صحيح" إذا كان النشاط سينتقل إلى وضع "نافذة ضمن النافذة"، أو القيمة "خطأ" إذا كان النشاط سيخرج من وضع "نافذة ضمن النافذة".
يعرض الصف Fragment
إصدارات من العديد من هذه الطرق، مثل
Fragment.onMultiWindowModeChanged()
.
وضع "نافذة ضمن النافذة"
لوضع نشاط في وضع "نافذة ضمن النافذة"، استدعِ الدالة
enterPictureInPictureMode()
. لن يكون لهذه الدالة أي تأثير إذا كان الجهاز لا يتيح وضع "نافذة ضمن النافذة". لمزيد من المعلومات، يُرجى الاطّلاع على إضافة فيديوهات باستخدام ميزة "نافذة ضمن النافذة".
الأنشطة الجديدة في وضع النوافذ المتعددة
عند تشغيل نشاط جديد، يمكنك الإشارة إلى أنّه يجب عرض النشاط الجديد بجانب النشاط الحالي إذا كان ذلك ممكنًا. استخدِم علامة الهدف
FLAG_ACTIVITY_LAUNCH_ADJACENT
، التي تطلب من النظام محاولة إنشاء النشاط الجديد في نافذة مجاورة، ما يتيح للنشاطَين مشاركة الشاشة. يبذل النظام قصارى جهده لتحقيق ذلك، ولكن لا يمكن ضمان حدوثه.
إذا كان الجهاز في وضع النوافذ على سطح المكتب وكنت بصدد تشغيل نشاط جديد، يمكنك تحديد أبعاد النشاط الجديد وموقع الشاشة من خلال استدعاء ActivityOptions.setLaunchBounds()
. ليس للطريقة أي تأثير إذا لم يكن الجهاز في وضع النوافذ المتعدّدة.
في المستوى 30 من واجهة برمجة التطبيقات والإصدارات الأقدم، إذا شغّلت نشاطًا ضمن حزمة مهام، سيحلّ النشاط محل النشاط المعروض على الشاشة، مع الاحتفاظ بجميع خصائص النوافذ المتعددة. إذا أردت تشغيل النشاط الجديد كنافذة منفصلة في وضع النوافذ المتعددة، عليك تشغيله في حزمة مهام جديدة.
يتيح نظام التشغيل Android 12 (المستوى 31 من واجهة برمجة التطبيقات) للتطبيقات تقسيم نافذة مهام التطبيق بين أنشطة متعددة. يمكنك تحديد طريقة عرض تطبيقك لأنشطته، سواء كانت على الشاشة الكاملة أو جنبًا إلى جنب أو مكدّسة، وذلك من خلال إنشاء ملف إعداد بتنسيق XML أو إجراء طلبات إلى واجهة برمجة التطبيقات Jetpack WindowManager.
السحب والإفلات
يمكن للمستخدمين سحب البيانات وإفلاتها من نشاط إلى آخر أثناء مشاركة الشاشة بين النشاطَين. (قبل الإصدار 7.0 من نظام التشغيل Android، كان بإمكان المستخدمين سحب البيانات وإفلاتها داخل نشاط واحد فقط). لإضافة إمكانية قبول المحتوى الذي تم إسقاطه بسرعة، اطّلِع على واجهة برمجة التطبيقات DropHelper
. للحصول على إرشادات شاملة حول السحب والإفلات، يُرجى الاطّلاع على مقالة تفعيل السحب والإفلات.
فتح نسختين من التطبيق
يحتوي كل نشاط رئيسي على مهمة خاصة به، ويتم عرضها في نافذة منفصلة. لبدء نسخة جديدة من تطبيقك في نافذة منفصلة، ابدأ أنشطة جديدة باستخدام العلامة FLAG_ACTIVITY_NEW_TASK
. يمكنك الجمع بين هذا الإعداد وسمات النوافذ المتعددة لطلب موقع جغرافي محدّد للنافذة الجديدة. على سبيل المثال، يمكن لتطبيق تسوّق عرض نوافذ متجاورة متعددة لمقارنة المنتجات.
يتيح لك نظام التشغيل Android 12 (المستوى 31 لواجهة برمجة التطبيقات) والإصدارات الأحدث تشغيل نسختَين من نشاط جنبًا إلى جنب في نافذة المهمة نفسها باستخدام ميزة تضمين الأنشطة.
إذا أردت السماح للمستخدمين ببدء مثيل آخر من تطبيقك من مشغّل التطبيقات أو شريط المهام، عليك ضبط android:resizeableActivity="true"
في بيان نشاط المشغّل وعدم استخدام وضع تشغيل يمنع إنشاء مثيلات متعددة. على سبيل المثال، يمكن إنشاء مثيل لنشاط singleInstancePerTask
عدة مرات في مهام مختلفة عند ضبط FLAG_ACTIVITY_MULTIPLE_TASK
أو FLAG_ACTIVITY_NEW_DOCUMENT
.
في نظام التشغيل Android 15 (المستوى 35 لواجهة برمجة التطبيقات) والإصدارات الأحدث،
تتيح لك السمة PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI
إمكانية الإفصاح عن توفير الدعم
للتشغيل المتزامن لعدة مثيلات. هذه السمة هي إشارة واضحة لواجهة مستخدم النظام من أجل عرض عناصر تحكُّم للمستخدم لإنشاء مثيلات متعددة من التطبيق. هذه السمة مستقلة عن وضع التشغيل، ولكن يجب استخدامها فقط عندما يكون وضع التشغيل لنشاط أو تطبيق متوافقًا مع السمة، على سبيل المثال، عندما لا يكون وضع التشغيل singleInstance
.
عند تشغيل نُسخ متعددة من تطبيق في نوافذ منفصلة على جهاز قابل للطي، قد يتم إرسال نسخة واحدة أو أكثر إلى الخلفية إذا تغيّر وضع الجهاز. على سبيل المثال، لنفترض أنّ الجهاز مفتوح ويتم تشغيل نسختَين من التطبيق في نافذتَين منفصلتَين على كل جانب من الطيّة. إذا كان الجهاز مطويًا، قد يتم إيقاف إحدى النسختين بدلاً من محاولة ملاءمة النوافذ لكلتا النسختين على شاشة أصغر.
التحقّق من وضع النوافذ المتعددة
بغض النظر عمّا إذا كان تطبيقك يستهدف المستوى 24 من واجهة برمجة التطبيقات أو مستوى أعلى، عليك التحقّق من سلوك التطبيق في وضع النوافذ المتعدّدة في حال حاول أحد المستخدمين تشغيله في وضع النوافذ المتعدّدة على جهاز يعمل بالإصدار 7.0 من نظام التشغيل Android أو إصدار أحدث.
أجهزة الاختبار
تتوافق الأجهزة التي تعمل بالإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث مع وضع النوافذ المتعددة.
المستوى 23 أو أقل لواجهة برمجة التطبيقات
عندما يحاول المستخدمون استخدام التطبيق في وضع النوافذ المتعدّدة، يعيد النظام تغيير حجم التطبيق بشكل إجباري ما لم يحدّد التطبيق اتجاهًا ثابتًا.
إذا لم يحدّد تطبيقك اتجاهًا ثابتًا، عليك تشغيله على جهاز يعمل بالإصدار 7.0 من نظام التشغيل Android أو إصدار أحدث ومحاولة وضعه في وضع تقسيم الشاشة. تأكَّد من أنّ تجربة المستخدم مقبولة عند تغيير حجم التطبيق بشكل إجباري.
إذا كان التطبيق يحدّد اتجاهًا ثابتًا، عليك محاولة وضع التطبيق في وضع النوافذ المتعددة. تأكَّد من أنّ التطبيق يظل في وضع ملء الشاشة عند إجراء ذلك.
المستويات من 24 إلى 30 لواجهة برمجة التطبيقات
إذا كان تطبيقك يستهدف مستويات واجهة برمجة التطبيقات من 24 إلى 30 ولم يتم إيقاف ميزة النوافذ المتعددة، يُرجى التأكّد من السلوك التالي في وضعَي تقسيم الشاشة ووضع النوافذ على سطح المكتب:
شغِّل التطبيق في وضع ملء الشاشة، ثم بدِّل إلى وضع النوافذ المتعددة من خلال الضغط مع الاستمرار على زر التطبيقات الحديثة. تأكَّد من أنّ التطبيق يتم تبديله بشكلٍ سليم.
شغِّل التطبيق مباشرةً في وضع النوافذ المتعددة وتأكَّد من تشغيله بشكل سليم. يمكنك تشغيل تطبيق في وضع النوافذ المتعددة من خلال الضغط على زر التطبيقات الحديثة، ثم الضغط مع الاستمرار على شريط عنوان التطبيق وسحبه إلى إحدى المناطق المميّزة على الشاشة.
غيِّر حجم التطبيق في وضع تقسيم الشاشة عن طريق سحب فاصل الشاشة. تأكَّد من أنّ التطبيق يغيّر حجمه بدون أن يتعطّل ومن أنّ عناصر واجهة المستخدم الضرورية مرئية.
إذا كنت قد حدّدت الحد الأدنى لأبعاد تطبيقك، حاوِل تغيير حجم التطبيق بحيث يكون حجم النافذة أصغر من هذه الأبعاد. تأكَّد من أنّه لا يمكنك تغيير حجم التطبيق ليصبح أصغر من الحد الأدنى للأبعاد المحدّدة.
تأكَّد من أنّ أداء تطبيقك مقبول خلال جميع الاختبارات. على سبيل المثال، تحقَّق من عدم حدوث تأخير كبير في تعديل واجهة المستخدم بعد تغيير حجم التطبيق.
المستوى 31 أو مستوى أحدث لواجهة برمجة التطبيقات
إذا كان تطبيقك يستهدف المستوى 31 أو أعلى من واجهة برمجة التطبيقات وكان الحد الأدنى لعرض النشاط الرئيسي والحد الأدنى لارتفاعه أقل من أو يساوي الأبعاد الخاصة بمساحة العرض المتاحة، تحقَّق من جميع السلوكيات المدرَجة للمستويات من 24 إلى 30 لواجهة برمجة التطبيقات.
قائمة التحقّق من الاختبار
للتحقّق من أداء تطبيقك في وضع النوافذ المتعدّدة، جرِّب العمليات التالية. يجب تجربة هذه العمليات في كل من وضع تقسيم الشاشة ووضع النوافذ على سطح المكتب، إلا إذا ذُكر خلاف ذلك.
الدخول إلى وضع النوافذ المتعددة والخروج منه
انتقِل من تطبيقك إلى تطبيق آخر، وتأكَّد من أنّ التطبيق يتصرف بشكل سليم عندما يكون مرئيًا ولكن غير نشط. على سبيل المثال، إذا كان تطبيقك يشغّل فيديو، تأكَّد من استمرار تشغيل الفيديو أثناء تفاعل المستخدم مع تطبيق آخر.
في "وضع تقسيم الشاشة"، حاوِل تحريك فاصل الشاشة لتكبير تطبيقك وتصغيره. جرِّب هذه العمليات في كلّ من الوضعَين جنبًا إلى جنب وفوق بعضهما البعض. تأكَّد من أنّ التطبيق لا يتعطّل، وأنّ الوظائف الأساسية ظاهرة، وأنّ عملية تغيير الحجم لا تستغرق وقتًا طويلاً.
تنفيذ عدة عمليات تغيير للحجم بشكل متسلسل وسريع تأكَّد من أنّ تطبيقك لا يتعطّل أو يتسبّب في تسرُّب الذاكرة. توفّر أداة Memory Profiler في "استوديو Android" معلومات حول استخدام تطبيقك للذاكرة (راجِع مقالة فحص استخدام تطبيقك للذاكرة باستخدام أداة Memory Profiler).
استخدِم تطبيقك بشكل طبيعي في عدد من إعدادات النوافذ المختلفة، وتأكَّد من أنّ التطبيق يعمل بشكل سليم. تأكَّد من أنّ النص مقروء وأنّ عناصر واجهة المستخدم ليست صغيرة جدًا بحيث لا يمكن التفاعل معها.
تم إيقاف دعم النوافذ المتعددة
في مستويات واجهة برمجة التطبيقات من 24 إلى 30، إذا أوقفت إمكانية استخدام النوافذ المتعددة من خلال ضبط
android:resizeableActivity="false"
، عليك تشغيل تطبيقك على جهاز يعمل بنظام التشغيل Android 7.0 إلى 11 ومحاولة وضع التطبيق في وضعَي تقسيم الشاشة والنوافذ على سطح المكتب. تأكَّد من أنّ التطبيق يظل في وضع ملء الشاشة عند إجراء ذلك.
مراجع إضافية
لمزيد من المعلومات حول إمكانية استخدام نوافذ متعدّدة في Android، يُرجى الاطّلاع على:
- نموذج MultiWindowPlayground لنظام التشغيل Android