ใน 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()
หรือไม่ สิ่งนี้ทำให้สามารถแยกการเชื่อมต่อบางอย่างในการสื่อสารของสถานะวงจรการใช้งานและสถานะที่กลับมาทำงานต่อสูงสุดระหว่างเซิร์ฟเวอร์และฝั่งไคลเอ็นต์