يتيح وضع النوافذ المتعددة لتطبيقات متعددة مشاركة الشاشة نفسها في الوقت نفسه. ويمكن عرض التطبيقات جنبًا إلى جنب أو فوق بعضها البعض (وضع تقسيم الشاشة)، أو عرض تطبيق واحد في نافذة صغيرة تظهر فوق التطبيقات الأخرى (وضع "نافذة ضمن النافذة")، أو عرض تطبيقات فردية في نوافذ منفصلة قابلة للنقل وتغيير الحجم (وضع النوافذ على سطح المكتب).
للحصول على تعليمات للمستخدمين حول كيفية الوصول إلى وضع تقسيم الشاشة على الهواتف، انتقِل إلى عرض تطبيقين في الوقت نفسه على هاتف 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. في نظام التشغيل Android 12L (المستوى 32 لواجهة برمجة التطبيقات) والإصدارات الأحدث، تسمح العلامة لتطبيق يعمل في وضع ملء الشاشة بالانتقال إلى وضع تقسيم الشاشة وتشغيل نشاط مستهدف في النافذة المجاورة.
تم طرح FLAG_ACTIVITY_LAUNCH_ADJACENT في الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات).
لتشغيل نشاط مجاور، استخدِم 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 أو طلبات البيانات من واجهة برمجة التطبيقات التي تحدّد ما إذا كان يتم عرض الأنشطة جنبًا إلى جنب أو مكدّسة. لمعرفة التفاصيل الكاملة، يُرجى الاطّلاع على تضمين الأنشطة.
مراحل النشاط في وضع النوافذ المتعددة
لا يغيّر وضع النوافذ المتعدّدة دورة حياة النشاط. ومع ذلك، تختلف حالة التطبيقات التي تم استئنافها في نوافذ متعددة باختلاف إصدارات Android.
استئناف متعدد
يتيح الإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) والإصدارات الأحدث ميزة "استئناف متعدّد"، إذ تظل جميع الأنشطة في الحالة RESUMED عندما يكون الجهاز في وضع النوافذ المتعددة. يمكن إيقاف نشاط مؤقتًا إذا كان هناك نشاط شفاف فوقه أو إذا كان النشاط غير قابل للتركيز، مثلاً إذا كان النشاط في وضع "نافذة ضمن النافذة". من المحتمل أيضًا ألا يكون هناك أي نشاط مركّز عليه في وقت معيّن، مثلاً إذا كانت لوحة الإشعارات مفتوحة. تعمل طريقة onStop()
كالمعتاد: يتم استدعاء الطريقة في أي وقت يتم فيه إزالة نشاط من
الشاشة.
تتوفّر ميزة "استئناف الأنشطة المتعددة" أيضًا على أجهزة محدّدة تعمل بالإصدار 9 من نظام التشغيل Android (المستوى 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 وحدة بكسل مستقلة عن الكثافة أو أكثر. ومع ذلك، يحترم التطبيق تمامًا نسبة العرض إلى الارتفاع التي يختارها المستخدم (راجِع عمليات الإلغاء على مستوى المستخدم لكل تطبيق).
إذا كنت بصدد إنشاء لعبة، يمكنك الاطّلاع على اتجاه التطبيق ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم للتعرّف على كيفية استبعاد لعبتك من التغييرات التي تم إجراؤها في Android 16 (المستوى 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(): يستدعي النظام هذه الطريقة عندما ينتقل النشاط إلى وضع النوافذ المتعددة أو يخرج منه. يُمرِّر النظام إلى الطريقة القيمة "صحيح" إذا كان النشاط سينتقل إلى وضع النوافذ المتعددة، أو القيمة "خطأ" إذا كان النشاط سيخرج من وضع النوافذ المتعددة.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