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