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