يتيح وضع "النوافذ المتعددة" لعدة تطبيقات مشاركة الشاشة نفسها في الوقت نفسه. يمكن عرض التطبيقات جنبًا إلى جنب أو فوق بعضها (وضع تقسيم الشاشة)، أو عرض تطبيق واحد في نافذة صغيرة فوق التطبيقات الأخرى (وضع "نافذة ضمن النافذة")، أو عرض تطبيقات فردية في نوافذ منفصلة قابلة للنقل وتغيير الحجم (وضع "وضع النوافذ على الكمبيوتر المكتبي").
للحصول على تعليمات للمستخدمين حول كيفية الوصول إلى وضع "تقسيم الشاشة" على الهواتف، انتقِل إلى مقالة عرض تطبيقَين في الوقت نفسه على هاتف Pixel.
ميزات وضع "النوافذ المتعددة" الخاصة بالإصدار
تعتمد تجربة المستخدم في وضع "تعدد النوافذ" على إصدار Android ونوع الجهاز:
Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) يتيح وضع "تقسيم الشاشة" على الأجهزة التي تتضمّن شاشة صغيرة، ووضع "نافذة ضمن النافذة" على أجهزة محدّدة.
وضع تقسيم الشاشة: يملؤ هذا الوضع الشاشة بتطبيقَين، ويعرضهما إما جنبًا إلى جنب أو أحدهما فوق الآخر. يمكن للمستخدمين سحب المقسم الذي يفصل بين التطبيقَين لجعل أحدهما أكبر والآخر أصغر.
يتيح وضع "نافذة ضمن النافذة" للمستخدمين مواصلة تشغيل الفيديو أثناء التفاعل مع تطبيق آخر (راجِع التوافق مع ميزة "نافذة ضمن النافذة").
يمكن لصنّاع الأجهزة المزوّدة بشاشات كبيرة تفعيل وضع تقسيم الشاشة إلى نوافذ، والذي يتيح للمستخدمين تغيير حجم كل نشاط بحرية.
يمكنك ضبط طريقة تعامل تطبيقك مع وضع "النوافذ المتعددة" من خلال تحديد الحد الأدنى للأبعاد المسموح بها لنشاطك. يمكنك أيضًا إيقاف وضع "نوافذ متعددة" لتطبيقك من خلال ضبط
resizeableActivity="false"
لضمان عرض النظام لتطبيقك في وضع ملء الشاشة دائمًا.
يتيح الإصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات) استخدام وضع "صورة في صورة" على الأجهزة التي تتضمّن شاشة صغيرة.
في الإصدار Android 12 (المستوى 31 لواجهة برمجة التطبيقات)، يصبح وضع "تعدد النوافذ" سلوكًا عاديًا.
على الشاشات الكبيرة (فئة حجم النافذة متوسط أو موسّع)، تتوافق منصتنا مع جميع التطبيقات في وضع "النوافذ المتعددة" بغض النظر عن إعدادات التطبيق. في حال
resizeableActivity="false"
، يتم وضع التطبيق في وضع التوافق عند الضرورة لاستيعاب أبعاد الشاشة.على الشاشات الصغيرة (فئة حجم نافذة مدمجة)، يتحقّق النظام من
minWidth
وminHeight
للنشاط لتحديد ما إذا كان يمكن تشغيل النشاط في وضع "النوافذ المتعددة". في حال تحديد القيمةresizeableActivity="false"
، سيتم منع تشغيل التطبيق في وضع النوافذ المتعدّدة بغض النظر عن الحد الأدنى للعرض والارتفاع.
وضع تقسيم الشاشة
يشغِّل المستخدمون وضع تقسيم الشاشة باتّباع الخطوات التالية:
- افتح شاشة "التطبيقات المستخدَمة مؤخرًا".
- التمرير سريعًا لليمين أو اليسار لعرض تطبيق
- الضغط على رمز التطبيق في شريط عنوان التطبيق
- اختيار خيار قائمة تقسيم الشاشة
- اختَر تطبيقًا آخر من شاشة "التطبيقات المستخدَمة مؤخرًا"، أو أغلِق شاشة "التطبيقات المستخدَمة مؤخرًا" و شغِّل تطبيقًا آخر.
يخرج المستخدمون من وضع تقسيم الشاشة من خلال سحب أداة تقسيم النافذة إلى حافة الشاشة، للأعلى أو للأسفل أو اليمين أو اليسار.
الإطلاق المجاور
إذا كان تطبيقك يحتاج إلى الوصول إلى المحتوى من خلال نية، يمكنك استخدام رمز
FLAG_ACTIVITY_LAUNCH_ADJACENT
لفتح المحتوى في
نافذة شاشة مُقسّمة مجاورة.
تم تقديم FLAG_ACTIVITY_LAUNCH_ADJACENT
في الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات) لمنح التطبيقات التي تعمل في وضع تقسيم الشاشة إمكانية تشغيل الأنشطة في النافذة المجاورة.
في الإصدار 12L من نظام التشغيل Android (المستوى 32 لواجهة برمجة التطبيقات) والإصدارات الأحدث، تم توسيع نطاق التعريف الخاص بالعلامة لسماح التطبيقات التي تعمل في وضع ملء الشاشة بتفعيل وضع تقسيم الشاشة ثم بدء الأنشطة في النافذة المجاورة.
لبدء نشاط مجاور، استخدِم FLAG_ACTIVITY_LAUNCH_ADJACENT
مع FLAG_ACTIVITY_NEW_TASK
، على سبيل المثال:
Kotlin
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) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); 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()
.
يتمّ استدعاء الدالة المرجعية عندما يكتسب نشاط ما أو يفقد أعلى ملف شخصي نشط مجددًا ، وهو أمر مهمّ عندما يستخدم النشاط موردًا فريدًا مشترَكًا، مثل الميكروفون أو الكاميرا:
Kotlin
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. } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { 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
.
شاشات متعددة
يتيح نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) استخدام الأنشطة على الشاشات الثانوية. إذا كان أحد الأنشطة قيد التشغيل على جهاز مزوّد بشاشات متعددة، يمكن للمستخدمين نقل النشاط من شاشة إلى أخرى. تنطبق ميزة استئناف التطبيقات المتعدّدة على سيناريوهات الشاشات المتعدّدة أيضًا، إذ يمكن أن تتلقّى عدّة أنشطة إدخالات من المستخدم في الوقت نفسه.
يمكن للتطبيق تحديد الشاشة التي يجب تشغيله عليها عند تشغيله أو عند
إنشاء نشاط آخر. يعتمد هذا السلوك على وضع تشغيل النشاط
الذي تم تحديده في ملف البيان وعلى علامات النية والخيارات التي يضبطها
الكيان الذي يطلق النشاط. اطّلِع على فئة ActivityOptions
للحصول على مزيد من
التفاصيل.
عند نقل نشاط إلى شاشة ثانوية، يمكن أن يخضع لتعديل
سياقي وتغيير حجم النافذة وتغييرات الإعدادات والموارد. إذا كان النشاط
يعالج تغيير الإعدادات، يتم إعلام النشاط في
onConfigurationChanged()
، وإلا تتم إعادة تشغيل النشاط.
يجب أن يتحقّق النشاط من العرض الحالي في onCreate()
و
onConfigurationChanged()
في حال معالجة تغيير الإعداد. احرص على
تعديل الموارد والتنسيقات عند تغيير الشاشة.
إذا كان وضع التشغيل المحدّد لنشاط معيّن يسمح بإنشاء نُسخ متعددة، يمكن أن يؤدي تشغيله على شاشة ثانوية إلى إنشاء نسخة جديدة من النشاط. تتم استعادة كلا النشاطين في الوقت نفسه.
ننصحك أيضًا بالاطّلاع على واجهات برمجة تطبيقات العروض المتعددة التي تم طرحها في الإصدار Android 8.0.
النشاط في مقابل سياق التطبيق
من المهم استخدام السياق الصحيح في العروض المتعدّدة. عند الوصول إلى الموارد، يختلف سياق النشاط (الذي يتم عرضه) عن سياق التطبيق (الذي لا يتم عرضه).
يحتوي سياق النشاط على معلومات عن الشاشة ويتم تعديله دائمًا وفقًا لمساحة العرض التي يظهر فيها النشاط. يتيح لك ذلك الحصول على المعلومات الصحيحة حول كثافة الشاشة أو مقاييس النافذة في تطبيقك. يجب دائمًا استخدام سياق النشاط (أو سياق آخر يستند إلى واجهة المستخدم) للحصول على معلومات عن النافذة أو الشاشة الحالية. ويؤثر ذلك أيضًا في بعض واجهات برمجة تطبيقات النظام التي تستخدِم معلومات من السياق (على سبيل المثال، اطّلِع على نظرة عامة على الإشعارات المنبثقة).
تحدّد إعدادات نافذة النشاط وعرض العنصر الرئيسي الموارد والسياق. يمكنك الحصول على العرض الحالي على النحو التالي:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
الحصول على مقاييس فترة النشاط الحالية:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
الحصول على الحد الأقصى لمقاييس الفترة لإعدادات النظام الحالية:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
مقاييس الحد الأقصى للنوافذ مخصّصة لإجراء عمليات حسابية أو اختيارات التنسيق أو تحديد حجم الموارد التي يجب جلبها مسبقًا. يتيح لك توفّر هذه الميزة
في onCreate()
اتخاذ هذه القرارات قبل مرحلة معالجة التنسيق
الأولى. يجب عدم استخدام هذه المقاييس لعرض عناصر عرض معيّنة،
واستخدام معلومات من عنصر Configuration
بدلاً من ذلك.
أجزاء مُقتطعة من الشاشة
قد تختلف أشكال الفتحات في الأجهزة القابلة للطي عند طيها وفتحها. لتجنُّب المشاكل المتعلّقة بالفتحات، راجِع مقالة إتاحة فتحات الشاشة.
الشاشات الثانوية
يمكنك الحصول على الشاشات المتاحة من خدمة النظام DisplayManager
:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
استخدِم فئة Display
للحصول على معلومات عن شاشة معيّنة، مثل
حجم الشاشة أو العلامات التي تشير إلى ما إذا كانت الشاشة آمنة.
ومع ذلك، لا تفترض أنّ حجم الشاشة سيكون هو نفسه
مساحة العرض المخصّصة لتطبيقك. تذكَّر أنّه في وضع "النوافذ المتعددة"، يشغل تطبيقك جزءًا من الشاشة.
حدِّد ما إذا كان يمكن تشغيل نشاط على شاشة:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
بعد ذلك، ابدأ النشاط على الشاشة:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
إتاحة استخدام شاشات متعددة
يتيح نظام Android استخدام شاشات متعددة مع لوحات المفاتيح والخلفيات ومشغّلات التطبيقات.
لوحة المفاتيح البرمجية
يمكن عرض لوحة مفاتيح على شاشة ثانوية إذا تم ضبط الشاشة على إتاحة زخارف النظام. يظهر محرِّر طريقة الإدخال تلقائيًا إذا طلب أحد الحقول النصية إدخال نص على هذا الشاشة.
الخلفية
في الإصدار 10 من Android (المستوى 29 من واجهة برمجة التطبيقات)، يمكن أن تتضمّن الشاشات الثانوية خلفية. ينشئ
الإطار نسخة منفصلة من WallpaperService.Engine
لكل
شاشة. تأكَّد من أنّ سطح كل محرك مرسوم بشكل مستقل. يمكن للمطوّرين carregar مواد العرض باستخدام سياق العرض في
WallpaperService.Engine#getDisplayContext()
. تأكَّد أيضًا من
WallpaperInfo.xml
مجموعات الملفات android:supportsMultipleDisplays="true"
.
مشغّلات التطبيقات
توفّر فئة فلتر الأهداف الجديدة، SECONDARY_HOME
، نشاطًا مخصّصًا
للشاشات الثانوية. يتم استخدام نُسخ من النشاط على جميع الشاشات التي تسمح بعرض زخارف النظام، واحدة لكل شاشة.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
يجب أن يتضمّن النشاط وضع تشغيل لا يمنع ظهور نُسخ متعددة
ويمكنه التكيف مع أحجام الشاشات المختلفة. لا يمكن أن يكون وضع الإطلاق
singleInstance
أو singleTask
.
على سبيل المثال، يتيح تطبيق Launcher3
في AOSP نشاط
SECONDARY_HOME
.
مقاييس النوافذ
طرح الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) طُرق WindowManager
التالية
لتوفير حدود التطبيقات التي تعمل في وضع "النوافذ المتعددة":
-
getCurrentWindowMetrics()
: تعرِض عنصرWindowMetrics
حالة وضع النوافذ الحالي للنظام. -
getMaximumWindowMetrics()
: تعرِض القيمةWindowMetrics
أكبر حالة ممكنة للنافذة في النظام.
توفّر طريقتا مكتبة Jetpack WindowManager computeCurrentWindowMetrics()
وcomputeMaximumWindowMetrics()
وظائف مشابهة
على التوالي، ولكن مع التوافق مع الإصدارات القديمة حتى المستوى 14 من واجهة برمجة التطبيقات.
للحصول على مقاييس للشاشات غير الشاشة الحالية، اتّبِع الخطوات التالية (كما هو موضّح في مقتطف الرمز البرمجي):
- إنشاء سياق عرض
- إنشاء سياق نافذة للشاشة
- الحصول على
WindowManager
لسياق النافذة - الحصول على
WindowMetrics
من الحد الأقصى لمساحة العرض المتاحة للتطبيق
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
الطرق المتوقّفة
تم إيقاف طريقتَي 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 في وضع "النوافذ المتعددة" أو خرج منه. يُرسِل النظام إلى الأسلوب قيمة "صحيح" إذا كان النشاط يدخل وضع "تعدد النوافذ" أو قيمة "خطأ" إذا كان النشاط يغادر وضع "تعدد النوافذ".onPictureInPictureModeChanged()
: يستدعي النظام هذه الطريقة كلما انتقل النشاط إلى وضع "نافذة ضمن النافذة" أو خرج منه. يُرسِل النظام للطريقة قيمة صحيحة إذا كان النشاط يدخل في وضع "نافذة ضمن النافذة" أو قيمة خطأ إذا كان النشاط يغادر وضع "نافذة ضمن النافذة".
تعرِض فئة 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
. يمكنك الجمع بين هذا الإعداد وسمات النوافذ المتعدّدة لطلب موقع محدّد للنافذة الجديدة. على سبيل المثال، يمكن لتطبيق تسوّق عرض عدة نوافذ مجاورة لمقارنة المنتجات.
يتيح لك الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) والإصدارات الأحدث تشغيل نسختَين من نشاط جنبًا إلى جنب في نافذة المهام نفسها في تضمين النشاط.
إذا كنت تريد السماح للمستخدمين ببدء نسخة أخرى من تطبيقك من
مشغّل التطبيقات أو شريط التطبيقات، اضبط android:resizeableActivity="true"
في بيان نشاط مشغّل التطبيقات ولا تستخدِم وضع تشغيل
يمنع ظهور نُسخ متعددة. على سبيل المثال، يمكن
إنشاء مثيل لنشاط singleInstancePerTask
عدة مرات في مهام مختلفة عند
ضبط FLAG_ACTIVITY_MULTIPLE_TASK
أو FLAG_ACTIVITY_NEW_DOCUMENT
.
في الإصدار 15 من نظام التشغيل Android (المستوى 35 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يتيح لك رمز التوافق
PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI
الإفصاح عن توافق تطبيقك
مع ميزة "النسخ المتعدّدة". يُعدّ السمة إشارة صريحة لواجهة مستخدم النظام لعرض عناصر التحكّم للمستخدم من أجل إنشاء نُسخ متعددة من التطبيق. وهي مستقلة عن وضع التشغيل، ولكن يجب عدم استخدامها إلا عندما يكون وضع التشغيل لنشاط أو تطبيق متوافقًا مع السمة، على سبيل المثال، عندما لا يكون وضع التشغيل هو singleInstance
.
عند تشغيل نُسخ متعددة من تطبيق في نوافذ منفصلة على جهاز folded ، قد يتم إرسال نسخة واحدة أو أكثر إلى الخلفية في حال تغيّر وضع الجهاز. على سبيل المثال، لنفترض أنّه تم فتح الجهاز وأنّه يحتوي على نسختَين من التطبيق قيد التشغيل في نافذتَين منفصلتَين على كل جانب من الجهاز. في حال طي الجهاز، قد يتم إنهاء إحدى المثيلات بدلاً من محاولة ملاءمة النوافذ لكلتا المثيلتَين على شاشة أصغر حجمًا.
إثبات ملكية وضع النوافذ المتعددة
سواء كان تطبيقك يستهدف المستوى 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"
، عليك تشغيل تطبيقك على جهاز يعمل بالإصدار 7.0 من Android إلى 11 ومحاولة وضع التطبيق في وضعَي "تقسيم الشاشة" و"وضع الشاشات المتعددة". تأكَّد من أنّ التطبيق يظل في
وضع ملء الشاشة عند إجراء ذلك.
مصادر إضافية
لمزيد من المعلومات عن ميزة "وضع النوافذ المتعددة" في Android، يُرجى الاطّلاع على:
- نموذج MultiWindowPlayground لنظام التشغيل Android
محتوى مقترَح لك * ملاحظة: يتم عرض نص الرابط عندما يكون JavaScript غير مفعَّل * وضع توافق الأجهزة * إتاحة تغيير حجم الشاشة الكبيرة * معالجة تغييرات الضبط