אפליקציות למכשירים מתקפלים ולמכשירים עם כמה מסכים
באופן כללי, אפליקציות לא צריכות להסתמך על מזהים סטטיים או על לוגיקה שתלויה במזהים מסוימים של תצוגות. ברוב המקרים, האפליקציות צריכות לשנות את הגודל שלהן ולפעול במסכים שונים, והמערכת צריכה לשלוט במיקום האפליקציות. לדוגמה, כדי ליצור חוויה חדשה וייחודית למכשירים מתקפלים ולהפעיל אפליקציה מיוחדת במסך החיצוני כשהמכשיר מקופל.
במקרה כזה, SystemUI (או רכיב מערכת אחר) אמור לזהות את הקיפול, לקבוע אם מתאים לבצע פעולה, ואז להפעיל את פעילות היעד ולציין מזהה של מסך חיצוני כיעד ההפעלה. האפליקציות לא אמורות לזהות את הפעולה הזו או לבצע פעולה כלשהי בתגובה, ואז להפעיל את האפליקציה במסך ספציפי. במילים אחרות, אל תניחו שמה שעובד במכשיר אחד יעבוד גם במכשירים אחרים. בקיצור, קוד שספציפי למכשיר מגדיל את הפיצול.
הגבלת הגישה למסכים
אם הגדרת המכשיר מחייבת הגבלת גישה למסך אחד או יותר, מומלץ להשתמש בדגל Display#FLAG_PRIVATE כדי להגדיר את המסכים האלה כפרטיים. הפעולה הזו תגביל את האפשרות להוסיף תוכן לתצוגה לכולם חוץ מהבעלים. כל ניסיון להפעיל פעילות או להוסיף חלון על ידי מישהו שאינו הבעלים יגרום לSecurityException.
אם המערכת היא הבעלים של התצוגה, היא יכולה להוסיף חלונות ולהפעיל פעילויות.
בנוסף, לישויות שמוצבות על מסך יש תמיד גישה למסך הזה. אם הבעלים מפעיל פעילות בתצוגה, הפעילות יכולה להפעיל פעילויות אחרות בתצוגה הזו. לכן, הבעלים אחראים להגבלת הגישה ולאישור רק אפליקציות מהימנות.
בנוסף, יש יותר הגבלות על מסכים וירטואליים כי כל אפליקציה יכולה ליצור מסך וירטואלי בלי להציג אותו למשתמש. אם התצוגה הווירטואלית לא בבעלות המערכת, מותרות רק פעילויות עם allowEmbedded, והמתקשר צריך לקבל את ההרשאה ACTIVITY_EMBEDDING.
מידע נוסף זמין בכתובת:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()ActivityDisplay#isUidPresent()DisplayManagerService#isUidPresentOnDisplay()
כדי לשלוט בהפעלת פעילויות באופן מותנה, משתמשים ב-LaunchParamsController, שמיירט את כל הפעלות הפעילויות ומאפשר לרכיב מערכת לשנות את הפרמטרים שמשמשים להפעלה. האפשרות הזו זמינה בsystem_server.
קביעת הגדרות של חלונות תצוגה ועיצובים של המערכת
אפשר להגדיר קישוטים של המערכת לכל מסך ב-DisplayWindowSettings. הטמעה של מכשיר יכולה לספק הגדרת ברירת מחדל ב-/data/system/display_settings.xml.
הערך הזה קובע אם קישוטי המערכת (מרכז האפליקציות, טפט, סרגל הניווט וחלונות עיצוב אחרים) ו-IME יופיעו בתצוגה.
פרטים נוספים זמינים במאמרים DisplayWindowSettings#shouldShowSystemDecorsLocked() וDisplayWindowSettings#shouldShowImeLocked().
כדי לזהות את המסך, משתמשים במזהה ייחודי (ברירת המחדל היא DisplayInfo#uniqueId) או במזהה של יציאה פיזית למסכים של חומרה (ראו DisplayInfo#address).
לדוגמה, בדוגמה הבאה של הגדרות התצוגה מופעלים קישוטי מערכת ו-IME בתצוגה מדומה:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
בדוגמה שלמעלה, הערך uniqueId משמש לזיהוי התצוגה במאפיין name, שהוא overlay:1 עבור תצוגה מדומה.
בתצוגה מובנית, ערך לדוגמה יכול להיות "local:45354385242535243453".
אפשרות אחרת היא להשתמש בפרטי יציאת החומרה ולהגדיר את identifier="1"
כך שיתאים ל-DisplayWindowSettings#IDENTIFIER_PORT ואז לעדכן את השם לפורמט "port:<port_id>":
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
פרטים נוספים מופיעים במאמר בנושא מזהים סטטיים של מסכים.
מידע נוסף זמין בכתובת:
החלפת מסכים בין שיקוף לבין הצגת משימות
ב-Android 17 ואילך, DisplayManager משתמש בדגל FLAG_ALLOWS_CONTENT_MODE_SWITCH כדי לקבוע אם מסך מסוים יעבור בין שיקוף לבין אירוח משימות בזמן הריצה. כברירת מחדל, ההגדרה הזו מופעלת במסכים חיצוניים ומושבתת בכל שאר המסכים.
כשהסמל FLAG_ALLOWS_CONTENT_MODE_SWITCH מוצג, DisplayManager עוקב אחרי ההגדרה המאובטחת android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY כדי לקבוע אם לשכפל או לארח משימות. זוהי הלוגיקה שמוגדרת כברירת מחדל, אבל יצרני ציוד מקורי יכולים להתאים אישית את ההתנהגות הזו.
הצגת הטופולוגיה ותנועת הסמן
ב-Android מגרסה 17 ואילך, טופולוגיית התצוגה מגדירה את המיקומים היחסיים של התצוגות ומגבילה את תנועת סמן העכבר לקבוצה הספציפית של התצוגות בטופולוגיה.
WindowManager מחליט לכלול תצוגה בטופולוגיה ומבצע קריאה ל-DisplayManagerInternal.onDisplayBelongToTopologyChanged. DisplayManager
בודק את DisplayTopologyCoordinator.isDisplayAllowedInTopology לפני הוספת התצוגה. כברירת מחדל, אם יש מסכים מקומיים שיכולים להציג משימות, המערכת מוסיפה אותם.
אם יש כמה מסכים ציבוריים שיכולים להציג משימות, ההחלטה אם לכלול את מסך ברירת המחדל מתבצעת על ידי ספק בוליאני shouldIncludeDefaultDisplayInTopology שמועבר אל DisplayTopologyCoordinator. אם תצוגת ברירת המחדל היא התצוגה הציבורית היחידה שיכולה לארח משימות, היא תמיד תהיה בטופולוגיה. ב-AOSP, ספק הערך הבוליאני מחזיר true רק אם התצוגה שמוגדרת כברירת מחדל תומכת בממשק מחשב או אם ההגדרה המאובטחת Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY היא true.
אפליקציות שולחות שאילתות לטופולוגיה הנוכחית באמצעות DisplayManager.getDisplayTopology ומגיבות לשינויים בטופולוגיה על ידי רישום מאזין ב-DisplayManager.registerTopologyListener.