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

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

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

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

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

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

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

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

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

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

      يمكنك ضبط طريقة تعامل تطبيقك مع وضع "النوافذ المتعددة" من خلال تحديد الحد الأدنى للأبعاد المسموح بها لنشاطك. يمكنك أيضًا إيقاف وضع "نوافذ متعددة" لتطبيقك من خلال ضبط resizeableActivity="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. مشغّل تطبيقات بتصميم Material Design على هاتف
الشكل 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 من حزمة تطوير البرامج (API) والإصدارات الأقدم:

<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>

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

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

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

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

تتيح الأجهزة التي تعمل بالإصدار 7.0 من نظام التشغيل Android (المستوى 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 غير مفعَّل * وضع توافق الأجهزة * إتاحة تغيير حجم الشاشة الكبيرة * معالجة تغييرات الضبط