การจัดการระบบผู้ใช้เบื้องหน้าและเบื้องหลัง

ในอุปกรณ์เคลื่อนที่ Android การสนับสนุนผู้ใช้หลายรายทำให้ผู้ใช้สามารถทำงานในเบื้องหลัง (เมื่อมีผู้ใช้รายอื่นใช้งานอยู่) และในเบื้องหน้า (หรือที่เรียกว่าผู้ใช้ปัจจุบัน) เพื่ออนุรักษ์ทรัพยากรตามความเหมาะสม ระบบจะจัดการการปิดระบบของผู้ใช้ จำเป็นต้องมีผู้ใช้เบื้องหน้าหนึ่งคนเสมอ

เริ่มต้นด้วย Android 10 Android Automotive มีการกำหนดค่าเริ่มต้นที่อนุญาตให้ผู้ใช้ทำงานได้สูงสุดครั้งละสามคน เท่านั้น ( config_multiuserMaxRunningUsers ) ดังนั้น นอกเหนือจากผู้ใช้ระบบ headless (ผู้ใช้ 0) แล้ว สามารถกำหนดค่าผู้ใช้เบื้องหน้าและผู้ใช้พื้นหลังได้เพียงคนเดียวเท่านั้น

  • ในสถานการณ์ทั่วไป ผู้ใช้ปัจจุบันจะทำงานในเบื้องหน้า และผู้ใช้ระบบไร้ศีรษะ (ผู้ใช้ 0) จะทำงานในเบื้องหลัง เมื่อผู้ใช้ถูกย้ายไปยังพื้นหลัง ผู้ใช้จะถูกหยุดแต่ไม่ถูกล็อค เมื่อถึงจำนวนผู้ใช้สูงสุด ผู้ใช้พื้นหลังที่ใช้ล่าสุดน้อยที่สุดจะถูกหยุดและล็อค ( config_multiuserDelayUserDataLocking )
  • ผู้ใช้ที่หยุดและปลดล็อคพื้นหลังจะรีสตาร์ทระหว่าง โหมดโรงรถ

ผู้ใช้ทั่วไปเป็นเพียงผู้ใช้ชั่วคราวและสามารถทำงานได้เฉพาะเบื้องหน้าเท่านั้น เมื่อบุคคลเปลี่ยนออกจาก Guest User ของผู้ใช้ทั่วไปจะหยุดทำงานและไม่สามารถทำงานในเบื้องหลังได้

กระบวนการผู้ใช้เบื้องหลัง

เมื่อผู้ใช้เปลี่ยนจากเบื้องหน้าเป็นเบื้องหลัง (และในทางกลับกัน) กิจกรรมและบริการเบื้องหน้าทั้งหมดสำหรับผู้ใช้นั้นจะถูกยกเลิก สิ่งนี้นำไปสู่การหยุดบริการทั้งหมดที่เกี่ยวข้องกับบริการเหล่านั้น อย่างไรก็ตาม ยังมีการทำความสะอาดอยู่บ้าง บริการต่อ เนื่องจากแอประบบบุคคลที่หนึ่งและ OEM ยังคงทำงานต่อไปตราบเท่าที่ผู้ใช้ (ขณะนี้อยู่ในเบื้องหลัง) ไม่หยุดทำงาน

บริการแบบถาวรจะมีปัญหามากขึ้นเนื่องจากบริการเหล่านี้อยู่ในกลุ่มที่มีลำดับความสำคัญสูงในระบบการจัดการหน่วยความจำไม่เพียงพอ (OOM) ของ Android แม้ว่าแอปสำหรับผู้ใช้เบื้องหน้าต้องการหน่วยความจำเพิ่ม แต่กระบวนการในเบื้องหลังที่คงอยู่เหล่านั้นจะไม่ยุติลง ด้วยเหตุนี้ จากมุมมองของผู้ใช้เบื้องหน้า บริการที่คงอยู่จะแกะสลักหน่วยความจำจำนวนหนึ่งอย่างถาวร และหน่วยความจำนั้นจะถูกส่งกลับเฉพาะเมื่อมีผู้รีบูตรถและผู้ใช้ในเบื้องหลังหยุดทำงานเท่านั้น

สถานะผู้ใช้

ผู้ใช้อยู่ในสถานะหยุด ( STATE_SHUTDOWN ) จนกว่าผู้ใช้จะเริ่มทำงาน หากมีการตั้งค่าข้อมูลรับรองผู้ใช้ (เช่น PIN) ผู้ใช้ Android จะทำงานแต่ยังคงล็อคอยู่ ( STATE_RUNNING_LOCKED ) จนกว่าบุคคลจะปลดล็อคหน้าจอล็อคสำหรับผู้ใช้นั้น เมื่อผู้ใช้ถูกปลดล็อค พื้นที่จัดเก็บ ข้อมูลที่เข้ารหัสข้อมูลรับรอง จะถูกถอดรหัส และไดเร็กทอรีข้อมูลสำหรับผู้ใช้นั้นจะพร้อมใช้งาน สำหรับการสลับผู้ใช้โดยทั่วไป ผู้ใช้ในเบื้องหลังจะไม่ถูกหยุดและยังคงทำงานและปลดล็อค ( STATE_RUNNING_UNLOCKED ) เมื่อปลดล็อคแล้ว

โหมดโรงรถ, JobScheduler และการอัปเดตแอปสำหรับผู้ใช้

เทคนิคที่แนะนำสำหรับแอปยานยนต์ในการอัปเดตข้อมูลคือการใช้ JobScheduler เพื่อกำหนดเวลางานให้ทำงานเมื่ออุปกรณ์อยู่ในสถานะไม่ได้ใช้งานผ่าน โหมดโรงรถ (เช่น การดาวน์โหลดแอปอัปเดตจาก Google Play Store) หลังจากที่แอปลงทะเบียนงานกับ JobScheduler และ JobSchedulerService แล้ว งานจะถูกดำเนินการเมื่อเป็นไปได้

CarService ส่งสัญญาณไปยัง JobSchedulerService เพื่อทริกเกอร์งานที่ตั้งค่าให้ทำงานเมื่ออุปกรณ์ยานยนต์ ไม่ได้ใช้งาน ผ่านโหมดโรงรถ เพื่อให้ JobSchedulerService รันงานสำหรับผู้ใช้เบื้องหลัง ผู้ใช้นั้นจะต้องอยู่ในสถานะ STATE_RUNNING_UNLOCKED งานที่เข้าคิวใน JobSchedulerService จะยังคงอยู่และคงอยู่ตลอดวงจรพลังงาน

JobScheduler ไม่สามารถรันงานสำหรับผู้ใช้รายใดรายหนึ่งได้ หากผู้ใช้ไม่เคยถูกปลดล็อคหลังจากรอบการใช้พลังงาน อย่างไรก็ตาม เมื่อปลดล็อคแล้ว และหากผู้ใช้ยังคงอยู่ใน STATE_RUNNING_UNLOCKED งานสำหรับผู้ใช้ก็สามารถรันได้