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

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

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

في هذه الحالة، من المفترض أن يرصد 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>

لمعرفة التفاصيل، يُرجى الاطّلاع على معرّفات الشبكة الإعلانية الثابتة.

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