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

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

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

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

פרטים נוספים מופיעים במאמר בנושא מזהים סטטיים של מסכים.

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