إتاحة وضع النوافذ المتعددة

يتيح وضع النوافذ المتعددة لتطبيقات متعددة مشاركة الشاشة نفسها في آنٍ واحد. يمكن أن تكون التطبيقات جنبًا إلى جنب أو فوق بعضها (وضع الشاشة المقسّمة) أو أن يكون أحد التطبيقات في نافذة صغيرة فوق تطبيقات أخرى (وضع "نافذة ضمن النافذة") أو تطبيقات فردية في نوافذ منفصلة قابلة للنقل ويمكن تغيير حجمها (وضع النوافذ على سطح المكتب).

الشكل 1. عرض تطبيقَين جنبًا إلى جنب في وضع تقسيم الشاشة

للحصول على تعليمات للمستخدمين حول كيفية الوصول إلى وضع تقسيم الشاشة على الهواتف، يُرجى الانتقال إلى الاطّلاع على تطبيقَين في الوقت نفسه على هاتف Pixel.

ميزات النوافذ المتعددة الخاصة بإصدار معيّن

تعتمد تجربة المستخدم على النوافذ المتعددة على إصدار Android ونوع الجهاز:

  • Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) يتيح وضع "تقسيم الشاشة" على الأجهزة التي تتضمّن شاشة صغيرة، ووضع "نافذة ضمن النافذة" على أجهزة محدّدة.

    • وضع تقسيم الشاشة يملأ الشاشة بتطبيقَين، ويعرضهما جنبًا إلى جنب أو أحدهما فوق الآخر. يمكن للمستخدمين سحب المقسم الذي يفصل بين التطبيقَين لجعل أحدهما أكبر والآخر أصغر.

    • يتيح وضع "نافذة ضمن النافذة" للمستخدمين مواصلة تشغيل الفيديو أثناء التفاعل مع تطبيق آخر (راجِع التوافق مع ميزة "نافذة ضمن النافذة").

    • يمكن لصنّاع الأجهزة المزوّدة بشاشات كبيرة تفعيل وضع تقسيم الشاشة إلى نوافذ، والذي يتيح للمستخدمين تغيير حجم كل نشاط بحرية.

      يمكنك ضبط كيفية تعامل تطبيقك مع وضع النوافذ المتعددة من خلال تحديد الحد الأدنى للأبعاد المسموح بها لنشاطك. يمكنك أيضًا إيقاف وضع "نوافذ متعددة" لتطبيقك من خلال ضبط resizeabableActivity="false" لضمان عرض النظام لتطبيقك في وضع ملء الشاشة دائمًا.

  • يتيح الإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) استخدام وضع "صورة في صورة" على الأجهزة التي تتضمّن شاشة صغيرة.

  • في الإصدار Android 12 (المستوى 31 لواجهة برمجة التطبيقات)، يصبح وضع "تعدد النوافذ" سلوكًا عاديًا.

    • على الشاشات الكبيرة (فئة حجم النافذة متوسط أو موسّع)، تتوافق المنظومة الأساسية مع جميع التطبيقات في وضع "تعدد النوافذ" بغض النظر عن إعدادات التطبيق. في حال resizeableActivity="false"، يتم وضع التطبيق في وضع التوافق عند الضرورة لاستيعاب أبعاد الشاشة.

    • على الشاشات الصغيرة (فئة حجم نافذة مدمجة)، يتحقّق النظام من minWidth وminHeight للنشاط لتحديد ما إذا كان يمكن تشغيل النشاط في وضع "النوافذ المتعددة". في حال تحديد القيمة resizeableActivity="false"، سيتم منع تشغيل التطبيق في وضع النوافذ المتعدّدة بغض النظر عن الحد الأدنى للعرض والارتفاع.

وضع تقسيم الشاشة

