الممارسات المقترَحة

تطبيقات للأجهزة القابلة للطي والشاشات المتعددة

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

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

حظر الوصول إلى الشاشات

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

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

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

ولمزيد من المعلومات، يمكنك الاطّلاع على ما يلي:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#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 لتعريف الشاشة. في سمة الاسم، والتي تبلغ 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>

لمعرفة التفاصيل، يُرجى الاطّلاع على معرّفات العرض الثابتة.

ولمزيد من المعلومات، يمكنك الاطّلاع على ما يلي: