في ما يلي التعديلات التي يتم إجراؤها على هذه المواضع الخاصة بالعرض:
ديكورات النظام
يتيح نظام Android 10 ضبط الإعدادات الثانوية لعرض زخارف معينة في النظام، مثل الخلفية أو شريط التنقل ومشغِّل التطبيقات. تعرض الشاشة الأساسية تلقائيًا جميع أشكال زخارف النظام وتعرض الشاشات الثانوية تلك التي يتم تفعيلها اختياريًا. دعم محرر أسلوب الإدخال يمكن ضبطها بشكل منفصل عن زخارف النظام الأخرى.
استخدام "DisplayWindowSettings#setShouldShowSystemDecorsLocked()
"
إضافة دعم لزخارف النظام على شاشة معينة أو توفير
كقيمة تلقائية في /data/system/display_settings.xml
. على سبيل المثال،
راجِع إعدادات نافذة العرض.
التنفيذ
تعرض DisplayWindowSettings#setShouldShowSystemDecorsLocked()
أيضًا في
WindowManager#setShouldShowSystemDecors()
للاختبار. تشغيل هذه الطريقة
بقصد تمكين ديكورات النظام لا تضيف نوافذ للديكور كانت
مفقودة، أو إزالتها إذا كانت موجودة من قبل. في معظم
فإن تغيير دعم زخارف النظام لا يكون ساري المفعول إلا بعد
إعادة تشغيل الجهاز.
للتحقّق من إمكانية استخدام زخارف النظام في قاعدة رموز WindowManager
تمر عادةً خلال DisplayContent#supportsSystemDecorations()
أثناء
تتحقق من الخدمات الخارجية (مثل واجهة مستخدم النظام للتحقق مما إذا كان شريط التنقل)
إظهاره) استخدم WindowManager#shouldShowSystemDecors()
.
لمعرفة ما يتم التحكم فيه من خلال هذا الإعداد، استكشف نقاط اتصال
هذه الطرق.
نوافذ ديكور واجهة مستخدم النظام
Android 10 يتيح الآن استخدام نافذة ديكور النظام
لشريط التنقّل فقط، لأنّ شريط التنقّل ضروري
للتنقل بين الأنشطة والتطبيقات. يعرض شريط التنقل تلقائيًا
تكاليف العودة والمنزل لا يتم تضمين ذلك إلا إذا كانت الشاشة المستهدَفة تتوافق
زخارف النظام (يمكنك الاطّلاع على DisplayWindowSettings
).
ويعتبر شريط الحالة نافذة نظام أكثر تعقيدًا، لأنه ويحتوي أيضًا على "مركز الإشعارات" و"الإعدادات السريعة" و"شاشة القفل". في Android 10، شريط الحالة غير متاح على الشاشات الثانوية. ولذلك، لا تتوفر الإشعارات والإعدادات وقفل المفاتيح الكامل إلا على الشاشة الأساسية.
نافذة النظام نظرة عامة/العناصر الأخيرة غير متاحة في المرحلة الثانوية. الشاشات. في نظام التشغيل 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()
).
القيود الأمنية
بالإضافة إلى القيود التي تنطبق على الأنشطة على الشاشات الثانوية، لتجنُّب احتمالية أن ينشئ تطبيق ضار شاشة افتراضية مع تفعيل زينة النظام وقراءة المعلومات الحساسة للمستخدم من السطح، يظهر مشغّل التطبيقات فقط على الشاشات الافتراضية التي يملكها النظام. لا يعرض مشغِّل التطبيقات المحتوى على الشاشات الافتراضية غير التابعة للنظام.
الخلفيات
الخلفيات متوافقة في نظام التشغيل Android 10 (والإصدارات الأحدث) على الشاشات الثانوية:
الشكل 2. خلفية متحركة على الأجهزة الداخلية (أعلاه) والخارجية الشاشات (أدناه)
يمكن للمطوّرين الإعلان عن دعمهم لميزة الخلفية من خلال توفير
android:supportsMultipleDisplays="true"
في
تعريف XML لـ WallpaperInfo
مطورو الخلفيات أيضًا
ومن المتوقع أن يتم تحميل الأصول باستخدام سياق العرض
WallpaperService.Engine#getDisplayContext()
ينشئ إطار العمل مثيل WallpaperService.Engine
واحدًا.
لكل شاشة، بحيث يكون لكل محرك سطحه الخاص وسياق العرض. تشير رسالة الأشكال البيانية
إلى التأكّد من أن كل محرك يمكنه الرسم بشكلٍ مستقل
بمعدلات عرض إطارات مختلفة، مع مراعاة VSYNC.
اختيار خلفيات لشاشات فردية
لا يتيح نظام Android 10 اختيار الخلفيات مباشرةً على النظام الأساسي.
للشاشات الفردية. ولتحقيق ذلك، غالبًا ما يكون معرّف العرض الثابت
اللازمة للاحتفاظ بإعدادات الخلفية لكل شاشة.
لعبة Display#getDisplayId()
ديناميكية، لذا ليس هناك ما يضمن
سيظهر على الشاشة الفعلية المعرّف نفسه بعد إعادة التشغيل.
مع ذلك، تمت إضافة DisplayInfo.mAddress
إلى نظام Android 10
ويشتمل على معرّفات ثابتة للعروض المادية ويمكن استخدامها
تنفيذها في المستقبل. لسوء الحظ، فات الأوان لتنفيذ المنطق
لنظام التشغيل 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()
وقيمة مطابقة
والموارد حتى يتمكن مطورو التطبيقات من الإبلاغ عن أي
الخلفيات جاهزة لشاشات متعددة.
إذا لم تكن خدمة الخلفية المعروضة على الشاشة التلقائية متوافقة سيعرض النظام الخلفية الافتراضية على الشاشة الثانوية ما يعرضه.
الشكل 3. المنطق الاحتياطي للخلفية لشاشات العرض الثانوية