ריבוי חלונות באנדרואיד N: מה מפתחים צריכים לדעת כדי להפיק את המיטב

click fraud protection

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

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

אחד ממפגשי ה-I/O של Google נועד למפתחים ללמוד על ממשקי ה-API החדשים והשינויים ההתנהגותיים של המערכת שמביאה תמיכה מרובת חלונות.

המפגש הוצג על ידי Wale Ogunwale, מנהל הטכני המוביל של Android ActivityManager ו רכיבי המסגרת של WindowManager -- הוא והצוות שלו הם האחראים על ריבוי חלונות באנדרואיד.

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

N מציגה שלושה מצבי ריבוי חלונות שונים:
  • מצב מסך מפוצל: זהו המצב הזמין כברירת מחדל. כפי שהשם מרמז, זה מאפשר לך לפתוח שני יישומים זה לצד זה.
  • מצב חופשי: יצרנים יכולים לאפשר זאת במכשירים גדולים יותר, מה שמאפשר למשתמשים לשנות את גודל הפעילויות בחופשיות בנוסף למצב המסך המפוצל.
  • מצב תמונה בתוך תמונה
    : מיועד למכשירי Android TV, מצב זה מיועד לנגני וידאו לרוץ בחלון מוצמד בזמן שהמשתמש מקיים אינטראקציה עם יישומים אחרים.
מצב מסך מפוצל של Android Nמצב אנדרואיד N PiP
ראוי לציין זאת. כיסינו את מספר החלונות ב-N בעבר והצענו קצת ביקורת על המערכת הנוכחית. עם זאת בחשבון, אנו מקווים שמצב הצורה החופשית יתקרב קצת יותר למצב תמונה-בתמונה, מכיוון שיהיו לזה יישומים שימושיים בכל המכשירים.
הפעלת תמיכה בריבוי חלונות באפליקציות שלך היא פשוטה: אינך צריך לעשות דבר אם אתה כבר מכוון ל-N. אם תבחר להשבית ריבוי חלונות, תוכל לעשות זאת על ידי הגדרת ה. android: resizeableActivity תכונת פעילות במניפסט שלך ל. false. זה צריך להיעשות רק אם זה מוצדק באמת, מכיוון שזה גורם לאפליקציה שלך לבלוט בצורה גרועה תמיד הפעלה במצב מסך מלא גם אם המשתמש (או אפליקציה אחרת) מנסה להפעיל אותה בריבוי חלונות מצב. חשוב לציין שהתכונות של פעילות שורש חלות על כל הפעילויות בתוך ערימת המשימות שלה. במילים אחרות, אם יש לך פעילות שניתן להתחיל על ידי אפליקציות אחרות, ודא שהיא תומכת במצב ריבוי חלונות מכיוון שאינך יכול להבטיח שאפליקציות אחרות ישיקו את הפעילות שלך במשימה חדשה באמצעות. Intent#FLAG_ACTIVITY_NEW_TASK תמיכה במצב תמונה-בתמונה חייבת להיות מוצהרת במפורש דרך. android: supportsPictureInPicture תְכוּנָה. שים לב שהתכונה הזו מתעלמת אם. android: resizeableActivity הוא. false ניתן להשתמש בתכונות פריסה כדי להגדיר מידות ומיקום ברירת מחדל עבור חלונות בעלי צורה חופשית, או כדי לציין רוחב או גובה מינימליים הן עבור צורה חופשית והן במצבי מסך מפוצל:
  • android: defaultWidth/android: defaultHeight: מידות ברירת המחדל של הפעילות (מצב צורה חופשית).
  • android: gravity: המיקום ההתחלתי של הפעילות (מצב חופשי).
  • android: minimalWidth/android: minimalHeight: הממדים המינימליים של הפעילות (מצבים חופשיים ומצבי מסך מפוצל)
אתה יכול למצוא דוגמה לקוד ב. אפליקציית Multi-Window Playground של גוגל לדוגמה ב-GitHub: AndroidManifest.xml.
עם הצגת התמיכה בריבוי חלונות, ייתכן שתצטרך לבדוק כמה דברים באפליקציות שלך כדי לוודא שהם פועלים כהלכה.

הבנת מחזור החיים של הפעילות

