טיפול במערכת של משתמשים בחזית וברקע

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

החל מ-Android 10, הגדרת ברירת המחדל של Android Automotive מאפשרת להפעיל רק שלושה משתמשים בו-זמנית (config_multiuserMaxRunningUsers). לכן, בנוסף למשתמש המערכת ללא ראש (משתמש 0), אפשר להגדיר רק משתמש אחד בחזית ומשתמש אחד ברקע.

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

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

תהליכי משתמשים ברקע

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

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

מצב המשתמש

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

מצב מוסך, JobScheduler ועדכוני אפליקציות למשתמשים

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

CarService שולח אות אל JobSchedulerService כדי להפעיל משימות שמוגדרות לפעול כשהמכשיר לכלי רכב נמצא במצב המתנה דרך מצב המוסך. כדי ש-JobSchedulerService יוכל להריץ משימות עבור משתמש ברקע, המשתמש צריך להיות במצב STATE_RUNNING_UNLOCKED. משימות שנמצאות בתור ל-JobSchedulerService נשמרות ועומדות במחזורי הפעלה/כיבוי.

JobScheduler לא יכול להריץ משימות עבור משתמש מסוים אם המשתמש לא נפתח לעולם אחרי מחזור הפעלה. עם זאת, כשהנעילה של המשתמש נפתחת, ואם המשתמש נשאר ב-STATE_RUNNING_UNLOCKED, אפשר להריץ משימות עבור המשתמש.