يشغِّل المستخدمون وضع تقسيم الشاشة باتّباع الخطوات التالية:

  1. افتح شاشة "التطبيقات المستخدَمة مؤخرًا".
  2. التمرير سريعًا للتطبيق لعرضه
  3. الضغط على رمز التطبيق في شريط عنوان التطبيق
  4. تحديد خيار القائمة "تقسيم الشاشة"
  5. حدد تطبيقًا آخر من شاشة "التطبيقات الأخيرة" أو أغلق شاشة "التطبيقات الأخيرة" وشغِّل تطبيقًا آخر

يخرج المستخدمون من وضع تقسيم الشاشة من خلال سحب أداة تقسيم النافذة إلى حافة الشاشة، للأعلى أو للأسفل أو اليمين أو اليسار.

الإطلاق المجاور

إذا كان تطبيقك يحتاج إلى الوصول إلى المحتوى من خلال هدف، يمكنك استخدام FLAG_ACTIVITY_LAUNCH_ADJACENT لفتح المحتوى في نافذة مجاورة مُقسَّمة.

تم تقديم FLAG_ACTIVITY_LAUNCH_ADJACENT في Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) لسماح التطبيقات التي تعمل في وضع تقسيم الشاشة بتشغيل الأنشطة في النافذة المجاورة.

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

تتوفّر ميزة "استئناف التطبيقات المتعددة" أيضًا على أجهزة محدّدة تعمل بنظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات). للسماح بميزة "استئناف التطبيقات المتعددة" على أجهزة Android 9، أضِف البيانات الوصفية التالية في البيان:

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

للتأكّد من أنّ جهازًا معيّنًا يتوافق مع البيانات الوصفية لهذا البيان، يُرجى الرجوع إلى مواصفات الجهاز.

Android 9

في وضع "النوافذ المتعددة" على نظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات) والإصدارات الأقدم، لا يكون نشطًا في وقت معيّن سوى النشاط الذي تعامل معه المستخدم مؤخرًا. يُعتبر هذا النشاط الأكثر أهمية، وهو النشاط الوحيد في حالةRESUMED . جميع الأنشطة المرئية الأخرى هي STARTED ولكنها ليست RESUMED. ومع ذلك، يمنح النظام أولوية أعلى لهذه الأنشطة المرئية ولكن التي لم يتم استئنافها من الأنشطة غير المرئية. إذا تفاعل المستخدم مع أحد الأنشطة المرئية، تتم استعادة هذا النشاط، ويدخل النشاط الأهم سابقًا في الحالة STARTED.

عندما تكون هناك أنشطة متعدّدة ضمن عملية تطبيق نشطة واحدة، تتم استعادة النشاط الذي يمتلك أعلى ترتيب z، ويتم إيقاف الأنشطة الأخرى مؤقتًا.

تغييرات الإعدادات

عندما يشغِّل المستخدم أحد التطبيقات في وضع "النوافذ المتعددة"، يُعلم النظام activity بتغيير الإعدادات على النحو المحدَّد في معالجة تغييرات الإعدادات. ويحدث ذلك أيضًا عندما يغيّر المستخدم حجم التطبيق أو يعيد وضعه في وضع ملء الشاشة.

في الأساس، يكون لهذا التغيير تأثيرات دورة حياة النشاط نفسها التي تحدث عندما يُعلم النظام التطبيق بأنّ الجهاز قد غيّر الوضع من عمودي إلى ملفوف، باستثناء أنّه يتم تغيير سمات التطبيق بدلاً من تبديلها فقط. يمكن أن يتعامل نشاطك مع تغيير الإعدادات بنفسه، أو يمكن لتطبيقك السماح للنظام بإتلاف النشاط وإعادة إنشائه باستخدام السمات الجديدة.

إذا كان المستخدم يغيّر حجم نافذة ويجعلها أكبر في أيّ من السمتَين، يغيّر النظام حجم النشاط لمطابقة إجراء المستخدم ويُجري تغييرات على الإعدادات حسب الحاجة. إذا تأخّر التطبيق في الرسم في المناطق التي تم الكشف عنها حديثًا،يملأ النظام هذه المناطق مؤقتًا باللون المحدّد من خلال سمة 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 لا يضمن حصولك على وصول حصري إلى الكاميرا، لأنّه يمكن فتح التطبيقات الأخرى التي تستخدم الكاميرا على شاشات أخرى.

الشكل 2. الكاميرا في وضع النوافذ المتعددة.

ليس من الضروري أن يُوقف تطبيقك استخدام الكاميرا عندما يفقد التركيز. على سبيل المثال، قد تحتاج إلى مواصلة معاينة الكاميرا أثناء تفاعل المستخدم مع التطبيق الجديد الذي تم استئناف تشغيله، ولكن على التطبيق أن يتعامل مع حالة إلغاء الربط بشكل صحيح إذا لم يكُن ذلك التطبيق الأحدث من حيث مواصلة تشغيل الكاميرا. عندما يريد التطبيق الذي تم استئنافه في أعلى الشاشة استخدام الكاميرا، يمكنه فتحها وسيفقد تطبيقك إذن الوصول إليها. يمكن لتطبيقك إعادة فتح الكاميرا عندما يستعيد التطبيق التركيز.

بعد أن يتلقّى تطبيق معاودة الاتصال على CameraDevice.StateCallback#onDisconnected()، ستعرض المكالمات اللاحقة على جهاز الكاميرا العلامة CameraAccessException.

شاشات متعددة

يتيح نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) استخدام الأنشطة على الشاشات الثانوية. إذا كان هناك نشاط قيد التشغيل على جهاز مزوّد بشاشات متعددة، يمكن للمستخدمين نقل النشاط من شاشة إلى أخرى. تنطبق السيرة الذاتية المتعددة على سيناريوهات الشاشات المتعددة أيضًا؛ يمكن أن تتلقى العديد من الأنشطة بيانات من المستخدم في نفس الوقت.

يمكن للتطبيق تحديد الشاشة التي يجب تشغيله عليها عند تشغيله أو عند إنشاء نشاط آخر. يعتمد هذا السلوك على وضع تشغيل النشاط الذي تم تحديده في ملف البيان وعلى علامات النية والخيارات التي يضبطها الكيان الذي يطلق النشاط. اطّلِع على فئة ActivityOptions للحصول على مزيد من التفاصيل.

عند نقل نشاط إلى شاشة ثانوية، يمكن أن يخضع لتعديل سياقي وتغيير حجم النافذة وتغييرات الإعدادات والموارد. إذا كان النشاط يعالج تغيير الإعدادات، يتم إعلام النشاط في onConfigurationChanged()، وإلا تتم إعادة تشغيل النشاط.

يجب أن يتحقّق النشاط من العرض الحالي في onCreate() و onConfigurationChanged() في حال معالجة تغيير الإعداد. تأكد من تحديث الموارد والتخطيطات عند تغيير العرض.

إذا كان وضع الإطلاق المحدّد لنشاط معيّن يسمح بمثيلات متعددة، يمكن أن يؤدي الإطلاق على شاشة ثانوية إلى إنشاء مثيل جديد للنشاط. تتم استعادة كلا النشاطين في الوقت نفسه.

الشكل 3: نُسخ متعددة من نشاط على شاشات متعددة

ننصحك أيضًا بالاطّلاع على واجهات برمجة تطبيقات العروض المتعددة التي تم طرحها في الإصدار Android 8.0.

النشاط في مقابل سياق التطبيق

من المهم استخدام السياق الصحيح في العروض المتعددة. عند الوصول إلى الموارد، يختلف سياق النشاط (الذي يتم عرضه) عن سياق التطبيق (الذي لا يتم عرضه).

يحتوي سياق النشاط على معلومات عن الشاشة ويتم تعديله دائمًا حسب منطقة العرض التي يظهر فيها النشاط. يتيح لك ذلك الحصول على المعلومات الصحيحة حول كثافة الشاشة أو مقاييس النافذة في تطبيقك. يجب دائمًا استخدام سياق النشاط (أو سياق آخر يستند إلى واجهة المستخدم) للحصول على معلومات عن النافذة أو الشاشة الحالية. ويؤثر ذلك أيضًا في بعض واجهات برمجة تطبيقات النظام التي تستخدِم معلومات من السياق (على سبيل المثال، اطّلِع على نظرة عامة على الإشعارات المنبثقة).

تحدّد إعدادات نافذة النشاط وعرض العنصر الرئيسي الموارد والسياق. يمكنك الحصول على العرض الحالي على النحو التالي:

val activityDisplay = activity.getDisplay()

الحصول على مقاييس فترة النشاط الحالية:

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

الحصول على الحد الأقصى لمقاييس الفترة لإعدادات النظام الحالية:

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

مقاييس الحد الأقصى للنوافذ مخصّصة لإجراء عمليات حسابية أو اختيارات التنسيق أو تحديد حجم الموارد التي يجب جلبها مسبقًا. يتيح لك توفُّر هذه الميزة في onCreate() اتّخاذ هذه القرارات قبل تمرير التصميم الأول. يجب عدم استخدام هذه المقاييس لعرض عناصر عرض معيّنة، واستخدام معلومات من عنصر Configuration بدلاً من ذلك.

أجزاء مُقتطعة من الشاشة

قد تختلف أشكال الفتحات في الأجهزة القابلة للطي عند طيها وفتحها. لتجنّب حدوث مشاكل في الفتحات، راجِع مقالة إتاحة الفتحات في الشاشة.

الشاشات الثانوية

يمكنك الحصول على الشاشات المتاحة من خدمة النظام DisplayManager:

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

استخدِم الفئة Display للحصول على معلومات حول شاشة عرض معيّنة، مثل حجم العرض أو علامات تشير إلى أمان الشاشة. ومع ذلك، لا تفترض أنّ حجم الشاشة سيكون هو نفسه مساحة العرض المخصّصة لتطبيقك. تذكَّر أنّه في وضع "النوافذ المتعددة"، يشغل تطبيقك جزءًا من الشاشة.

حدِّد ما إذا كان يمكن تشغيل نشاط على شاشة:

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

بعد ذلك، شغّل النشاط على الشاشة:

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())

دعم الشاشات المتعددة

يتيح نظام Android استخدام شاشات متعددة مع لوحات المفاتيح والخلفيات ومشغّلات التطبيقات.

لوحة المفاتيح البرمجية

يمكن عرض لوحة مفاتيح على شاشة ثانوية إذا تم ضبط الشاشة على إتاحة زخارف النظام. يظهر محرر أسلوب الإدخال تلقائيًا إذا كان هناك حقل نص يطلب الإدخال على تلك الشاشة.

الشكل 4. لوحة المفاتيح على شاشة عرض ثانوية

الخلفية

في الإصدار 10 من Android (المستوى 29 من واجهة برمجة التطبيقات)، يمكن أن تتضمّن الشاشات الثانوية خلفية. ينشئ الإطار المرجعي مثيلًا منفصلاً من WallpaperService.Engine لكل شاشة. تأكَّد من أنّ سطح كل محرك مرسوم بشكل مستقل. يمكن للمطوّرين carregar مواد العرض باستخدام سياق العرض في 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.

على سبيل المثال، يتيح تطبيق Launcher3 في AOSP نشاط SECONDARY_HOME.

الشكل 6. مشغّل تطبيقات مصمّم وفقًا لمبادئ التصميم المتعدد الأبعاد على هاتف
الشكل 7. مشغّل تطبيقات بتصميم متعدّد الأبعاد على شاشة عرض ثانوية

مقاييس النوافذ

