בהמשך מפורטים העדכונים שבוצעו בתחומים הספציפיים האלה של המסכים:
ב-Android 10 יש תמיכה במקלדת תוכנה לאפליקציות שפועלות במסך שאינו מסך ברירת המחדל.
אפליקציות שפועלות במסך שאינו מסך ברירת המחדל
יש כמה מצבים שבהם מוצגת מקלדת התוכנה של עורך שיטות הקלט (IME). המקלדת הווירטואלית מוצגת ב:
- אותו מסך שבו מוצגת האפליקציה שבה מתמקדים.
- תצוגת ברירת המחדל כשהאפליקציה שבה מתמקדים פועלת במסך שאינו מסך ברירת המחדל.
- ללא הצגה בכלל.
המערכת קובעת באיזה מצב להשתמש על סמך ההגדרות של המסך שבו מוצגת האפליקציה שבה מתמקדים. פרטים נוספים זמינים במאמרים הבאים:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
איור 1. מקלדת התוכנה של IME כפי שהיא מופיעה במסך המשני, כולל אפליקציית היעד
המערכת משתמשת ב-IME יחיד, אבל היא יכולה לעבור בין המסכים בהתאם למיקום המיקוד של המשתמש. ב-Android 10, כל ממשקי ה-IME של צד ראשון ושל צד שלישי צפויים לשנות את הפריסה ולשנות את הגודל בהתאם לגודל המסך החדש בזמן היצירה.
אם יש חיבור פעיל במסך א' ושדה קלט מבקש להתמקד בקלט במסך ב', מתרחש התהליך הבא:
- חיבור קלט חדש מגיע משדה הקלט במסך ב'.
InputMethodManagerService
בודק אם צריך לאשר את החיבור.- בחירת תצוגה ל-IME. אם המסך B תומך בהצגת ה-IME ומותר להציג אותו, המערכת תשתמש במסך B. אחרת, המסך הראשי של המכשיר ייבחר.
- אם המסך שנבחר הוא לא מסך א', החיבור מתחדש.
InputMethodService
נהרס ואז נוצר מחדש.
הגבלת אבטחה
המערכת לא תציג IME במסכים וירטואליים שלא בבעלות המערכת. הסיבה לכך היא שיקולי אבטחה, כי אפליקציה זדונית עשויה ליצור תצוגה וירטואלית עם תמיכה בקישוט המערכת ולקרוא ממנה מידע רגיש של המשתמש, כמו תחזיות הקלדה ורקעים מותאמים אישית.
הטמעה
ב-Android 9 (וגרסאות קודמות), ה-IME היה זמין רק במסך ברירת המחדל, כפי שמתואר בקטע שיטות קלט במסך. ב-Android 10 ואילך, המשתמש יכול לעבור בין שדות טקסט שונים של קלט במסכים שונים על ידי שינוי המיקוד, וחלון ה-IME עובר למסכים המשניים.
כדי לנהל את מצב ה-IME, ההטמעה ב-WindowManager
עוקבת אחרי החלון של שיטת הקלט (חלון ה-IME שבו מצויר מקלדת הסימון) ואחרי היעד של שיטת הקלט (החלון שאליו מגיע הקלט של ה-IME).
ב-InputMethodManagerService
(IMMS), אין מנגנון מובנה אחר שיכול להעביר את שינוי המסך אל InputMethodService
(IMS) ולקבוע מחדש את פריסת המקלדת בזמן הריצה כשהמיקוד מועבר למסך אחר.
כדי לאפשר את המעבר של חלון ה-IME בין המסכים, ב-Android 10 מוטמעים הרכיבים הבאים:
- עכשיו מתבצע מעקב אחרי חלון היעד של הקלט וה-IME לכל מסך ב-
DisplayContent#mInputMethodWindow
וב-DisplayContent#mInputMethodTarget
, כדי ש-WindowManager (WM) יוכל לנהל את מצב המיקוד של ה-IME בנפרד מכל מסך. - בצד IMMS, כשבקשת המיקוד של לקוח האפליקציה מהמסך החיצוני מתקבלת דרך
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, קודם מבטלים את הקישור של שירות שיטת הקלט הנוכחית ואז מקשרים מחדש את השירות כדי לצרף מחדש את אסימון החלון החדש של ה-IME למסך החיצוני ב-onServiceConnected()
. - בצד ה-IMS, אחרי קבלת
IMS#attachToken
מתרחש התהליך הבא:ContextImpl#updateDisplay
נקרא כדי לעדכן את התצוגה של הקשר השירות ב-InputMethodService#attachToken()
. הפונקציהViewGroup#addView()
מפעילה בדיקה של ההקשר הנוכחי כדי לשנות את הפריסה של המקלדת ולהתאים אותה לתצוגת היעד.- אחרי הקריאה ל-
DisplayContent#setInputMethodWindowLocked()
, ההטמעה שולחת שינויים בהגדרות התצוגה ברמת התהליך באמצעותWindowProcessController
לתהליך ה-IME כדי לשנות את המשאבים ואת מדדי התצוגה. - לקוח
InputMethodService
מקבל את ההגדרה הנכונה עם מדדי התצוגה הנכונים אחריonConfigurationChanged()
והקריאהViewGroup#addView()
כדי לאתחל מחדש את תצוגת הקלט.