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

ใน Android 9 (และต่ำกว่า) แอปจะอยู่ในสถานะ PAUSED เมื่อ

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

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

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

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

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

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

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

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

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

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

Activity#onTopResumedActivityChanged(boolean onTop)

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

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

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

หากต้องการรักษาความเข้ากันได้เมื่อติดตั้งใช้งานฟีเจอร์หลายเวอร์ชันอีกครั้ง โปรดพิจารณาสิ่งต่อไปนี้ Google Cloud

กิจกรรมต่อเนื่องหลายรายการในขั้นตอนเดียวของแอป

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

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

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

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

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

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

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

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

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

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

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