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

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

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

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

لمزيد من التفاصيل، اطّلِع على معرّفات العرض الثابتة.

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