ใน 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)
เมื่อเรียกใช้ ระบบจะเรียกใช้การเรียกกลับนี้ระหว่าง Activity#onResume()
ถึง Activity#onPause()
คุณจะเรียกใช้การเรียกกลับนี้หรือไม่ก็ได้และข้ามได้เพื่อให้กิจกรรมเปลี่ยนจากสถานะ RESUMED
เป็น PAUSED
ได้โดยไม่ต้องเป็นกิจกรรมบนสุดในระบบ เช่น ในโหมดหลายหน้าต่าง
เนื่องจากเป็นตัวเลือก จึงไม่เป็นส่วนหนึ่งของวงจรของกิจกรรมและควรใช้น้อยครั้ง
กิจกรรมที่กลับมาทำงานต่อจากด้านบนรายการก่อนหน้าจะรับและดำเนินการ 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
การเรียกกลับกิจกรรมที่กลับมาทำงานอีกครั้ง
หลังจากการดําเนินการที่อาจทําให้กิจกรรมบนสุดมีการเปลี่ยนแปลง (เช่น การเริ่มกิจกรรม การกลับมาทํางานต่อ หรือการเปลี่ยนแปลงลําดับชั้น Z) ระบบจะเรียกใช้ ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
วิธีนี้จะตรวจสอบว่ากิจกรรมที่กลับมาทำงานอีกครั้งซึ่งอยู่ด้านบนสุดมีการเปลี่ยนแปลงหรือไม่ และจะทำการอัปเดตหากจําเป็น หากกิจกรรมที่กลับมาทำงานต่อสูงสุดก่อนหน้านี้ยังไม่ได้ปล่อยสถานะที่กลับมาทำงานต่อสูงสุด ระบบจะส่งข้อความการสูญเสียสถานะที่กลับมาทำงานต่อสูงสุดไปยังกิจกรรมดังกล่าวและกำหนดเวลาหมดเวลาฝั่งเซิร์ฟเวอร์ (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
)
ระบบจะส่งรายงานสถานะที่กลับมาทำงานต่อสูงสุดไปยังกิจกรรมถัดไปหลังจากที่กิจกรรมก่อนหน้าปล่อยสถานะดังกล่าว หรือเมื่อหมดเวลา (ดูการใช้งานของ
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
เพิ่มรายการธุรกรรม TopResumedActivityChangeItem
รายการใหม่เพื่อรายงานการเปลี่ยนแปลงสถานะ "กลับมาทำงานต่อจากด้านบน" ไปยังไคลเอ็นต์ และใช้ประโยชน์จากสถาปัตยกรรม ActivityLifecycler
จาก Android 9
ระบบจะจัดเก็บสถานะที่กลับมาทำงานต่อสูงสุดไว้ฝั่งไคลเอ็นต์ และทุกครั้งที่กิจกรรมเปลี่ยนเป็น RESUMED
หรือ PAUSED
ระบบจะตรวจสอบด้วยว่าควรเรียกใช้การเรียกกลับ onTopResumedActivityChanged()
หรือไม่ ซึ่งช่วยให้สามารถแยกการโค้ดบางส่วนในการสื่อสารสถานะวงจรชีวิตของเซิร์ฟเวอร์และสถานะที่กลับมาทำงานต่อด้านบนระหว่างฝั่งเซิร์ฟเวอร์และไคลเอ็นต์