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