תמיכת קישוטי מערכת

עדכונים שבוצעו לאזורים הספציפיים האלה לתצוגה מסופקים להלן:

קישוטי מערכת

אנדרואיד 10 מוסיף תמיכה בהגדרת תצוגות משניות להצגת עיטורי מערכת מסוימים, כגון טפט, סרגל ניווט ומשגר. כברירת מחדל, התצוגה הראשית מציגה את כל עיטורי המערכת, ותצוגות משניות מציגות את אלו המופעלים באופן אופציונלי. ניתן להגדיר תמיכה בעורך שיטת קלט (IME) בנפרד מקישוטי מערכת אחרים.

השתמש DisplayWindowSettings#setShouldShowSystemDecorsLocked() כדי להוסיף תמיכה לקישוטי מערכת בתצוגה ספציפית או לספק ערך ברירת מחדל ב- /data/system/display_settings.xml . לדוגמאות, ראה הגדרות חלון תצוגה .

יישום

DisplayWindowSettings#setShouldShowSystemDecorsLocked() נחשפת גם ב- WindowManager#setShouldShowSystemDecors() לצורך בדיקה. הפעלה של שיטה זו מתוך כוונה לאפשר עיצובי מערכת אינה מוסיפה חלונות עיצוב שהיו חסרים בעבר, או מסירה אותם אם היו קיימים בעבר. ברוב המקרים, שינוי התמיכה בקישוטי המערכת מקבל תוקף מלא רק לאחר אתחול מחדש של המכשיר.

בדיקות לתמיכה בקישוטי מערכת בבסיס הקוד של WindowManager עוברים בדרך כלל דרך DisplayContent#supportsSystemDecorations() בעוד שבדיקות עבור שירותים חיצוניים (כגון מערכת ממשק המשתמש כדי לבדוק אם יש להציג את סרגל הניווט) משתמשות ב- WindowManager#shouldShowSystemDecors() . כדי להבין מה נשלט על ידי הגדרה זו, חקור את נקודות ההתקשרות של שיטות אלה.

חלונות עיצוב ממשק המשתמש של המערכת

אנדרואיד 10 מוסיפה תמיכה בחלונות עיצוב מערכת לסרגל הניווט בלבד , מכיוון שסרגל הניווט חיוני לניווט בין פעילויות ואפליקציות. כברירת מחדל, סרגל הניווט מציג תשלומים לחזרה ולבית. זה כלול רק אם תצוגת היעד תומכת בעיטורי מערכת (ראה DisplayWindowSettings ).

שורת המצב היא חלון מערכת מסובך יותר, מכיוון שהוא מכיל גם צל הודעות, הגדרות מהירות ומסך נעילה. ב-Android 10, שורת המצב אינה נתמכת בצגים משניים. לכן, התראות, הגדרות ומגן מקשים מלא זמינים רק בצג הראשי.

חלון המערכת סקירה/אחרונים אינו נתמך במסכים משניים. באנדרואיד 10, AOSP מציג רק את 'אחרונים' בצג ברירת המחדל ומכיל פעילויות מכל התצוגות. כאשר מופעלת מ-Recents, פעילות שהייתה בתצוגה משנית מובאת לחזית בתצוגה זו, כברירת מחדל. לגישה זו יש כמה בעיות ידועות, כגון אי עדכון מיידי כאשר אפליקציות מופיעות במסכים אחרים.

יישום

כדי ליישם תכונות נוספות של ממשק המשתמש של המערכת, יצרני התקנים צריכים להשתמש ברכיב ממשק משתמש יחיד שמאזין להוספה/הסרה של תצוגות ומציג תוכן מתאים.

רכיב ממשק משתמש מערכת התומך ב-Multi-Display (MD) צריך לטפל במקרים הבאים:

  • אתחול תצוגה מרובה בעת האתחול
  • תצוגה נוספה בזמן ריצה
  • התצוגה הוסרה בזמן ריצה

