מצב חלון חופשי של אנדרואיד נוגט: מה זה וכיצד מפתחים יכולים להשתמש בו

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

מצב חלון חופשי, כפי שהודגם לראשונה על ידי Ars Technica

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

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

בתוך ה תיעוד Android SDK, הוא קובע כי:

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

וגם, ב אנדרואיד 7.0 CDD:

יישומי מכשיר עם גודל מסך xlarge צריכים לתמוך במצב חופשי.

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

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


הפעלת מצב חלון בצורה חופשית בכל מכשיר אנדרואיד נוגט

הפעלת האפשרות "אלץ פעילויות לשינוי גודל" מאפשרת לאפליקציות לפעול במצב חופשי בכל מכשיר

שיטה 1 (דרוש מחשב עם adb)

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

adb shell settings put global enable_freeform_support 1

שיטה 2 (ללא דרישות נוספות)

אפשר את האפשרות "אלץ לשנות את גודל הפעילויות" בתחתית אפשרויות המפתחים.

שתי השיטות הללו דורשות הפעלה מחדש של ממשק המשתמש של המערכת לפני שהן ייכנסו לתוקף. הדרך הקלה ביותר לעשות זאת היא לאתחל את המכשיר שלך (או, אם המכשיר שלך מושרש, אתה יכול פשוט להרוג את com.android.systemui תהליך)


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

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

עם זאת, בשיטה 2, לא ניתן להפעיל אפליקציה למצב חופשי דרך אנדרואיד עצמה. לְמַרְבֶּה הַמַזָל, זה אפשרי עבור כל משגר צד שלישי להפעיל אפליקציה למצב חלון חופשי באמצעות ממשקי API סטנדרטיים של אנדרואיד שנסגרו כחלק מרמת API 24.

המפתח להפעלת אפליקציה במצב חופשי הוא להתקשר ל- ActivityOptions.setLaunchBounds() שיטה. שיטה זו לוקחת א Rect כארגומנט, המכיל את גבולות החלון שאיתם תופעל האפליקציה.

לאחר מכן תוכל להפעיל את האפליקציה באמצעות startActivity(Intent, Bundle). אם עדיין אין לך ActivityOptions חבילה, אתה יכול ליצור אחד עם ActivityOptions.makeBasic() ואז מתקשר setLaunchBounds() על הצרור החדש שנוצר.

שים לב שכברירת מחדל, אם כבר קיימת משימה עבור האפליקציה במסך הסקירה הכללית, אז אנדרואיד פשוט תפנה אותך למשימה הקיימת (מסך מלא) שהושקה בעבר על ידי מִשׁתַמֵשׁ. תצטרך לנקות את כל המשימות עבור האפליקציה בסקירה כללית לפני שתנסה להפעיל את האפליקציה לחלון בצורה חופשית. (עבור אפליקציות עם פעילויות המופעלות ב standard אוֹ singleTop במצבים, אתה יכול לאלץ חלון חדש להיפתח על ידי הוספת ה Intent.FLAG_ACTIVITY_MULTIPLE_TASK לסמן את הכוונה לפני ההתקשרות startActivity().)


איך עובד מצב צורה חופשית מתחת למכסה המנוע?

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

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

אפליקציות הפועלות במצב חופשי (שאין להן android: windowIsFloating מוגדר ל-true) יש א DecorCaptionView נוסף כילד מהרמה העליונה DecorView. תצוגה זו מכילה א LinearLayout הגדרת סרגל הכיתוב של החלון להזזה, מקסום וסגירה של החלון. למרות שאני לא ממליץ על זה באופן אישי, אפשר לגשת ולהתאים אישית את התצוגה הזו על ידי קבלת ה DecorView באמצעות Window.getDecorView(), ליהוק אותו ל-a ViewGroup ולאחר מכן גישה לתצוגות הילד שלו.

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

  • Window.setDecorCaptionShade(): ניתן להשתמש בשיטה זו כדי לעקוף את הגוון של פקדי הכיתוב (לחצן המקסום והסגור) עבור אפליקציות במצב חופשי.
  • Window.setRestrictedCaptionAreaListener(): ניתן להשתמש בזה כדי לזהות מתי חלון מועבר במצב חופשי. ה Window.OnRectrictedCaptionAreaChangedListener נקרא בכל פעם שמיקום בקרי הכיתוב משתנה (כאשר משתמש מזיז את החלון), ומספק א Rect עם הגבולות החדשים של בקרות הכיתוב.
  • ActivityInfo.WindowLayout: מחלקה זו מכילה מידע המוצהר במניפסט של האפליקציה לגבי המיקום הראשוני של חלון בצורה חופשית שאפליקציה יכולה לבקש בעת ההשקה. לדוגמה, אתה יכול לרשום את הדברים הבאים ב- תג של המניפסט שלך:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    לאחר מכן, כאשר המכשיר כבר במצב חופשי והאפליקציה מופעלת, היא תופעל עם הגבולות שצוינו.

דוגמאות של מצב חלון בצורה חופשית בפעולה

שורת המשימות מוסיפה תפריט התחלה ומגש אפליקציות אחרונות כדי להחמיא למצב חלון בצורה חופשית

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

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

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

בנוסף לשורת המשימות, שיניתי גם את קוד המקור של Launcher3 מ-AOSP כדי לאפשר לו להפעיל אפליקציות למצב חופשי. זהו שיבוט ישר של משגר אנדרואיד 7.1.1 במלאי, עם השינויים המינימליים הדרושים כדי לאפשר לו להשיק אפליקציות בצורה חופשית. סיפקתי את המשגר ​​המתוקן הזה בתקווה שמפתחים אחרים יישמו תמיכה בהשקת חלונות בצורת חופשית במשגרים המותאמים אישית שלהם. אתה יכול הצג את קוד המקור ב-GitHub, או הורד APK לדוגמא.

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