ריבוי קורות חיים

באנדרואיד 9 (ומטה), אפליקציות הוכנסו למצב PAUSED כאשר:

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

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

באנדרואיד 10, כל הפעילויות הניתנות למיקוד העליון בערימות גלויות נמצאות במצב RESUMED . זה משפר את התאימות עם מצבי Multi-Window ו-MD עבור אפליקציות המשתמשות ב- onPause() במקום onStop() כדי להפסיק לרענן את ממשק המשתמש ולתקשר עם המשתמש. זה אומר:

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

איור 1. ריבוי קורות חיים במכשיר מתקפל

איור 2. ריבוי קורות חיים במצב שולחן עבודה

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

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

גישה זו מציינת לאפליקציות שפעילות יכולה לקבל קלט ממשתמש רק במצב RESUMED . לפני אנדרואיד 10, פעילויות יכלו לקבל קלט גם במצב PAUSED (לדוגמה, נסה לגעת בשתי הפעילויות במסך מפוצל בו-זמנית במכשיר שבו פועל אנדרואיד 9).

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

Activity#onTopResumedActivityChanged(boolean onTop)

כאשר מופעל, התקשרות חוזרת זו נקראת בין Activity#onResume() לבין Activity#onPause() . התקשרות חוזרת זו היא אופציונלית וניתן לדלג עליה, כך שפעילות יכולה לעבור ממצב RESUMED למצב PAUSED מבלי להפוך לרמה העליונה ביותר במערכת. לדוגמה, במצב ריבוי חלונות. מכיוון שהתקשרות חוזרת זו היא אופציונלית, היא אינה חלק ממחזור החיים של הפעילות ויש להשתמש בה לעתים רחוקות.

הפעילות הקודמת המחודשת מקבלת ומסיימת את הביצוע של onTopResumedActivity(false) לפני שהפעילות הבאה שחודשה למעלה מקבלת את onTopResumedActivity(true) , אלא אם הפעילות הקודמת לוקחת יותר מדי זמן לטפל בקריאה למתודה ופוגעת בתפוגה של 500 אלפיות השנייה.

תְאִימוּת

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

מספר פעילויות חוזרות בתהליך אפליקציה אחד

  • נושא. באנדרואיד 9 ומטה, מתחדשת פעילות אחת בלבד במערכת בכל פעם. כל המעברים בין פעילויות כרוכים בהשהיית פעילות לפני חידוש פעילות אחרת. אפליקציות ומסגרות מסוימות (כגון Flutter, או LocalActivityManager של אנדרואיד) משתמשות בעובדה זו ומאחסנות מצב לגבי הפעילות המתחדשת ביחידים.
  • פִּתָרוֹן. באנדרואיד 9 ומטה, אם שתי פעילויות מאותו תהליך מתחדשות, המערכת חוזרת רק לפעילות הגבוהה יותר בסדר Z. אפליקציות הממוקדות לאנדרואיד 10 יכולות לתמוך בחידוש פעילויות מרובות בו-זמנית.

גישה למצלמה בו זמנית

  • נושאים . בעיות אלו קיימות גם באנדרואיד 9 ומטה. לדוגמה, פעילות במסך מלא ופעילות מחודשת יכולה לאבד את מיקוד המצלמה לפעילות מושהית למעלה במצב תמונה-בתמונה, אך להיות חשופה יותר עם אימוץ רחב יותר של מצבי ריבוי חלונות ורב-תצוגה.
    • עקב שינויים שבוצעו במצב RESUME , אפליקציות עלולות להתנתק מהמצלמה גם בזמן חידוש . כדי לטפל בזה, אפליקציות חייבות להתמודד עם ניתוק מצלמה מבלי לקרוס. כאשר מנותקים, יישומים מקבלים התקשרות חוזרת מנותקת וכל הקריאות אל ה-API מתחילות לזרוק את CameraAccessException .
    • resizeableActivity=false אינו ערובה לגישה בלעדית למצלמה, מכיוון שניתן לפתוח אפליקציות אחרות המשתמשות במצלמה בצגים אחרים.
  • פתרונות. מפתחים צריכים לכלול היגיון כאשר אפליקציה מנותקת מהמצלמה. אם אפליקציה מנותקת מהמצלמה, עליה לצפות בהתקשרויות לזמינות המצלמה כדי לנסות להתחבר מחדש ולהמשיך להשתמש במצלמה. בנוסף ל- CameraManager#AvailabilityCallback#onCameraAvailable() התקשרות חוזרת הקיימת, אנדרואיד 10 הוסיפה את CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , המכסה את המקרה שבו המיקוד (ועדיפות המצלמה) עוברת בין מספר פעילויות שהתחדשו. מפתחי אפליקציות צריכים להשתמש בשתי ההתקשרויות הללו כדי לקבוע מועד טוב לנסות לקבל גישה למצלמה.

ריבוי קורות חיים

באנדרואיד 10, מצב מחזור החיים של הפעילות נקבע על ידי נראות וסדר Z. כדי להבטיח שהמצב הנכון לאחר החשיפה מתעדכן בפעילות ולהעריך איזה מצב מחזור חיים ישים, הפעל את השיטה ActivityRecord#makeActiveIfNeeded() ממיקומים שונים. באנדרואיד 10, פעיל פירושו RESUMED או PAUSED ופועל רק בשני המקרים הללו.

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

התקשרות חזרה לפעילות שחודשה למעלה

לאחר פעולות שעלולות לגרום לשינוי פעילות מובילה (כגון השקת פעילות, חידוש פעילות או שינוי בסדר Z), מופעל ActivityStackSupervisor#updateTopResumedActivityIfNeeded() . שיטה זו בודקת אם הפעילות המחודשת העליונה השתנתה ומבצעת את העדכון במידת הצורך. אם הפעילות הקודמת שחודשה העליון לא שחררה את המצב המחודש, אזי נשלחת אליה הודעת Top-Resumed-StateLossTimeout ומתוזמן בצד השרת ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() ). דוח על המצב המחודש העליון נשלח לפעילות הבאה לאחר שהקודמת שחררה את המצב, או כאשר נפגע פסק זמן (ראה שימושים של:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

פריט עסקה חדש TopResumedActivityChangeItem התווסף כדי לדווח ללקוחות על שינויים במצב מחודשים וממנף את ארכיטקטורת ActivityLifecycler מאנדרואיד 9.

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