หลายประวัติ

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

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

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

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

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

รูปที่ 1 เรซูเม่หลายรายการบนอุปกรณ์แบบพับได้

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

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

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

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

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

Activity#onTopResumedActivityChanged(boolean onTop)

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

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

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

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

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

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

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

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

หลายเรซูเม่

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

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

การเรียกกลับกิจกรรมที่กลับมาทำงานต่อยอดนิยม

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

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

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

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