ก่อนอื่นให้ลองดูโพสต์ของฉันในส่วนที่ถูกเก็บ มันอาจช่วยได้
ตอนนี้เพื่อตอบคำถามของคุณ:
ส่วนย่อยยังคงสถานะมุมมองหรือไม่หรือสิ่งนี้จะถูกสร้างขึ้นใหม่เมื่อมีการเปลี่ยนแปลงการกำหนดค่า - "คงไว้" คืออะไร?
ใช่Fragment
สถานะของจะคงอยู่ตลอดการเปลี่ยนแปลงการกำหนดค่า โดยเฉพาะ "เก็บไว้" หมายความว่าชิ้นส่วนจะไม่ถูกทำลายในการเปลี่ยนแปลงการกำหนดค่า นั่นคือFragment
จะถูกเก็บรักษาไว้แม้ว่าการเปลี่ยนแปลงการกำหนดค่าจะทำให้ข้อมูลอ้างอิงActivity
ถูกทำลาย
ส่วนจะถูกทำลายเมื่อผู้ใช้ออกจากกิจกรรมหรือไม่
เช่นเดียวกับActivity
s ระบบFragment
อาจถูกทำลายเมื่อทรัพยากรหน่วยความจำเหลือน้อย ไม่ว่าคุณจะมีชิ้นส่วนของคุณรักษารัฐอินสแตนซ์ของพวกเขาข้ามเปลี่ยนแปลงการกำหนดค่าจะไม่มีผลกระทบหรือไม่ว่าระบบจะทำลายFragment
s Activity
เมื่อคุณออกจาก หากคุณออกจากActivity
(เช่นโดยการกดปุ่มโฮม) Fragment
s อาจจะถูกทำลายหรือไม่ หากคุณออกจากการActivity
กดปุ่มย้อนกลับ (เช่นการโทรfinish()
และทำลายอย่างมีประสิทธิภาพActivity
) Activity
s ที่แนบมาทั้งหมดFragment
จะถูกทำลายเช่นกัน
ทำไมมันไม่ทำงานกับเศษเล็กเศษน้อยในกองหลัง?
อาจมีสาเหตุหลายประการที่ไม่รองรับ แต่เหตุผลที่ชัดเจนที่สุดสำหรับฉันคือการActivity
อ้างอิงFragmentManager
และการFragmentManager
จัดการ backstack นั่นคือไม่ว่าคุณจะเลือกที่จะเก็บไว้Fragment
หรือไม่ก็ตามActivity
(และดังนั้นFragmentManager
แบ็คสต็อกของ) จะถูกทำลายในการเปลี่ยนแปลงการกำหนดค่า อีกเหตุผลหนึ่งที่ทำให้มันใช้งานไม่ได้เพราะสิ่งต่าง ๆ อาจมีความยุ่งยากหากทั้งชิ้นส่วนที่เก็บไว้และชิ้นส่วนที่ไม่ได้รับการเก็บรักษาได้รับอนุญาตให้อยู่บน backstack เดียวกัน
กรณีการใช้งานแบบไหนที่เหมาะสมกับการใช้วิธีนี้?
ชิ้นส่วนที่เก็บไว้จะมีประโยชน์มากสำหรับการเผยแพร่ข้อมูลสถานะโดยเฉพาะการจัดการเธรด - ข้ามอินสแตนซ์ของกิจกรรม ตัวอย่างเช่นแฟรกเมนต์สามารถใช้เป็นโฮสต์สำหรับอินสแตนซ์ของThread
หรือAsyncTask
การจัดการการดำเนินการ ดูโพสต์บล็อกของฉันในหัวข้อนี้สำหรับข้อมูลเพิ่มเติม
โดยทั่วไปแล้วฉันจะถือว่ามันเหมือนกับการใช้onConfigurationChanged
กับActivity
... อย่าใช้มันเป็น bandaid เพียงเพราะคุณขี้เกียจเกินกว่าที่จะนำไปใช้ / จัดการกับการเปลี่ยนทิศทางได้อย่างถูกต้อง ใช้งานได้เฉพาะเมื่อคุณต้องการ