في ما يلي التعديلات التي تم إجراؤها على هذه المناطق الخاصة بالشاشة:
زخارف النظام
يتيح نظام التشغيل Android 10 ضبط الشاشات الثانوية لعرض زخارف معيّنة للنظام، مثل الخلفية وشريط التنقّل والشاشة الرئيسية. تعرض الشاشة الأساسية تلقائيًا جميع زخارف النظام، وتعرض الشاشة الثانوية الزخارف التي تم تفعيلها اختياريًا. يمكن ضبط إتاحة "محرر أسلوب الإدخال" (IME) بشكل منفصل عن زخارف النظام الأخرى.
استخدِم DisplayWindowSettings#setShouldShowSystemDecorsLocked()
لإضافة ميزة زينة النظام على شاشة معيّنة أو قدِّم
قيمة تلقائية في /data/system/display_settings.xml
. للحصول على أمثلة،
يُرجى الاطّلاع على إعدادات عرض النافذة.
التنفيذ
يتم أيضًا عرض DisplayWindowSettings#setShouldShowSystemDecorsLocked()
في
WindowManager#setShouldShowSystemDecors()
للاختبار. لا يؤدي تفعيل هذه الطريقة
بغرض تفعيل ديكورات النظام إلى إضافة نوافذ ديكورات كانت
غير متوفّرة سابقًا أو إزالتها إذا كانت متوفّرة سابقًا. في معظم
الحالات، لا يتم تفعيل ميزة تغيير ديكورات النظام بشكل كامل إلا بعد
إعادة تشغيل الجهاز.
عادةً ما يتم التحقّق من توافق زينة النظام في قاعدة رمز WindowManager
من خلال DisplayContent#supportsSystemDecorations()
، في حين يتم التحقّق من الخدمات الخارجية (مثل واجهة مستخدم النظام للتحقّق مما إذا كان يجب عرض شريط التنقّل
) من خلال WindowManager#shouldShowSystemDecors()
.
لفهم ما يمكن التحكّم فيه من خلال هذا الإعداد، اطّلِع على نقاط الاتصال
في هذه الطرق.
نوافذ ديكور واجهة مستخدِم النظام
يضيف نظام التشغيل Android 10 ميزة استخدام نافذة زخرفة النظام
لشريط التنقّل فقط، لأنّ شريط التنقّل أساسي
للتنقّل بين الأنشطة والتطبيقات. يعرض شريط التنقّل تلقائيًا ميزتَي
الرجوع والصفحة الرئيسية. لا يتم تضمين هذا العنصر إلا إذا كانت الشاشة المستهدَفة تتيح استخدام
ديكورات النظام (راجِع DisplayWindowSettings
).
شريط الحالة هو نافذة نظام أكثر تعقيدًا، لأنّه يحتوي أيضًا على "مركز الإشعارات" و"الإعدادات السريعة" و"شاشة القفل". في الإصدار 10 من نظام التشغيل Android، لا يتوفّر شريط الحالة على الشاشات الثانوية. لذلك، لا تتوفّر الإشعارات والإعدادات وقفل الشاشة الكامل إلا على الشاشة الأساسية.
لا تتوفّر نافذة النظام نظرة عامة/التطبيقات المستخدَمة مؤخرًا على الشاشات الثانوية. في Android 10، لا يعرض AOSP علامة التبويب "النشاطات الأخيرة" إلا على الشاشة التلقائية، كما يحتوي على أنشطة من جميع الشاشات. عند تشغيل نشاط من ملف السجلّ "الأخيرة"، يتم تلقائيًا عرض النشاط الذي كان معروضًا على شاشة ثانوية في المقدّمة على هذه الشاشة. تتضمن هذه الطريقة بعض المشاكل المعروفة، مثل عدم التحديث على الفور عندما تظهر التطبيقات على شاشات أخرى.
التنفيذ
لتنفيذ ميزات إضافية لواجهة مستخدم النظام، على المصنّعين استخدام ملف برمجي واحد لواجهة مستخدم النظام يستمع إلى عمليات إضافة/إزالة الشاشات ويعرض المحتوى المناسب.
يجب أن يتعامل مكوّن واجهة مستخدم النظام المتوافق مع ميزة "العرض المتعدّد" (MD) مع الحالات التالية:
- إعداد شاشات متعددة عند بدء التشغيل
- الشاشة المُضافة أثناء التشغيل
- تمّت إزالة الشاشة أثناء التشغيل
عندما يرصد واجهة المستخدم النظام إضافة شاشة قبل WindowManager، يؤدي ذلك إلى
حدوث تعارض. ويمكن تجنُّب ذلك من خلال تنفيذ طلب استدعاء مخصّص من System UI إلى
WindowManager عند إضافة شاشة بدلاً من الاشتراك في أحداث
DisplayManager.DisplayListener
. للحصول على مرجع لتنفيذ التطبيق،
راجِع CommandQueue.Callbacks#onDisplayReady
للتعرّف على توافق شريط التنقّل
وWallpaperManagerInternal#onDisplayReady
للتعرّف على توافق الخلفيات.
بالإضافة إلى ذلك، يوفّر نظام التشغيل Android 10 الميزات التالية:
- تتحكّم فئة
NavigationBarController
في جميع الوظائف المرتبطة بأشرطة التنقّل. - لعرض شريط تنقّل مخصّص، يُرجى الاطّلاع على
CarStatusBar
. - لم يعُد
TYPE_NAVIGATION_BAR
مقتصرًا على مثيل واحد ويمكن استخدامه لكل شاشة. - تم تعديل
IWindowManager#hasNavigationBar()
لتضمين المَعلمةdisplayId
لواجهة المستخدم في النظام فقط.
قاذفة القنابل
في Android 10، تحتوي كل شاشة تم ضبطها لتتوافق مع
ديكورات النظام على حزمة منزلية مخصّصة لأنشطة مشغّل التطبيقات من النوع
WindowConfiguration#ACTIVITY_TYPE_HOME
تلقائيًا. يستخدم كل شاشة
نسخة منفصلة من نشاط مشغّل التطبيقات.
الشكل 1: مثال على مشغّل تطبيقات مخصّص للشاشات المتعددة
platform/development/samples/MultiDisplay
لا تتوافق معظم مشغّلات التطبيقات الحالية مع عمليات التشغيل المتعدّدة، كما أنّها لم يتم تحسينها
لتناسب أحجام الشاشات الكبيرة. ومن المتوقّع أيضًا أن تختلف التجربة على الشاشة الثانوية/الخارجية. لتوفير نشاط مخصّص للشاشات
الثانوية، يقدّم نظام التشغيل Android 10 فئة SECONDARY_HOME
في فلاتر
النوايا. يتم استخدام نُسخ من هذا النشاط على جميع الشاشات التي تتيح استخدام زينة النظام، واحدة لكل شاشة.
<activity> ... <intent-filter> <category android:name="android.intent.category.SECONDARY_HOME" /> ... </intent-filter> </activity>
يجب أن يتضمّن النشاط وضع تشغيل لا يمنع استخدام عدة
عمليات منه، ومن المتوقّع أن يتكيّف مع أحجام الشاشات المختلفة. لا يمكن أن يكون وضع الإطلاق
singleInstance
أو singleTask
.
التنفيذ
في Android 10، RootActivityContainer#startHomeOnDisplay()
يختار تلقائيًا المكوّن والهدف المطلوبَين استنادًا إلى الشاشة
التي يتم فيها تشغيل الشاشة الرئيسية. يحتوي RootActivityContainer#resolveSecondaryHomeActivity()
على منطق البحث عن مكوّن نشاط مشغّل التطبيقات استنادًا إلى مشغّل التطبيقات الذي تم اختياره حاليًا، ويمكنه استخدام الإعداد التلقائي للنظام إذا لزم الأمر (راجِع ActivityTaskManagerService#getSecondaryHomeIntent()
).
القيود المتعلقة بالأمان
بالإضافة إلى القيود التي تنطبق على الأنشطة على الشاشات الثانوية، لتجنُّب احتمال أن ينشئ تطبيق ضار شاشة افتراضية مفعَّلة فيها ديكورات النظام ويقرأ معلومات حسّاسة للمستخدم من الشاشة، لا يظهر مشغّل التطبيقات إلا على الشاشات الافتراضية التي يملكها النظام. لا يعرض مشغّل التطبيقات المحتوى على الشاشات الافتراضية غير المخصّصة للنظام.
الخلفيات
في الإصدار 10 من نظام التشغيل Android (والإصدارات الأحدث)، يمكن استخدام الخلفيات على الشاشات الثانوية:
الشكل 2: خلفية متحركة على الشاشة الداخلية (أعلى) والشاشة الخارجية (أسفل)
يمكن للمطوّرين الإفصاح عن توفّر ميزة الخلفية من خلال توفير
android:supportsMultipleDisplays="true"
في تعريف
WallpaperInfo
بتنسيق XML. من المفترض أيضًا أن يحمِّل مطوّرو الخلفيات مواد العرض باستخدام سياق العرض في
WallpaperService.Engine#getDisplayContext()
.
ينشئ إطار العمل مثيلًا واحدًا من WallpaperService.Engine
لكل شاشة، بحيث يكون لكل محرّك مساحة عرض وسياق عرض خاص به. على المطوِّر التأكّد من أنّ كل محرك يمكنه الرسم بشكل مستقل وبمعدّلات مختلفة للإطارات مع مراعاة ميزة VSYNC.
اختيار خلفيات للشاشات الفردية
لا يقدّم نظام التشغيل Android 10 دعمًا مباشرًا للنظام الأساسي لاختيار الخلفيات
للشاشات الفردية. ولتحقيق ذلك، يجب توفُّر معرّف شاشة ثابت
للحفاظ على إعدادات الخلفية لكل شاشة.
Display#getDisplayId()
ديناميكي، لذا لا يمكن ضمان أن يكون لرقم تعريف الشاشة
الخارجية الرقم التعريفي نفسه بعد إعادة التشغيل.
ومع ذلك، أضاف نظام التشغيل Android 10 DisplayInfo.mAddress
،
الذي يحتوي على معرّفات ثابتة للشاشات الخارجية ويمكن استخدامه لتنفيذ
كامل في المستقبل. لقد فات الأوان لتنفيذ المنطق
لنظام التشغيل Android 10. الحل المقترَح:
- استخدِم واجهة برمجة التطبيقات
WallpaperManager
لضبط الخلفيات. - يتم الحصول على
WallpaperManager
منContext
كائن، ويحتوي كل كائنContext
على معلومات عن الشاشة (Context#getDisplay()/getDisplayId()
) المقابلة. لذلك، يمكنك الحصول علىdisplayId
من مثيلWallpaperManager
بدون إضافة طرق جديدة. - من جهة الإطار، استخدِم
displayId
الذي تم الحصول عليه من عنصرContext
واربطه بمعرّف ثابت (مثل منفذ شاشة ماديّة). استخدِم المعرّف الثابت للحفاظ على الخلفية التي تم اختيارها.
يستخدم هذا الحلّ البديل عمليات التنفيذ الحالية لأدوات اختيار الخلفيات. إذا تم فتحه على شاشة معيّنة واستخدَم السياق الصحيح، عند طلب ضبط خلفية، يمكن للنظام التعرّف على الشاشة تلقائيًا.
إذا كنت بحاجة إلى ضبط خلفية لشاشة غير الشاشة
الحالية، أنشئ عنصرًا جديدًا من النوع Context
للشاشة المستهدفة
(Context#createDisplayContext
) واحصل على مثيل
WallpaperManager
من تلك الشاشة.
القيود المتعلقة بالأمان
لن يعرض النظام خلفيات على الشاشات الافتراضية التي لا يملكها. ويعود السبب في ذلك إلى مخاوف تتعلق بالأمان، إذ يمكن لتطبيق ضار إنشاء شاشة افتراضية مع تفعيل ميزة "ديكورات النظام" وقراءة معلومات حساسة تخص المستخدم من الشاشة (مثل صورة شخصية).
التنفيذ
في Android 10، تقبل واجهات IWallpaperConnection#attachEngine()
وIWallpaperService#attach()
المَعلمة
displayId
لإنشاء اتصالات لكل شاشة.
WallpaperManagerService.DisplayConnector
يُنشئ محركًا
لخلفية وربطًا لكل شاشة. في WindowManager، يتم
إنشاء عناصر التحكّم في الخلفية لكل عنصر DisplayContent
عند الإنشاء بدلاً من
WallpaperController
واحد لجميع الشاشات.
تم تعديل بعض عمليات تنفيذ طريقة WallpaperManager
العلنية (مثل
WallpaperManager#getDesiredMinimumWidth()
) لاحتساب
وتقديم معلومات للعروض المقابلة.
WallpaperInfo#supportsMultipleDisplays()
وتمّت إضافة سمة
resource المقابلة، حتى يتمكّن مطوّرو التطبيقات من الإبلاغ عن
خلفيات الشاشة الجاهزة لشاشات متعددة.
إذا كانت خدمة الخلفية المعروضة على الشاشة التلقائية لا تتوافق مع الشاشات المتعددة، يعرض النظام الخلفية التلقائية على الشاشات الثانوية.
الشكل 3: منطق النسخ الاحتياطي للخلفية على الشاشات الثانوية