ה. מחזור חיים של פעילות ללא שינוי במצב ריבוי חלונות: מחזור חיים בסיסי של פעילות אנדרואיד עם זאת, כמה הבדלים עדינים בין מצבי הפעילות עלולים לגרום להתנהגות לא מכוונת שבדרך כלל לא תשים לב אליה לפני N. חשוב לדעת את זה. Activity#onResume() ו. Activity#onPause() נקראים כאשר האפליקציה שלך צוברת או מאבדת מיקוד, אך לא בהכרח כאשר היא מתחילה או מפסיקה להיות גלויה. (זכור שרק אפליקציה אחת עשויה להתמקד בכל זמן נתון.) עבור אפליקציות שמעדכנות את התוכן כל הזמן (למשל, הפעלת וידאו), הקפידו לטפל בהתחלה ובעצירה של עדכוני תוכן. Activity#onStart() ו. Activity#onStop() במקום זאת. לא עושה זאת עבור אפליקציות וידאו, למשל, פירושו שההשמעה תתרחש רק אם האפליקציה ממוקדת, אשר מביס את המטרה של מצב ריבוי חלונות. לאפליקציית YouTube הרשמית הייתה בעיה דומה כאשר ה-Android N Developer Preview הושקה לראשונה.

טיפול בשינויים בזמן ריצה

כאשר אפליקציה מועברת למצב ריבוי חלונות, חלק מתצורות המכשיר ישתנו. אתה יכול לאפשר לפעילות שלך להתחיל מחדש (במקרה זה. שמירת שברים יכול להיות רעיון טוב, אם הפעילות שלך חייבת לבצע פעולה אינטנסיבית בעת ההפעלה), או לבחור לעשות זאת. לטפל בשינויי התצורה במפורש במקום זאת. ארבע תצורות מכשירים עשויות להשתנות בעת כניסה למצב מרובה חלונות או בתוך מצב: screenSize, smallestScreenSize, screenLayout ו. orientation. עיין ב. תיעוד מפתחי אנדרואיד למידע נוסף על כל תכונה, אך שים לב לכך. orientation לא מתייחס יותר לכיוון המכשיר במקרה זה. במקום זאת, הוא רק מציין אם רוחב הפעילות שלך גדול מהגובה שלה (נוף) או לא (פורטרט). ההכרזה שהפעילות שלך תטפל בשינויים האלה יכולה להיעשות מהמניפסט:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
זכור שזה אומר שבאמת תצטרך לטפל בשינויים האלה. Activity#onConfigurationChanged(), על ידי עדכון ידני של תצוגות או טעינה מחדש של כמה משאבים.

תכונות מושבתות במצב ריבוי חלונות

חלק מתכונות המערכת לא יושפעו מהפעילויות שלך במצב ריבוי חלונות:
  • שינויים בשורת המצב ובסרגל הניווט, כגון עמעום/הסתרת סרגלי המערכת או שימוש במצב סוחף, לא ישפיעו. זה הגיוני מכיוון שהפעילות שלך תופסת רק חלק מהמסך.
  • ה android: screenOrientation לתכונת פעילות אין השפעה גם במצב ריבוי חלונות: מכיוון שהפעילות שלך תהיה ניתנת לשינוי גודל, זה כבר לא הגיוני שתהיה לה כיוון קבוע.
התקשרויות חדשות נוספו עבור אירועים מרובי חלונות, כמו גם שיטות לשאילתה על המצב הנוכחי.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): נקרא כאשר מצב הפעילות משתנה ממסך מלא לרבוי חלונות ולהיפך.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): נקרא כאשר מצב הפעילות משתנה אל/ממצב PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): החזר אם הפעילות במצב ריבוי חלונות/תמונה-בתמונה או לא.
  • Activity#overlayWithDecorCaption(boolean overlay): עבור חלונות בצורה חופשית, ניתן להשתמש בשיטה זו כדי להפוך את הכיתוב (הסרגל המשמש לגרירת החלון) לכסות את התוכן במקום לדחוף אותו למטה.
נ.ב. למעט. Activity#overlayWithDecorCaption(), שיטות אלה מסופקות גם על ידי. Fragment מעמד.

