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

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

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

במקרה כזה, 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 משמש לזיהוי המסך במאפיין השם, שבמסך מדומה הוא 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>

מידע נוסף זמין במאמר מזהי תצוגה סטטיים.

מידע נוסף זמין במאמרים הבאים: