دعم زخارف النظام

في ما يلي التعديلات التي يتم إجراؤها على هذه المواضع الخاصة بالعرض:

ديكورات النظام

يتيح نظام 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. الحل المقترح:

  1. يمكنك استخدام واجهة برمجة تطبيقات WallpaperManager لضبط الخلفيات.
  2. تم الحصول على WallpaperManager من Context. ويحتوي كل كائن Context على معلومات عن الشاشة (Context#getDisplay()/getDisplayId()). لذلك، يمكنك الحصول على displayId من مثيل WallpaperManager بدون إضافة طرق جديدة.
  3. من جانب إطار العمل، استخدِم displayId الذي تم الحصول عليه من Context وربطه بمعرّف ثابت (مثل منفذ عرض مادي). ويمكنك استخدام المعرّف الثابت للاحتفاظ بالخلفية التي تم اختيارها.

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

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

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

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

التنفيذ

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

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

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

الشكل 3. المنطق الاحتياطي للخلفية لشاشات العرض الثانوية