เล่นต่อหลายรายการ

ใน Android 9 (และเวอร์ชันต่ำกว่า) แอปจะเข้าสู่สถานะ PAUSED ในกรณีต่อไปนี้

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

สถานการณ์เหล่านี้แตกต่างกันไปตามจํานวนการหยุดชั่วคราวที่แอปต้องทํา แต่ไม่สามารถแยกความแตกต่างได้ที่ระดับแอป

ใน Android 10 กิจกรรมที่โฟกัสได้ที่ด้านบนทั้งหมดในกองที่มองเห็นได้จะอยู่ในรูปแบบRESUMED ซึ่งปรับปรุงความเข้ากันได้กับโหมดหลายหน้าต่างและโหมด MD สำหรับแอปที่ใช้ onPause() แทน onStop() เพื่อหยุดรีเฟรช UI และโต้ตอบกับผู้ใช้ ซึ่งหมายความว่า

  • กิจกรรมทั้ง 2 รายการในโหมดแยกหน้าจอจะกลับมาทำงานอีกครั้ง
  • กิจกรรมที่มองเห็นได้บนสุดทั้งหมดในโหมดกรอบเวลารูปแบบอิสระจะกลับมาทำงานอีกครั้ง
  • คุณสามารถกลับมาดำเนินการกิจกรรมบนหน้าจอหลายหน้าจอพร้อมกันได้

รูปที่ 1 กลับมาใช้งานต่อได้บนอุปกรณ์แบบพับได้

รูปที่ 2 ดำเนินการต่อหลายรายการในโหมดเดสก์ท็อป

กิจกรรมอาจอยู่ในสถานะ PAUSED เมื่อโฟกัสไม่ได้หรือถูกบดบังบางส่วน เช่น

  • ในโหมดแยกหน้าจอที่ย่ออยู่ (โดยมีตัวเปิดแอปอยู่ด้านข้าง) กิจกรรมด้านบนจะไม่กลับมาทำงานต่อเนื่องจากไม่สามารถโฟกัสได้
  • ในโหมดภาพซ้อนภาพ กิจกรรมจะไม่กลับมาทำงานต่อเนื่องจากโหมดนี้ไม่สามารถโฟกัสได้
  • เมื่อกิจกรรมอยู่ภายใต้กิจกรรมที่โปร่งใสอื่นๆ ในกองเดียวกัน

วิธีนี้บ่งบอกให้แอปทราบว่ากิจกรรมจะรับอินพุตจากผู้ใช้ได้ในสถานะ RESUMED เท่านั้น ก่อน Android 10 กิจกรรมยังรับอินพุตในสถานะ PAUSED ได้ด้วย (เช่น ลองแตะทั้ง 2 กิจกรรมในโหมดแยกหน้าจอพร้อมกันในอุปกรณ์ที่ใช้ Android 9)

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

Activity#onTopResumedActivityChanged(boolean onTop)

เมื่อเรียกใช้ ระบบจะเรียก Callback นี้ระหว่าง Activity#onResume() ถึง Activity#onPause() คุณจะเรียกใช้การเรียกกลับนี้หรือไม่ก็ได้และข้ามได้เพื่อให้กิจกรรมเปลี่ยนจากสถานะ RESUMED เป็น PAUSED ได้โดยไม่ต้องเป็นกิจกรรมบนสุดในระบบ เช่น ในโหมดหลายหน้าต่าง เนื่องจาก Callback นี้เป็นตัวเลือกที่ไม่บังคับ จึงไม่ได้เป็นส่วนหนึ่งของวงจรกิจกรรมและควรไม่ค่อยได้ใช้

กิจกรรมที่กลับมาทำงานต่อจากด้านบนรายการก่อนหน้าจะรับและดำเนินการ onTopResumedActivity(false) จนเสร็จสิ้นก่อนที่กิจกรรมที่กลับมาทำงานต่อจากด้านบนรายการถัดไปจะรับ onTopResumedActivity(true) เว้นแต่ว่ากิจกรรมก่อนหน้าจะใช้เวลานานเกินไปในการจัดการการเรียกเมธอดและหมดเวลา 500 มิลลิวินาที