כאשר ממשק המשתמש של המערכת מזהה הוספת תצוגה לפני WindowManager, הוא יוצר מצב מירוץ. ניתן להימנע מכך על ידי יישום התקשרות חוזרת מותאמת אישית מ-WindowManager לממשק המשתמש של המערכת כאשר תצוגה מתווספת במקום להירשם לאירועי DisplayManager .DisplayListener . ליישום עזר, ראה CommandQueue.Callbacks#onDisplayReady לתמיכה בסרגל הניווט ו- WallpaperManagerInternal#onDisplayReady לטפטים.

בנוסף, אנדרואיד 10 מספקת את העדכונים הבאים:

  • מחלקת NavigationBarController שולטת בכל הפונקציונליות הספציפית לסרגלי ניווט.
  • כדי להציג סרגל ניווט מותאם אישית, ראה CarStatusBar .
  • TYPE_NAVIGATION_BAR אינו מוגבל עוד למופע בודד וניתן להשתמש בו לכל תצוגה.
  • IWindowManager#hasNavigationBar() מתעדכן כך שיכלול את הפרמטר displayId עבור ממשק המשתמש של המערכת בלבד.

מַשׁגֵר

באנדרואיד 10, לכל צג המוגדר לתמוך בקישוטי מערכת יש מחסנית ביתית ייעודית לפעילויות משגר עם סוג WindowConfiguration#ACTIVITY_TYPE_HOME , כברירת מחדל. כל תצוגה משתמשת במופע נפרד של פעילות משגר.

איור 1. דוגמה למפעיל ריבוי תצוגה עבור platform/development/samples/MultiDisplay

רוב המשגרים הקיימים אינם תומכים במספר מופעים ואינם מותאמים לגדלי מסך גדולים. כמו כן, לרוב צפויה חוויה מסוג אחר בתצוגות משניות/חיצוניות. כדי לספק פעילות ייעודית למסכים משניים, אנדרואיד 10 מציגה את קטגוריית SECONDARY_HOME במסנני כוונות. מופעים של פעילות זו משמשים בכל התצוגות התומכות בעיטורי מערכת, אחת לכל תצוגה.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

הפעילות חייבת להיות במצב השקה שלא מונע ריבוי מופעים וצפוי להסתגל לגדלי מסך שונים. מצב ההשקה לא יכול להיות singleInstance או singleTask .

יישום

באנדרואיד 10, RootActivityContainer#startHomeOnDisplay() בוחר אוטומטית את הרכיב הרצוי ואת הכוונה בהתאם לתצוגה שבה מסך הבית מופעל. RootActivityContainer#resolveSecondaryHomeActivity() מכיל את ההיגיון לחפש את רכיב פעילות המשגר ​​בהתאם למפעיל שנבחר כעת ויכול להשתמש בברירת המחדל של המערכת, במידת הצורך (ראה ActivityTaskManagerService#getSecondaryHomeIntent() ).

הגבלות אבטחה

בנוסף להגבלות החלות על פעילויות בצגים משניים, כדי למנוע אפשרות של אפליקציה זדונית ליצור תצוגה וירטואלית עם עיטורי מערכת מופעלים וקריאת מידע רגיש למשתמש מהמשטח, המשגר ​​מופיע רק בתצוגות וירטואליות בבעלות המערכת. המשגר ​​אינו מציג תוכן בתצוגות וירטואליות שאינן מערכתיות.

טפטים

באנדרואיד 10 (ומעלה), רקעים נתמכים בצגים משניים:

איור 2. טפט חי על צגים פנימיים (למעלה) וחיצוניים (למטה)

מפתחים יכולים להצהיר על תמיכה בתכונת הטפט על ידי מתן android:supportsMultipleDisplays="true" בהגדרת WallpaperInfo XML. מפתחי טפטים צפויים גם לטעון נכסים באמצעות הקשר התצוגה ב- WallpaperService.Engine#getDisplayContext() .

המסגרת יוצרת מופע WallpaperService.Engine אחד לכל תצוגה, כך שלכל מנוע יש משטח משלו והקשר תצוגה משלו. המפתח צריך לוודא שכל מנוע יכול לצייר באופן עצמאי, בקצבי פריימים שונים, תוך כיבוד VSYNC.

בחר רקעים למסכים בודדים

אנדרואיד 10 אינו מספק תמיכה ישירה בפלטפורמה לבחירת טפטים למסכים בודדים. כדי להשיג זאת, יש צורך במזהה תצוגה יציב כדי להתמיד בהגדרות הטפט בכל תצוגה. Display#getDisplayId() הוא דינמי, כך שאין ערובה שלתצוגה פיזית יהיה אותו מזהה לאחר אתחול מחדש.

עם זאת, אנדרואיד 10 הוסיפה DisplayInfo.mAddress , המכיל מזהים יציבים עבור תצוגות פיזיות וניתן להשתמש בו ליישום מלא בעתיד. למרבה הצער, מאוחר מדי ליישם את ההיגיון עבור אנדרואיד 10. הפתרון המוצע:

  1. השתמש ב-API WallpaperManager כדי להגדיר את הטפטים.
  2. WallpaperManager מתקבל מאובייקט Context , ולכל אובייקט Context יש מידע על תצוגה מתאימה ( Context#getDisplay()/getDisplayId() ). לכן, אתה יכול להשיג displayId ממופע WallpaperManager מבלי להוסיף שיטות חדשות.
  3. בצד המסגרת, השתמש displayId המתקבל מאובייקט Context ומפה אותו למזהה סטטי (כגון יציאה של תצוגה פיזית). השתמש במזהה הסטטי כדי להתמיד בטפט שנבחר.

פתרון זה משתמש בהטמעות קיימות עבור בוחרי טפטים. אם הוא נפתח בתצוגה ספציפית ומשתמש בהקשר הנכון, אז כאשר הוא מתקשר להגדיר טפט, המערכת יכולה לזהות אוטומטית את התצוגה.

אם יש צורך להגדיר טפט לתצוגה שאינה התצוגה הנוכחית, צור אובייקט Context חדש עבור תצוגת היעד ( Context#createDisplayContext ) והשג את מופע WallpaperManager מאותה תצוגה.

הגבלות אבטחה

המערכת לא תציג טפטים על צגים וירטואליים שאינם בבעלותה. זה נובע מחשש אבטחה שאפליקציה זדונית עלולה ליצור תצוגה וירטואלית עם תמיכה בעיטורי מערכת מופעלת ולקרוא מידע רגיש למשתמש מהמשטח (כגון תמונה אישית).

יישום

באנדרואיד 10, ממשקי IWallpaperConnection#attachEngine() ו- IWallpaperService#attach() מקבלים את הפרמטר displayId ליצירת חיבורים לכל תצוגה. WallpaperManagerService.DisplayConnector מקפל מנוע טפט וחיבור לכל תצוגה. ב-WindowManager, בקרי טפטים נוצרים עבור כל אובייקט DisplayContent בעת הבנייה במקום WallpaperController יחיד עבור כל התצוגות.

חלק מיישומי שיטת WallpaperManager הציבוריים (כגון WallpaperManager#getDesiredMinimumWidth() ) עודכנו כדי לחשב ולספק מידע עבור תצוגות מתאימות. נוספו WallpaperInfo#supportsMultipleDisplays() ותכונת משאב מתאימה, כך שמפתחי אפליקציות יכולים לדווח אילו טפטים מוכנים למספר מסכים.

אם שירות הטפטים המוצג בצג ברירת המחדל אינו תומך במספר צגים, המערכת מציגה את טפט ברירת המחדל בצגים המשניים.

איור 3. היגיון נפילה של טפט עבור תצוגות משניות