إتاحة زينة النظام

تظهر التعديلات التي تم إجراؤها على هذه المناطق الخاصة بالشاشة في هذه الصفحة.

زخارف النظام

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

استخدِم DisplayWindowSettings#setShouldShowSystemDecorsLocked لإتاحة استخدام زخارف النظام على شاشة معيّنة أو تقديم قيمة تلقائية في /data/system/display_settings.xml. للحصول على أمثلة، يُرجى الاطّلاع على إعدادات نافذة العرض.

التنفيذ

يتم أيضًا عرض DisplayWindowSettings#setShouldShowSystemDecorsLocked في WindowManager#setShouldShowSystemDecors للاختبار. لا يؤدي تفعيل هذه الطريقة بغرض تفعيل زخارف النظام إلى إضافة نوافذ زخرفية كانت غير متوفّرة في السابق، أو إزالتها إذا كانت متوفّرة في السابق. في معظم الحالات، لا يتم تفعيل ميزة تغيير زخارف النظام بشكل كامل إلا بعد إعادة تشغيل الجهاز.

عادةً ما يتم التحقّق من توافق زخارف النظام في قاعدة رموز WindowManager من خلال DisplayContent#supportsSystemDecorations، في حين يتم التحقّق من الخدمات الخارجية (مثل واجهة مستخدم النظام للتحقّق مما إذا كان يجب عرض شريط التنقّل ) من خلال WindowManager#shouldShowSystemDecors. لفهم ما يمكن التحكّم فيه من خلال هذا الإعداد، اطّلِع على نقاط الاتصال في هذه الطرق.

نوافذ زخارف واجهة مستخدِم النظام

يضيف Android 10 ميزة استخدام نافذة زخارف النظام لشريط التنقّل فقط، لأنّ شريط التنقّل أساسي للتنقّل بين الأنشطة والتطبيقات. يعرض شريط التنقّل تلقائيًا ميزتَي الرجوع والصفحة الرئيسية. لا يتم تضمين شريط التنقّل إلا إذا كانت الشاشة المستهدَفة تتيح استخدام زخارف النظام (راجِع DisplayWindowSettings).

شريط الحالة هو نافذة نظام أكثر تعقيدًا، لأنّه يحتوي أيضًا على مركز الإشعارات والإعدادات السريعة وشاشة القفل. في Android 10، لا يتوافق شريط الحالة مع الشاشات الثانوية. لذلك، لا تتوفّر الإشعارات والإعدادات وشاشة القفل الكاملة إلا على الشاشة الأساسية.

لا تتوفّر نافذة النظام نظرة عامة أو التطبيقات المستخدَمة مؤخرًا على الشاشات الثانوية. في Android 10، لا يعرض AOSP علامة التبويب "النشاطات الأخيرة" إلا على الشاشة التلقائية، كما يحتوي على أنشطة من جميع الشاشات. عند التشغيل من زر "الأحدث"، فإن النشاط الذي كان معروضًا على شاشة ثانوية يظهر تلقائيًا في المقدّمة على هذه الشاشة. يتضمن هذا النهج بعض المشاكل المعروفة، مثل عدم التحديث فورًا عند ظهور التطبيقات على شاشات أخرى.

التنفيذ

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

يجب أن يتعامل مكوّن واجهة مستخدِم النظام الذي يتيح استخدام الشاشات المتعددة مع الحالات التالية:

  • إعداد شاشات متعددة عند بدء التشغيل
  • إضافة شاشة أثناء التشغيل
  • الشاشة المزالة أثناء التشغيل

عندما ترصد واجهة مستخدِم النظام إضافة شاشة قبل WindowManager، فإنّ ذلك يؤدي إلى حدوث حالة تعارض. يمكنك تجنُّب ذلك من خلال تنفيذ معاودة اتصال مخصّصة من WindowManager إلى واجهة مستخدِم النظام عند إضافة شاشة بدلاً من الاشتراك في أحداث DisplayManager.DisplayListener. للحصول على نموذج للتنفيذ، يُرجى الاطّلاع على CommandQueue.Callbacks#onDisplayAddSystemDecorations لإتاحة استخدام شريط التنقّل وWallpaperManagerInternal#onDisplayAddSystemDecorations للخلفيات.

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

<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" في تعريف ‎ WallpaperInfo بتنسيق XML. من المفترض أيضًا أن يقوم مطوّرو الخلفيات بتحميل مواد العرض باستخدام سياق العرض في WallpaperService.Engine#getDisplayContext.

ينشئ الإطار نسخة واحدة من WallpaperService.Engine لكل شاشة، لذا يكون لكل محرّك سطح خاص به وسياق عرض خاص به. على المطوّر التأكّد من أنّ كل محرّك يمكنه الرسم بشكل مستقل بمعدّلات إطارات مختلفة، مع مراعاة VSync.

اختيار الخلفيات لشاشات فردية