ความเข้ากันได้

หากต้องการรักษาความเข้ากันได้เมื่อใช้ Resume หลายรายการ ให้พิจารณาใช้โซลูชันต่อไปนี้

กิจกรรมที่กลับมาทำงานต่อหลายรายการในกระบวนการของแอปเดียว

  • ปัญหา ใน Android 9 และเวอร์ชันต่ำกว่า ระบบจะกลับมาทำงานต่อได้ทีละกิจกรรมเท่านั้น การเปลี่ยนระหว่างกิจกรรมทั้งหมดเกี่ยวข้องกับการหยุดกิจกรรมชั่วคราวก่อนกลับมาทำกิจกรรมอื่นต่อ แอปและเฟรมเวิร์กบางรายการ (เช่น Flutter หรือ LocalActivityManager ของ Android) ใช้ข้อเท็จจริงนี้และจัดเก็บสถานะเกี่ยวกับกิจกรรมที่กลับมาทำงานต่อใน Singleton
  • โซลูชัน ใน Android 9 และต่ำกว่า หากมีกิจกรรม 2 รายการจากกระบวนการเดียวกันที่กลับมาทำงานอีกครั้ง ระบบจะกลับมาทำงานต่อเฉพาะกิจกรรมที่มีลําดับ Z สูงกว่า แอปที่กําหนดเป้าหมายเป็น Android 10 จะรองรับการดําเนินการหลายรายการที่กลับมาทํางานพร้อมกันได้

การเข้าถึงกล้องพร้อมกัน

  • ปัญหา ปัญหาเหล่านี้ยังเกิดขึ้นใน Android 9 และต่ำกว่าด้วย ตัวอย่างเช่น กิจกรรมแบบเต็มหน้าจอและกิจกรรมที่กลับมาทำงานอีกครั้งอาจสูญเสียโฟกัสของกล้องไปให้กับกิจกรรมที่หยุดชั่วคราวซึ่งอยู่ด้านบนในโหมดภาพซ้อนภาพ แต่อาจได้รับการแสดงมากขึ้นเมื่อผู้ใช้ใช้โหมดหลายหน้าต่างและหลายจอแสดงผลมากขึ้น
    • เนื่องจากสถานะ RESUME มีการเปลี่ยนแปลง แอปจึงอาจถูกตัดการเชื่อมต่อจากกล้องแม้ว่าจะกลับมาทำงานอีกครั้ง ในการแก้ปัญหานี้ แอปต้อง จัดการการตัดการเชื่อมต่อกล้องโดยไม่ให้เกิดข้อขัดข้อง เมื่อตัดการเชื่อมต่อ แอปจะได้รับการเรียกกลับแบบตัดการเชื่อมต่อและการเรียก API ทั้งหมดจะเริ่มแสดงCameraAccessException
    • resizeableActivity=false ไม่ได้รับประกันสิทธิ์เข้าถึงกล้องแต่เพียงผู้เดียว เนื่องจากแอปอื่นๆ ที่ใช้กล้องสามารถเปิดในจอแสดงผลอื่นๆ ได้
  • วิธีแก้ปัญหา นักพัฒนาซอฟต์แวร์ควรมีตรรกะเมื่อแอป ถูกตัดการเชื่อมต่อจากกล้อง หากแอปตัดการเชื่อมต่อจากกล้อง แอปควรรอการเรียกกลับความพร้อมใช้งานของกล้องเพื่อพยายามเชื่อมต่ออีกครั้งและใช้กล้องต่อ นอกเหนือจากCameraManager#AvailabilityCallback#onCameraAvailable()การเรียกกลับที่มีอยู่แล้ว Android 10 ยังมีCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() ซึ่งครอบคลุมกรณีที่โฟกัส (และลำดับความสำคัญของกล้อง) สลับไปมาระหว่างกิจกรรมที่กลับมาทำงานอีกครั้งหลายรายการ นักพัฒนาแอปควรใช้การเรียกกลับทั้ง 2 รายการนี้เพื่อพิจารณาเวลาที่เหมาะในการพยายามเข้าถึงกล้อง

