תמיכה במסכים מחוברים

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

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

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

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

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

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

טיפול בשינויים דינמיים בתצוגה

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

גם צפיפות הפיקסלים במסכים חיצוניים יכולה להיות שונה מאוד. אתם צריכים לוודא שהאפליקציה מגיבה כמו שצריך לשינויים בצפיפות. לשם כך, צריך להשתמש בפיקסלים שלא תלויים בצפיפות (dp) לפריסות, לספק משאבים ספציפיים לצפיפות ולוודא שממשק המשתמש משתנה בהתאם.

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

להשתמש בהקשר הנכון

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

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

ב-Jetpack Compose, אפשר לגשת למידע ספציפי לתצוגה באמצעות אובייקטים של CompositionLocal כמו LocalConfiguration.current ו-LocalDensity.current. כשפעילות או חלון עוברים בין מסכים, תצורת המכשיר משתנה, וזה גורם ליצירה מחדש עם מדדי תצוגה חדשים. אובייקטים מסוג CompositionLocal מאפשרים לממשק המשתמש להתאים את עצמו בצורה חלקה.

קבלת מידע על המסך

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

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }

ניהול ההפעלה וההגדרה של הפעילות

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

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

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

אפשר להפעיל פעילות במסך מסוים באמצעות ActivityOptions. חשוב לזכור שהשימוש ב-launchDisplayId מחייב Android 8 (רמת API ‏26) ומעלה.

// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
    .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
    ?.displayId

// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
    val intent = Intent(this, MySecondaryActivity::class.java)
    val options = ActivityOptions.makeBasic()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        options.launchDisplayId = externalDisplayId
    }
    startActivity(intent, options.toBundle())
} else {
    // Optionally, handle the case where no external display is connected.
}

להימנע מרשימות היתרים של מכשירים

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

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

תמיכה בציוד היקפי חיצוני

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

שיפור הפרודוקטיביות של המשתמשים

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

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

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