لا يقدّم Android 10 دعمًا مباشرًا للمنصّة من أجل اختيار الخلفيات لشاشات فردية. لتحقيق ذلك، يجب توفير معرّف شاشة ثابت لحفظ إعدادات الخلفية لكل شاشة. Display#getDisplayId ديناميكي، لذا ليس هناك ما يضمن أن يكون للشاشة الفعلية المعرّف نفسه بعد إعادة التشغيل.

ومع ذلك، أضاف Android 10 DisplayInfo.mAddress الذي يحتوي على معرّفات ثابتة للشاشات الفعلية ويمكن استخدامه لتنفيذ كامل في المستقبل. ولكن فات الأوان لتنفيذ المنطق في Android 10. الحل المقترَح:

  1. استخدِم الفئة WallpaperManager لضبط الخلفيات.

    يتم الحصول على WallpaperManager من Context عنصر، ويحتوي كل عنصر Context على معلومات حول الشاشة المقابلة (Context#getDisplay/getDisplayId). بالتالي، يمكنك الحصول على displayId من نسخة WallpaperManager بدون إضافة طرق جديدة.

  2. على جانب إطار العمل، استخدِم displayId الذي تم الحصول عليه من عنصر Context واربطه بمعرّف ثابت (مثل منفذ شاشة فعلية). استخدِم المعرّف الثابت لحفظ الخلفية التي تم اختيارها.

يستخدم هذا الحل البديل عمليات التنفيذ الحالية لأدوات اختيار الخلفيات. إذا تم فتحها على شاشة معيّنة واستخدمت السياق المناسب، يمكن للنظام تحديد الشاشة تلقائيًا عند طلب ضبط خلفية.

إذا كانت هناك حاجة إلى ضبط خلفية لشاشة أخرى غير الشاشة الحالية ، أنشِئ عنصر Context جديدًا للشاشة المستهدَفة (Context#createDisplayContext) واحصل على WallpaperManager نسخة من تلك الشاشة.

القيود الأمنية

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

التنفيذ

في Android 10، تقبل واجهتا IWallpaperConnection#attachEngine وIWallpaperService#attach المَعلمة displayId لإنشاء اتصالات لكل شاشة. يغلّف WallpaperManagerService.DisplayConnector محرّك خلفية واتصالاً لكل شاشة. في WindowManager، يتم إنشاء وحدات التحكّم في الخلفية لكل عنصر DisplayContent عند الإنشاء بدلاً من WallpaperController واحد لجميع الشاشات.

تم تعديل بعض عمليات تنفيذ طريقة WallpaperManager العامة (مثل WallpaperManager#getDesiredMinimumWidth) لحساب المعلومات وتقديمها للشاشات المقابلة. تمت إضافة WallpaperInfo#supportsMultipleDisplays وسمة مورد مقابلة، حتى يتمكّن مطوّرو التطبيقات من الإبلاغ عن الخلفيات الجاهزة للشاشات المتعددة.

إذا كانت خدمة الخلفية المعروضة على الشاشة التلقائية لا تتيح استخدام شاشات متعددة، يعرض النظام الخلفية التلقائية على الشاشات الثانوية:

الشكل 3: منطق الرجوع إلى الخلفية التلقائية للشاشات الثانوية

تفعيل إمكانية استخدام الخلفيات المتحركة

في Android 10 والإصدارات الأحدث (المستوى 29 من واجهة برمجة التطبيقات)، يمكن للمطوّرين استخدام السمة android:supportsMultipleDisplays للإشارة إلى ما إذا كان يمكن أن تمتد الخلفية على شاشات مختلفة. في بيئات العرض في نافذة على سطح المكتب، حيث تكون المهام المتعددة كثيفة، يمكن أن يؤثر عرض الخلفيات المتحركة على الشاشات الخارجية بشكل كبير في وحدة معالجة الرسومات والذاكرة.

للحفاظ على موارد النظام، لا يعرض النظام الخلفيات المتحركة على الشاشات المتصلة تلقائيًا. عندما يتم تقييد خلفية متحركة من خلال إعداد النظام أو بيان التطبيق، يعرض النظام خلفية ثابتة احتياطية.

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

إذا كان جهازك يمكنه عرض نُسخ متعددة من الخلفيات المتحركة، عليك إلغاء الإعداد التالي:

مسار المورد frameworks/base/core/res/res/values/config.xml
اسم الإعداد config_isLiveWallpaperSupportedInDesktopExperience

تخصيص الخلفية الاحتياطية

إذا تم إيقاف الخلفيات المتحركة أو لم يكن المزوّد يتيح استخدامها، يستخدم النظام مكوّنًا تلقائيًا. يمكنك توجيه هذا المكوّن إلى مزوّد الخلفية الثابتة الخاص بك:

مسار المورد frameworks/base/core/res/res/values/config.xml
اسم الإعداد fallback_wallpaper_component

إتاحة استخدام الخلفيات

لتطبيق هذه التغييرات، استخدِم تراكب موارد في وقت الإنشاء في المجلد الخاص بجهازك، والذي يكون عادةً device/<vendor>/<product>/overlay/frameworks/base/core/res/res/values/.