เล่นต่อหลายรายการ

ใน Android 10 สถานะวงจรชีวิตของกิจกรรมจะกำหนดโดยระดับการมองเห็นและลําดับ Z หากต้องการตรวจสอบว่าสถานะถูกต้องหลังจากอัปเดตการแสดงผลในกิจกรรมและประเมินว่าสถานะวงจรใดที่ใช้ได้ ให้เรียกใช้เมธอด ActivityRecord#makeActiveIfNeeded() จากตำแหน่งต่างๆ ใน Android 10 สถานะ "ทำงานอยู่" หมายถึง RESUMED หรือ PAUSED และใช้ได้กับอินสแตนซ์ 2 รายการนี้เท่านั้น

ใน Android 10 ระบบจะติดตามการกลับมาทำงานของกิจกรรมแยกกันในแต่ละกองแทนที่จะติดตามในตำแหน่งเดียวในระบบ เนื่องจากสามารถเปลี่ยนกิจกรรมหลายรายการพร้อมกันในโหมดหลายหน้าต่าง ดูรายละเอียดได้ที่ ActivityStack#mInResumeTopActivity

Callback กิจกรรมที่กลับมาได้รับความนิยมอีกครั้ง

หลังจากการดําเนินการที่อาจทําให้กิจกรรมบนสุดมีการเปลี่ยนแปลง (เช่น การเริ่มกิจกรรม การกลับมาทํางานต่อ หรือการเปลี่ยนแปลงลําดับชั้น Z) ระบบจะเรียกใช้ ActivityStackSupervisor#updateTopResumedActivityIfNeeded() วิธีนี้จะตรวจสอบว่ากิจกรรมที่กลับมาทำงานอีกครั้งซึ่งอยู่ด้านบนสุดมีการเปลี่ยนแปลงหรือไม่ และจะทำการอัปเดตหากจําเป็น หากกิจกรรมที่กลับมาทำงานต่อสูงสุดก่อนหน้านี้ยังไม่ได้ปล่อยสถานะที่กลับมาทำงานต่อสูงสุด ระบบจะส่งข้อความการสูญเสียสถานะที่กลับมาทำงานต่อสูงสุดไปยังกิจกรรมดังกล่าวและกำหนดเวลาหมดเวลาฝั่งเซิร์ฟเวอร์ (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()) ระบบจะส่งรายงานสถานะที่กลับมาทำงานต่อสูงสุดไปยังกิจกรรมถัดไปหลังจากที่กิจกรรมก่อนหน้าปล่อยสถานะดังกล่าว หรือเมื่อหมดเวลา (ดูการใช้งานของ

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

เพิ่มรายการธุรกรรม TopResumedActivityChangeItem รายการใหม่เพื่อรายงานการเปลี่ยนแปลงสถานะ "กลับมาทำงานต่อจากด้านบน" ไปยังไคลเอ็นต์ และใช้ประโยชน์จากสถาปัตยกรรม ActivityLifecycler จาก Android 9

ระบบจะจัดเก็บสถานะ "กลับมาทำงานต่อจากด้านบน" ไว้ฝั่งไคลเอ็นต์ และทุกครั้งที่กิจกรรมเปลี่ยนเป็น RESUMED หรือ PAUSED ระบบจะตรวจสอบด้วยว่าควรเรียกใช้การเรียกกลับ onTopResumedActivityChanged() หรือไม่ ซึ่งช่วยให้สามารถแยกการโค้ดบางส่วนในการสื่อสารสถานะวงจรชีวิตของเซิร์ฟเวอร์และสถานะที่กลับมาทำงานต่อด้านบนระหว่างฝั่งเซิร์ฟเวอร์และไคลเอ็นต์