התחלת פעילויות במצב ריבוי חלונות

  • Activity#enterPictureInPictureMode() ניתן להשתמש כדי להעביר פעילות למצב תמונה בתוך תמונה. שים לב שפעילויות במצב PiP אינן מקבלות התראה על אירועי קלט -- השתמש MediaSession#setMediaButtonReceiver() אם אתה רוצה לטפל באירועים כאלה. הקפד גם לבדוק את אתר המפתחים של Android אם אתה מעוניין תמונה בתוך תמונה ב-Android N.
  • אם המכשיר נמצא במצב מסך מפוצל, אתה יכול להגיד למערכת להפעיל פעילות נוספת ליד שלך באמצעות Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT דֶגֶל. לדגל אין השפעה אם לא במצב מסך מפוצל.
  • אם המכשיר נמצא במצב חופשי, ActivityOptions#setLaunchBounds() ניתן להשתמש כדי לציין את ממדי הפעילות החדשה ואת מיקומה על המסך.
לדוגמאות קוד, עיין באפליקציה לדוגמה של Multi-Window Playground: דוגמה לפעילות סמוכה, דוגמה לגבולות השקה.

גרור ושחרר

אמנם תמיכה בגרירה ושחרור קיימת מאז Honeycomb, אך בעבר זה היה אפשרי רק בתוך אותה פעילות. יורד שלג. נתמך בריבוי חלונות גם כן. יישום זה נראה. לרוב אותו דבר כמו קודם, עם כמה תוספות לגרירה ושחרור בין פעילויות:
  • View#startDragAndDrop()
    • כינוי חדש עבור View#startDrag().
    • כדי לאפשר גרירה ושחרור בין פעילות צולבת, העבר את הדגל החדש View#DRAG_FLAG_GLOBAL.
    • אם אתה צריך לתת הרשאות URI לפעילות הנמען, העבר את הדגלים החדשים View#DRAG_FLAG_GLOBAL_URI_READ אוֹ View#DRAG_FLAG_GLOBAL_URI_WRITE, כראוי.
  • View#updateDragShadow()
    • מחליף את צל הגרירה עבור פעולת גרירה שמתבצעת כעת. ניתן להתקשר רק על ידי האפליקציה שיצרה את פעולת הגרירה.
  • View#cancelDragAndDrop()
    • מבטל פעולת גרירה שנמצאת כעת בתהליך. ניתן להתקשר רק על ידי האפליקציה שיצרה את פעולת הגרירה.
  • בדיקה אם מכשיר תומך במצבים חופשיים או תמונה-בתמונה אפשרית באמצעות PackageManager#hasSystemFeature(), באמצעות PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT ו PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE בהתאמה.
  • ה android: windowBackground ניתן להשתמש בתכונה כציור הרקע, אם הפעילות עוברת שינוי גודל והעיבוד שלה בפיגור. אם android: windowBackground לא מוגדר, android: windowBackgroundFallback משמש במקום זאת. עיין באפליקציה לדוגמה של Multi-Window Playground לדוגמא.
Wale הציעה כמה שיטות עבודה מומלצות כדי לוודא שלמשתמשים שלך תהיה החוויה הטובה ביותר האפשרית:
  • מצב הידית משתנה באלגנטיות:
    • שמור על עקביות ממשק המשתמש ללא קשר לכיוון. אל תאפשר לאלמנטים לשנות מיקום כדי לאפשר מעברים חלקים.
    • בהרחבה על האמור לעיל, אל תעבור בין פריסות שונות מאוד עבור פריסות טלפון/טאבלט. במקום זאת, התאם את פריסת הטאבלט לגדלים קטנים יותר לצורך עקביות.
  • ודא שהפעילויות שלך מתאימות לגדלים קטנים על ידי בעקבות דפוסי עיצוב החומרים.
  • להשתמש FLAG_ACTIVITY_LAUNCH_ADJACENT כאשר הגיוני ליצור חוויה מהנה יותר במצב מסך מפוצל.
  • הכריז על אי התאמה לשינוי גודל רק כאשר זה מוצדק. כפי שדיברנו למעלה, זה גורם לאפליקציה שלך לבלוט בצורה גרועה אחרת.
ווייל סיימה את הפגישה בכך שהציעה כמה משאבים שימושיים נוספים:
  • תיעוד מרובה חלונות.
  • הנחיות לעיצוב חומרים עבור מצב מסך מפוצל.
  • אפליקציה מרובה חלונות לדוגמה.