طرح الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) طُرق WindowManager التالية لتوفير حدود التطبيقات التي تعمل في وضع "النوافذ المتعددة":

توفِّر طُرق مكتبة 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 لتقييد توفّر تطبيقك على هذه الأجهزة.

يعمل نظام التشغيل Android 12 (المستوى 31 لواجهة برمجة التطبيقات) تلقائيًا على وضع "نوافذ متعددة". على الشاشات الكبيرة (فئة حجم النافذة متوسط أو موسّع)، يتم تشغيل جميع التطبيقات في وضع استخدام عدّة نوافذ بغض النظر عن إعدادات التطبيق. على الشاشات الصغيرة، يتحقّق النظام من إعدادات النشاط minWidth وminHeight وresizeableActivity لتحديد ما إذا كان يمكن تنفيذ النشاط في وضع النوافذ المتعددة.

resizeableActivity

يمكنك ضبط هذه السمة في العنصر <activity> أو <application> في ملف البيان لتفعيل وضع النوافذ المتعددة أو إيقافه للمستوى 30 لواجهة برمجة التطبيقات والمستويات الأدنى:

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

في حال ضبط هذه السمة على true، يمكن تشغيل النشاط في وضعَي تقسيم الشاشة ووضع نافذة سطح المكتب. إذا تم ضبط السمة على false، لن يتيح النشاط استخدام وضع "النوافذ المتعددة". إذا كانت القيمة خاطئة، وحاول المستخدم بدء النشاط في وضع النوافذ المتعددة، سيتم عرض النشاط بملء الشاشة.

إذا كان تطبيقك يستهدف المستوى 24 أو أعلى من واجهة برمجة التطبيقات، ولكنك لم تحدِّد قيمة لهذه السمة، ستكون القيمة التلقائية للسمة هي true.

