בדף הזה מוצגות המלצות לעבודה עם כמה מסכים.
אפליקציות למכשירים מתקפלים ולמכשירים עם כמה מסכים
באופן כללי, אפליקציות לא צריכות להסתמך על מזהים סטטיים או על לוגיקה שתלויה במזהים מסוימים של תצוגות. ברוב המקרים, האפליקציות צריכות לשנות את הגודל שלהן ולפעול במסכים שונים, והמערכת צריכה לשלוט במיקום האפליקציות. לדוגמה, כדי ליצור חוויה חדשה וייחודית למכשירים מתקפלים ולהפעיל אפליקציה מיוחדת במסך החיצוני כשהמכשיר מקופל.
במקרה כזה, ממשק המשתמש של המערכת או רכיב מערכת אחר צריך לזהות את הקיפול, לקבוע אם מתאים לבצע פעולה, ואז להפעיל את פעילות היעד ולציין מזהה של תצוגה חיצונית כיעד ההפעלה. האפליקציות לא אמורות לזהות את הפעולה הזו או לבצע פעולה כלשהי בתגובה, ואז להפעיל את האפליקציה בתצוגה ספציפית. לכן, אל תניחו שמה שעובד במכשיר אחד יעבוד גם במכשירים אחרים. בקיצור, קוד שספציפי למכשיר מגדיל את הפיצול.
הגבלת הגישה למסכים
אם הגדרת המכשיר מחייבת הגבלת גישה למסך אחד או יותר, מומלץ להשתמש בדגל Display#FLAG_PRIVATE כדי להגדיר את המסך כפרטי. ההגדרה הזו מגבילה את האפשרות להוסיף תוכן לתצוגה, כך שרק הבעלים יכולים לעשות זאת. אם מישהו אחר חוץ מהבעלים מנסה להפעיל פעילות או להוסיף חלון, מופעלת SecurityException.
אם המערכת היא הבעלים של התצוגה, היא יכולה להוסיף חלונות ולהפעיל פעילויות.
בנוסף, לישויות שמוצבות על מסך יש תמיד גישה למסך הזה. אם הבעלים מפעיל פעילות בתצוגה, הפעילות יכולה להפעיל פעילויות אחרות בתצוגה הזו. לכן, הבעלים אחראים להגבלת הגישה ולאישור רק של אפליקציות מהימנות.
בנוסף, יש יותר הגבלות על תצוגות וירטואליות כי כל אפליקציה יכולה ליצור תצוגה וירטואלית בלי שהמשתמש יוכל לראות אותה. אם המסך הווירטואלי לא בבעלות המערכת, מותרות רק פעילויות עם allowEmbedded, והמתקשר צריך לקבל את ההרשאה ACTIVITY_EMBEDDING.
מידע נוסף זמין בכתובת:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplayActivityDisplay#isUidPresentDisplayManagerService#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.