في ما يلي التعديلات التي تم إجراؤها على هذه المناطق الخاصة بالشاشة:
يتوافق الإصدار 10 من نظام التشغيل Android مع لوحة المفاتيح البرمجية للتطبيقات التي تعمل على شاشة غير الشاشة التلقائية.
التطبيقات التي تعمل على شاشة عرض غير تلقائية
في ما يتعلق بالشاشة التي تعرض لوحة المفاتيح البرمجية الخاصة بأداة Input Method Editor (IME)، تتوفّر أوضاع مختلفة. تظهر لوحة المفاتيح البرمجية على:
- الشاشة نفسها التي يظهر عليها التطبيق الذي تم التركيز عليه
- شاشة العرض التلقائية أثناء تشغيل التطبيق الذي تم التركيز عليه على شاشة عرض غير تلقائية
- عدم العرض على الإطلاق
يحدّد النظام وضع العرض الذي سيتم استخدامه استنادًا إلى إعدادات الشاشة التي يظهر عليها التطبيق الذي تم التركيز عليه. لمزيد من التفاصيل، راجِع:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
الشكل 1. لوحة مفاتيح برنامج IME كما تظهر على الشاشة الثانوية، بما في ذلك التطبيق المستهدف
يستخدم النظام طريقة إدخال واحدة، ولكن يمكنه التبديل بين شاشات العرض لتتبُّع تركيز المستخدم. يتوقّع نظام التشغيل Android 10 تلقائيًا أن تعمل جميع طرق الإدخال (IME) التابعة للجهات الأولى والثالثة على مراجعة التنسيق وتغيير الحجم وفقًا لحجم الشاشة الجديد عند إنشائها.
إذا كان هناك اتصال نشط على الشاشة (أ)، وطلب حقل إدخال التركيز على الشاشة (ب)، سيحدث التدفق التالي:
- يأتي اتصال الإدخال الجديد من حقل الإدخال في الشاشة (ب).
- تتحقّق
InputMethodManagerService
مما إذا كان يجب الموافقة على الاتصال. - يتم اختيار شاشة لعرض محرر أسلوب الإدخال. إذا كانت شاشة العرض B تتوافق مع عرض محرر أسلوب الإدخال (IME) ويُسمح بعرضه، سيتم استخدام شاشة العرض B. بخلاف ذلك، يتم اختيار شاشة العرض الأساسية للجهاز.
- إذا لم تكن الشاشة المحدّدة هي الشاشة (أ)، تتم إعادة إنشاء الاتصال. يتم تدمير
InputMethodService
ثم إنشاؤه مرة أخرى.
قيود الأمان
لن يعرض النظام طريقة إدخال على الشاشات الافتراضية التي لا يملكها. ويرجع ذلك إلى مخاوف أمنية من أن ينشئ تطبيق ضار شاشة افتراضية مع تفعيل إمكانية استخدام عناصر النظام، وأن يقرأ معلومات حساسة من الشاشة، مثل اقتراحات الكتابة والخلفيات المخصّصة.
التنفيذ
في الإصدار 9 من نظام Android (والإصدارات الأقدم)، لم تكن طريقة الإدخال متاحة إلا على الشاشة التلقائية، كما هو موضّح في طُرق الإدخال على الشاشة. في نظام التشغيل Android 10 (والإصدارات الأحدث)، يمكن للمستخدم التبديل بين حقول إدخال النص المختلفة على شاشات مختلفة من خلال تبديل التركيز، ويتم نقل نافذة IME إلى الشاشات الثانوية.
يتم في التنفيذ في WindowManager
تتبُّع نافذة أسلوب الإدخال (نافذة محرِّر أسلوب الإدخال التي يتم فيها رسم لوحة المفاتيح الافتراضية) وهدف أسلوب الإدخال (النافذة التي يتم فيها إدخال بيانات محرِّر أسلوب الإدخال) لإدارة حالة محرِّر أسلوب الإدخال.
بالنسبة إلى InputMethodManagerService
(نظام إدارة الإدخال المتعدد الحواس)، لا يمكن لأي آلية مدمجة أخرى نقل تغيير العرض إلى InputMethodService
(نظام إدارة الإدخال) وإعادة ضبط تخطيط لوحة المفاتيح في وقت التشغيل عند نقل التركيز إلى شاشة أخرى.
لتحقيق التبديل بين شاشات العرض في نافذة محرر أسلوب الإدخال (IME)، ينفّذ نظام التشغيل Android 10 ما يلي:
- يتم الآن تتبُّع محرّك طريقة الإدخال ونافذة استهداف الإدخال لكل شاشة عرض في
DisplayContent#mInputMethodWindow
وDisplayContent#mInputMethodTarget
، ما يتيح لخدمة WindowManager (WM) إدارة حالة التركيز في محرّك طريقة الإدخال بشكل مستقل عن كل شاشة عرض. - من جهة نظام إدارة الإدخال المتعدد الوسائط (IMMS)، عند تلقّي طلب تركيز من عميل تطبيق على الشاشة الخارجية من خلال
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
، يتم أولاً إلغاء ربط خدمة طريقة الإدخال الحالية، ثم إعادة ربط الخدمة لإعادة ربط رمز نافذة محرر طريقة الإدخال (IME) الجديد بالشاشة الخارجية فيonServiceConnected()
. - من جهة نظام إدارة المخزون، بعد تلقّي
IMS#attachToken
، يتم اتّباع الخطوات التالية:- يتم استدعاء
ContextImpl#updateDisplay
لتعديل عرض سياق الخدمة فيInputMethodService#attachToken()
. يؤدي ذلك إلى استدعاءViewGroup#addView()
لمراجعة تخطيط لوحة المفاتيح وتعديله ليناسب الشاشة المستهدفة من خلال التحقّق من السياق الحالي. - بعد استدعاء
DisplayContent#setInputMethodWindowLocked()
، يرسل التنفيذ تغييرات إعدادات العرض على مستوى العملية باستخدامWindowProcessController
إلى عملية IME لتجاوز الموارد وعرض المقاييس. - يحصل عميل
InputMethodService
على الإعداد الصحيح مع مقاييس العرض الصحيحة بعدonConfigurationChanged()
وطلبViewGroup#addView()
لإعادة تهيئة عرض الإدخال.
- يتم استدعاء