إذا كان تطبيقك يستهدف المستوى 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 (مستوى واجهة برمجة التطبيقات 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(): يستدعي النظام هذه الطريقة كلما دخل ال activity في وضع "النوافذ المتعددة" أو خرج منه. يُرسِل النظام إلى الأسلوب قيمة "صحيح" (true) إذا كان النشاط يدخل وضع "تعدد النوافذ" أو قيمة "خطأ" (false) إذا كان النشاط يغادر وضع "تعدد النوافذ".

  • onPictureInPictureModeChanged(): يستدعي النظام هذه الطريقة كلما دخل النشاط في وضع "نافذة ضمن النافذة" أو خارجه. يُرسِل النظام للطريقة قيمة true إذا كان النشاط يدخل في وضع "نافذة ضمن النافذة" أو false إذا كان النشاط يخرج من وضع "نافذة ضمن النافذة".

تعرِض فئة Fragment نُسخًا من العديد من هذه الطرق، على سبيل المثال، Fragment.onMultiWindowModeChanged().

وضع "نافذة ضمن النافذة"

لوضع نشاط في وضع "نافذة ضمن نافذة"، اتصل بالرقم enterPictureInPictureMode(). لن يكون لهذه الطريقة أي تأثير إذا كان الجهاز لا يتيح وضع "نافذة ضمن نافذة". لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إضافة فيديوهات باستخدام وضع "صورة في صورة".

الأنشطة الجديدة في وضع "النوافذ المتعددة"

عند إطلاق نشاط جديد، يمكنك الإشارة إلى أنّه يجب عرض النشاط الجديد بجانب النشاط الحالي إن أمكن. استخدِم علامة intent FLAG_ACTIVITY_LAUNCH_ADJACENT التي تطلب من النظام محاولة إنشاء النشاط الجديد في نافذة مجاورة، لكي يتشارك النشاطان في الشاشة. يبذل النظام قصارى جهده لإجراء ذلك، ولكن لا يمكن ضمان حدوث ذلك.

إذا كان الجهاز في وضع النافذة على الكمبيوتر المكتبي وكنت بصدد بدء نشاط جديد، يمكنك تحديد أبعاد النشاط الجديد وموقع الشاشة من خلال الاتصال ActivityOptions.setLaunchBounds(). لن يكون لهذه الطريقة أي تأثير إذا لم يكن الجهاز في وضع النوافذ المتعدّدة.

في المستوى 30 من واجهة برمجة التطبيقات والإصدارات الأقدم، إذا بدأت نشاطًا ضمن حزمة مهام، سيحلّ النشاط محلّ النشاط المعروض على الشاشة، ويتوارث كل خصائص النشاط المتعدّد النوافذ. إذا كنت تريد تشغيل النشاط الجديد كنافذة منفصلة في وضع "النوافذ المتعددة"، عليك تشغيله في حزمة مهام جديدة.

يتيح نظام التشغيل Android 12 (المستوى 31 من واجهة برمجة التطبيقات) للتطبيقات تقسيم نافذة مهام التطبيق بين أنشطة متعددة. يمكنك تحديد كيفية عرض تطبيقك لنشاطاته، سواء على الشاشة الكاملة أو جنبًا إلى جنب أو بشكل مُكدَّس، وذلك من خلال إنشاء ملف إعدادات XML أو إجراء طلبات بيانات من واجهة برمجة التطبيقات Jetpack WindowManager API.

سحب وإفلات

يمكن للمستخدمين سحب البيانات وإفلاتها من نشاط إلى آخر أثناء مشاركة النشاطين للشاشة. (قبل الإصدار 7.0 من Android، كان بإمكان المستخدمين سحب data وإسقاطها ضمن نشاط واحد فقط). لإضافة إمكانية قبول المحتوى الذي تم إسقاطه بسرعة، يُرجى الاطّلاع على واجهة برمجة التطبيقات DropHelper. للحصول على إرشادات شاملة حول السحب والإفلات، يُرجى الاطّلاع على مقالة تفعيل ميزة السحب والإفلات.

فتح نسختين من التطبيق

لكل نشاط جذر مهمته الخاصة التي يتم تشغيلها في عملية منفصلة ويتم عرضها في نافذتها الخاصة. لبدء نسخة جديدة من تطبيقك في نافذة منفصلة، يمكنك بدء أنشطة جديدة باستخدام العلامة FLAG_ACTIVITY_NEW_TASK. يمكنك دمج ذلك مع بعض سمات النوافذ المتعدّدة لطلب موقع جغرافي محدّد للنافذة الجديدة. على سبيل المثال، يمكن لتطبيق تسوّق عرض نوافذ متعدّدة لمقارنة المنتجات.

يتيح لك نظام التشغيل Android 12 (المستوى 31 لواجهة برمجة التطبيقات) تشغيل نسختَين من نشاط جنبًا إلى جنب في نافذة المهام نفسها.

إذا أردت السماح للمستخدمين ببدء نسخة أخرى من تطبيقك من مشغّل التطبيقات أو شريط التطبيقات، تأكَّد من أنّ "نشاط مشغّل التطبيقات" يضبط android:resizeableActivity="true" وأنّه لا يستخدم وضع تشغيل يمنع حدوث تكرارات في الثانية. على سبيل المثال، يمكن إنشاء مثيل لنشاط singleInstancePerTask عدة مرات في مهام مختلفة عند ضبط FLAG_ACTIVITY_MULTIPLE_TASK أو FLAG_ACTIVITY_NEW_DOCUMENT.

لا تخلط بين العروض المتعدّدة العناصر وتنسيقات اللوحات المتعدّدة، مثل عرض تفاصيل القائمة الذي يستخدم SlidingPaneLayout، والذي يتم تشغيله داخل ملف واحد نافذة.

يُرجى العلم أنّه عند تشغيل عدّة نُسخ في نوافذ منفصلة على جهاز قابل للطي، قد يتم إرسال نسخة واحدة أو أكثر إلى الخلفية في حال تغيّر الوضع. على سبيل المثال، لنفترض أنّه تم فتح جهاز وتشغيل نسختَين من التطبيق في نافذتَين على جانبَي الجهاز. في حال طي الجهاز، قد يتم إنهاء أحد النسخ بدلاً من محاولة ملاءمة النوافذ لكلٍّ من كلتا النُسخ على شاشة أصغر.

إثبات الهوية في وضع النوافذ المتعددة

سواء كان تطبيقك يستهدف المستوى 24 أو أعلى لواجهة برمجة التطبيقات أم لا، يجب التحقّق من سلوكه في وضع النوافذ المتعددة في حال حاول أحد المستخدمين تشغيله في وضع النوافذ المتعددة على جهاز يعمل بالإصدار 7.0 من نظام التشغيل Android أو إصدار أحدث.

أجهزة الاختبار

تتيح الأجهزة التي تعمل بنظام التشغيل Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث إمكانية وضع النوافذ المتعددة.

المستوى 23 من واجهة برمجة التطبيقات أو المستويات الأدنى

عندما يحاول المستخدمون استخدام التطبيق في وضع "نوافذ متعدّدة"، يغيّر النظام حجم التطبيق بشكل قسري ما لم يحدّد التطبيق اتجاهًا ثابتًا.

إذا لم يحدّد تطبيقك اتجاهًا ثابتًا، عليك تشغيله على جهاز يعمل بالإصدار 7.0 من نظام التشغيل Android أو إصدار أحدث ومحاولة وضع التطبيق في وضع تقسيم الشاشة. تحقق من أن تجربة المستخدم مقبولة عندما يتم فرض تغيير حجم التطبيق.

إذا كان التطبيق يعلن عن اتجاه ثابت، عليك محاولة وضع التطبيق في وضع "النوافذ المتعددة". تأكَّد من أنّ التطبيق يظل في وضع ملء الشاشة عند إجراء ذلك.

مستويات واجهة برمجة التطبيقات من 24 إلى 30

إذا كان تطبيقك يستهدف المستويات من 24 إلى 30 من واجهة برمجة التطبيقات ولا يوقِف ميزة النوافذ المتعددة، يُرجى التحقّق من السلوك التالي ضمن وضعَي "تقسيم الشاشة" و"نافذة سطح المكتب":

  • شغِّل التطبيق بملء الشاشة، ثم بدِّل إلى وضع "النوافذ المتعددة" من خلال الضغط مع الاستمرار على زر التطبيقات المستخدَمة مؤخرًا. تأكَّد من أنّ التطبيق يتم تبديله بشكلٍ سليم.

  • شغِّل التطبيق مباشرةً في وضع النوافذ المتعددة وتحقَّق من أنه يتم تشغيله بشكل صحيح. يمكنك تشغيل تطبيق في وضع "نوافذ متعدّدة" من خلال الضغط على الزر التطبيقات المستخدَمة مؤخرًا، ثم الضغط مع الاستمرار على شريط عنوان تطبيقك ونقله إلى إحدى المناطق المميّزة على الشاشة.

  • يمكنك تغيير حجم تطبيقك في وضع تقسيم الشاشة من خلال سحب فاصل الشاشة. تأكَّد مما يلي: أنّه يمكن تغيير حجم التطبيق بدون تعطُّله، وأنّ عناصر واجهة المستخدم اللازمة مرئية.

  • إذا حدّدت الحد الأدنى للأبعاد لتطبيقك، حاوِل تغيير حجم التطبيق لكي يكون حجم نافذته أصغر من هذه الأبعاد. تأكَّد مما يلي: لا يمكنك تغيير حجم التطبيق ليصبح أصغر من الحد الأدنى لحجم السمات المحدَّد.

  • من خلال جميع الاختبارات، عليك التأكّد من أنّ أداء تطبيقك مقبول. على سبيل المثال، تأكَّد من عدم حدوث تأخير طويل في تعديل واجهة المستخدم بعد تغيير حجم التطبيق.

المستوى 31 لواجهة برمجة التطبيقات أو مستوى أعلى

إذا كان تطبيقك يستهدف المستوى 31 من واجهة برمجة التطبيقات أو أعلى وكان الحد الأدنى للعرض والحد الأدنى للارتفاع للنشاط الرئيسي أقل من أو يساوي الأبعاد ذات الصلة لمساحة العرض المتاحة، تحقق من جميع السلوكيات المذكورة لمستويات واجهة برمجة التطبيقات من 24 إلى 30.

قائمة التحقّق من الاختبار

للتحقّق من أداء تطبيقك في وضع "تعدد النوافذ"، جرِّب الخطوات التالية: يجب تجربة هذه العمليات في كل من وضع تقسيم الشاشة ووضع شاشة الكمبيوتر المكتبي المتعدّدة، ما لم يُذكر خلاف ذلك.

  • الدخول إلى وضع "نوافذ متعددة" والخروج منه

  • بدِّل من تطبيقك إلى تطبيق آخر، وتأكَّد من أنّ التطبيق يعمل بشكلٍ سليم عندما يكون مرئيًا ولكن غير نشط. على سبيل المثال، إذا كان تطبيقك يشغّل فيديو، تأكَّد من أنّه يستمر تشغيل الفيديو أثناء تفاعل المستخدم مع تطبيق آخر.

  • في وضع تقسيم الشاشة، جرِّب تحريك فاصل الشاشة لتكبير تطبيقك وتصغيره. جرِّب هذه العمليات في كل من الوضعَين "جانبًا إلى جنب" و"واحد فوق الآخر"، وكذلك في الإعدادات الأخرى. تأكَّد من أنّ التطبيق لا يتعطّل وأنّ الوظيفة الأساسية مرئية وأنّ عملية تغيير الحجم لا تستغرق وقتًا طويلاً.

  • تنفيذ عدّة عمليات تغيير حجم بشكل متتابع وسريعة تأكَّد من أنّ تطبيقك لا يتعطّل أو يستهلك ذاكرة بشكل غير معقول. يوفّر أداة "تحليل الذاكرة" في "استوديو Android" معلومات عن استخدام تطبيقك للذاكرة (اطّلِع على مقالة فحص استخدام تطبيقك لل الذاكرة باستخدام أداة "تحليل الذاكرة").

  • استخدِم تطبيقك بشكلٍ طبيعي في عدد من إعدادات النوافذ المختلفة، و تحقّق من أنّ التطبيق يعمل بشكلٍ سليم. تأكَّد من أنّ النص مقروء ومن أنّ عناصر واجهة المستخدم ليست صغيرة جدًا بحيث لا يمكن التفاعل معها.

تم إيقاف ميزة النوافذ المتعددة

في الإصدارات من 24 إلى 30 من واجهة برمجة التطبيقات، إذا أوقفت ميزة "وضع الشاشات المتعددة" من خلال الإعداد android:resizeableActivity="false"، عليك تشغيل تطبيقك على جهاز يعمل بالإصدارات من Android 7.0 إلى 11 ومحاولة وضع التطبيق في وضعَي "تقسيم الشاشة" و"وضع الشاشات المتعددة". تحقق من أنه عند إجراء ذلك، يظل التطبيق في وضع ملء الشاشة.

مصادر إضافية

لمزيد من المعلومات عن ميزة "وضع النوافذ المتعددة" في Android، يُرجى الاطّلاع على:

ننصح بهذا الإجراء لك * ملاحظة: يتم عرض نص الرابط عندما تكون لغة JavaScript غير مفعّلة * وضع التوافق مع الجهاز * إتاحة إمكانية تغيير حجم الشاشة الكبيرة * تغييرات إعدادات الاسم المعرِّف