تعرض هذه الصفحة اقتراحات للعمل مع شاشات عرض متعددة.
تطبيقات للأجهزة القابلة للطي والأجهزة المتعددة الشاشات
بشكل عام، يجب ألا تعتمد التطبيقات على معرّفات ثابتة أو منطق يعتمد على بعض معرّفات شاشات العرض. في معظم الحالات، يجب أن يتم تغيير حجم التطبيقات وأن تعمل على شاشات عرض مختلفة، ويجب أن يتحكّم النظام في مكان عرض التطبيقات. على سبيل المثال، لإنشاء تجربة جديدة وفريدة للأجهزة القابلة للطي وتشغيل تطبيق خاص على الشاشة الخارجية عند طي الجهاز.
في هذه الحالة، يجب أن ترصد واجهة مستخدم النظام أو أحد مكوّنات النظام الأخرى عملية الطي، وتحدّد ما إذا كان من المناسب تنفيذ إجراء، ثم تشغّل النشاط المستهدَف وتحدّد معرّف شاشة عرض خارجية كهدف التشغيل. يجب ألا ترصد التطبيقات هذا الإجراء أو تنفّذ أي إجراء استجابةً له، ثم تنفّذ عملية التشغيل على شاشة عرض معيّنة. لذلك، لا تفترض أنّ ما ينجح على جهاز واحد سينجح على أجهزة أخرى. باختصار، يؤدي الرمز البرمجي الخاص بالجهاز إلى زيادة التجزئة.
حظر الوصول إلى شاشات العرض
إذا كان إعداد الجهاز يتطلّب حظر الوصول إلى شاشة عرض واحدة أو أكثر، ننصحك باستخدام العلامة Display#FLAG_PRIVATE لتحديد شاشة العرض على أنّها خاصة. يؤدي هذا التصنيف إلى منع أي مستخدم آخر غير المالك من إضافة محتوى إلى شاشة العرض. إذا حاول أي مستخدم آخر غير المالك تشغيل نشاط أو إضافة نافذة، سيؤدي ذلك إلى ظهور SecurityException.
إذا كان النظام يملك شاشة العرض، يمكنه إضافة النوافذ وتشغيل الأنشطة.
بالإضافة إلى ذلك، يمكن للعناصر الموضوعة على شاشة العرض الوصول إليها دائمًا. إذا شغّل المالك نشاطًا على شاشة عرض، يمكن للنشاط تشغيل أنشطة أخرى على شاشة العرض هذه. نتيجةً لذلك، يكون المالك مسؤولاً عن حظر الوصول والسماح للتطبيقات الموثوق بها فقط.
بالإضافة إلى ذلك، تتم إضافة المزيد من القيود إلى شاشات العرض الافتراضية لأنّ أي تطبيق يمكنه إنشاء شاشة عرض افتراضية بدون جعلها مرئية للمستخدم. إذا لم يكن النظام يملك شاشة العرض الافتراضية، لا يُسمح إلا بالأنشطة التي تتضمّن allowEmbedded ويجب أن يكون لدى المتصل الإذن ACTIVITY_EMBEDDING.
لمزيد من المعلومات، يرجى الاطّلاع على:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplayActivityDisplay#isUidPresentDisplayManagerService#isUidPresentOnDisplay
للتحكّم بشكل مشروط في عمليات تشغيل الأنشطة، استخدِم LaunchParamsController الذي يعترض جميع عمليات تشغيل الأنشطة ويسمح لأحد مكوّنات النظام بتعديل المَعلمات المستخدَمة في عملية التشغيل. تتوفّر هذه الميزة في system_server.
ضبط إعدادات عرض النوافذ وعناصر تزيين النظام
يمكن ضبط عناصر تزيين النظام يمكن
ضبطها لكل شاشة عرض في DisplayWindowSettings. يمكن أن يوفّر تطبيق الجهاز إعدادًا تلقائيًا في /data/system/display_settings.xml.
تحدّد هذه القيمة ما إذا كانت عناصر تزيين النظام (مشغّل التطبيقات والخلفية وشريط التنقّل ونوافذ عناصر التزيين الأخرى) وأداة IME تظهر على شاشة العرض.
لمزيد من التفاصيل، يُرجى الاطّلاع على DisplayWindowSettings#shouldShowSystemDecorsLocked وDisplayWindowSettings#shouldShowImeLocked.
لتحديد شاشة العرض، استخدِم إما معرّفًا فريدًا (يستخدِم هذا الإعداد التلقائي DisplayInfo#uniqueId) أو معرّف منفذ مادي لشاشات العرض المادية (راجِع DisplayInfo#address).
على سبيل المثال، يتيح نموذج إعدادات شاشة العرض التالي عناصر تزيين النظام وأداة IME على شاشة عرض محاكاة:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
في المثال أعلاه، يتم استخدام uniqueId لتحديد شاشة العرض في السمة name، وهي overlay:1 لشاشة العرض المحاكاة.
بالنسبة إلى شاشة العرض المضمّنة، قد تكون القيمة النموذجية "local:45354385242535243453".
هناك خيار آخر وهو استخدام معلومات المنفذ المادي وضبط identifier="1"
ليتطابق مع DisplayWindowSettings#IDENTIFIER_PORT، ثم تعديل
الاسم لاستخدام التنسيق "port:<port_id>":
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
لمزيد من التفاصيل، يُرجى الاطّلاع على معرّفات شاشات العرض الثابتة.
لمزيد من المعلومات، يرجى الاطّلاع على:
التبديل بين شاشات العرض بين مهام العرض المتطابق والمهام المستضافة
في Android 17 والإصدارات الأحدث، تستخدِم DisplayManager العلامة
FLAG_ALLOWS_CONTENT_MODE_SWITCH للتحكّم في ما إذا كانت شاشة العرض تبدّل
بين مهام العرض المتطابق والمهام المستضافة tasks في وقت التشغيل. تكون هذه العلامة مفعَّلة تلقائيًا لشاشات العرض الخارجية وغير مفعَّلة لجميع شاشات العرض الأخرى.
عند توفّر FLAG_ALLOWS_CONTENT_MODE_SWITCH، تراقب DisplayManager الإعداد الآمن android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY لتحديد ما إذا كان سيتم عرض المهام بشكل متطابق أو استضافتها. على الرغم من أنّ هذا هو المنطق التلقائي، يمكن لمصنّعي المعدات الأصلية تخصيص هذا السلوك.
مخطط شاشات العرض وحركة المؤشر
في Android 17 والإصدارات الأحدث، يحدّد مخطط شاشات العرض المواضع النسبية لشاشات العرض ويقيّد حركة مؤشر الماوس على مجموعة معيّنة من شاشات العرض في المخطط.
يقرّر WindowManager تضمين شاشة عرض في المخطط ويستدعي DisplayManagerInternal.onDisplayBelongToTopologyChanged. تتحقّق DisplayManager من DisplayTopologyCoordinator.isDisplayAllowedInTopology قبل إضافة شاشة العرض. تلقائيًا، إذا كانت شاشات العرض المحلية يمكنها استضافة المهام، يضيفها النظام.
إذا كانت هناك شاشات عرض علنية متعددة يمكنها استضافة المهام، يتم التعامل مع قرار تضمين شاشة العرض التلقائية من خلال موفّر القيم المنطقية shouldIncludeDefaultDisplayInTopology الذي يتم تمريره إلى DisplayTopologyCoordinator. إذا كانت شاشة العرض التلقائية هي شاشة العرض العلنية الوحيدة التي يمكنها استضافة المهام، ستكون دائمًا في المخطط. في AOSP، يعرض موفّر القيم المنطقية true فقط إذا كانت شاشة العرض التلقائية تتيح ميزة "العرض في نافذة" أو إذا كان الإعداد الآمن Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY مضبوطًا على true.
تستعلم التطبيقات عن المخطط الحالي باستخدام DisplayManager.getDisplayTopology وتستجيب للتغييرات في المخطط من خلال تسجيل مستمع باستخدام DisplayManager.registerTopologyListener.