שיטות מומלצות

אפליקציות למכשירים מתקפלים ומרובי מסכים

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

במקרה זה, 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>

לפרטים, ראה מזהי תצוגה סטטיים .

למידע נוסף, ראה: