วงจรของ Fragment

อินสแตนซ์ Fragment แต่ละรายการมีวงจรการใช้งานของตัวเอง เมื่อผู้ใช้ไปยังส่วนต่างๆ และโต้ตอบกับแอปของคุณ ข้อมูลโค้ดจะเปลี่ยนผ่านสถานะต่างๆ ในวงจรของข้อมูลโค้ดเมื่อมีการเพิ่ม นําออก และเข้าสู่หรือออกจากหน้าจอ

Fragment ใช้ LifecycleOwner เพื่อจัดการวงจร โดยแสดงออบเจ็กต์ Lifecycle ที่คุณเข้าถึงได้ผ่านเมธอด getLifecycle()

สถานะ Lifecycle ที่เป็นไปได้แต่ละสถานะจะแสดงใน Enum Lifecycle.State

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

คลาส Fragment มีเมธอดการเรียกกลับซึ่งสอดคล้องกับการเปลี่ยนแปลงแต่ละรายการในวงจรชีวิตของข้อมูลโค้ดLifecycleObserver ซึ่งได้แก่ onCreate(), onStart(), onResume(), onPause(), onStop() และ onDestroy()

มุมมองของข้อมูลพร็อพเพอร์ตี้จะมี Lifecycle แยกต่างหากซึ่งจัดการโดยอิสระจาก Lifecycle ของข้อมูลพร็อพเพอร์ตี้ ข้อมูลโค้ดจะเก็บLifecycleOwnerไว้สำหรับมุมมอง ซึ่งเข้าถึงได้โดยใช้ getViewLifecycleOwner() หรือ getViewLifecycleOwnerLiveData() การเข้าถึง Lifecycle ของมุมมองจะมีประโยชน์ในสถานการณ์ที่คอมโพเนนต์ที่รับรู้วงจรของชีวิตควรทํางานเฉพาะในขณะที่มุมมองของข้อมูลโค้ดมีอยู่ เช่น การสังเกต LiveData ที่มีไว้เพื่อแสดงบนหน้าจอเท่านั้น

หัวข้อนี้จะอธิบายวงจรชีวิตของ Fragment โดยละเอียด โดยอธิบายกฎบางอย่างที่กําหนดสถานะวงจรชีวิตของข้อมูลโค้ด และแสดงความสัมพันธ์ระหว่างสถานะ Lifecycle กับ Callback วงจรชีวิตของข้อมูลโค้ด

ฟragment และตัวจัดการฟragment

เมื่อสร้างอินสแตนซ์ของข้อมูลโค้ด ข้อมูลโค้ดจะเริ่มอยู่ในสถานะ INITIALIZED หากต้องการให้เศษเปลี่ยนผ่านวงจรที่เหลือ จะต้องเพิ่มเศษนั้นลงใน FragmentManager FragmentManager มีหน้าที่รับผิดชอบในการพิจารณาสถานะที่ควรเป็นของข้อมูลโค้ด จากนั้นจึงย้ายข้อมูลโค้ดไปยังสถานะนั้น

นอกจากวงจรของ Fragment แล้ว FragmentManager ยังมีหน้าที่รับผิดชอบในการแนบ Fragment กับกิจกรรมของโฮสต์และถอดออกเมื่อไม่มีการใช้ Fragment นั้นอีกต่อไป คลาส Fragment มีเมธอดการเรียกคืน 2 เมธอด ได้แก่ onAttach() และ onDetach() ซึ่งคุณสามารถลบล้างเพื่อดําเนินการเมื่อเกิดเหตุการณ์ใดเหตุการณ์หนึ่งเหล่านี้

ระบบจะเรียกใช้การเรียกกลับ onAttach() เมื่อเพิ่มข้อมูลโค้ดลงใน FragmentManager และแนบไว้กับกิจกรรมโฮสต์ ณ จุดนี้ ข้อมูลโค้ดจะทำงานอยู่ และ FragmentManager จะจัดการสถานะวงจรชีวิตของข้อมูลโค้ด เมื่อถึงจุดนี้ วิธีการ FragmentManager เช่น findFragmentById() จะแสดงผลข้อมูลโค้ดนี้

onAttach() จะเรียกใช้ก่อนการเปลี่ยนแปลงสถานะวงจรเสมอ

ระบบจะเรียกใช้การเรียกกลับ onDetach() เมื่อนําข้อมูลโค้ดออกจาก FragmentManager และแยกออกจากกิจกรรมของโฮสต์ ข้อมูลดังกล่าวไม่มีการใช้งานแล้วและไม่สามารถเรียกดูได้โดยใช้ findFragmentById()

ระบบจะเรียกใช้ onDetach() เสมอหลังจากการเปลี่ยนแปลงสถานะวงจร

โปรดทราบว่าการเรียกกลับเหล่านี้ไม่เกี่ยวข้องกับวิธี FragmentTransaction attach() และ detach() ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเหล่านี้ได้ที่แยกธุรกรรม

สถานะและ Callback ของวงจรของ Fragment

เมื่อพิจารณาสถานะวงจรชีวิตของข้อมูลโค้ด FragmentManager จะพิจารณาสิ่งต่อไปนี้

  • สถานะสูงสุดของข้อมูลโค้ดจะกำหนดโดย FragmentManager ของข้อมูลโค้ดนั้น เศษจะไม่เปลี่ยนแปลงสถานะจาก FragmentManager
  • คุณสามารถตั้งค่าสถานะวงจรสูงสุดในข้อมูลโค้ดโดยใช้ setMaxLifecycle() เป็นส่วนหนึ่งของ FragmentTransaction
  • สถานะวงจรชีวิตของข้อมูลโค้ดจะสูงกว่าของรายการหลักไม่ได้ เช่น จะต้องเริ่มใช้งานข้อมูลโค้ดหรือกิจกรรมหลักก่อนข้อมูลโค้ดย่อย ในทํานองเดียวกัน คุณต้องหยุดใช้งาน FRG ย่อยก่อน FRG หรือกิจกรรมหลัก
สถานะวงจรชีวิตของ Fragment และความสัมพันธ์ของสถานะเหล่านั้นกับทั้ง Callback วงจรชีวิตของ Fragment และวงจรชีวิตของมุมมอง Fragment
รูปที่ 1 สถานะ Lifecycle ของ Fragment และความสัมพันธ์กับทั้งการเรียกกลับวงจรชีวิตของ Fragment และมุมมอง Lifecycle ของ Fragment

รูปที่ 1 แสดงสถานะ Lifecycle ของข้อบังคับแต่ละรายการและความสัมพันธ์กับทั้งการเรียกกลับวงจรชีวิตของข้อบังคับและมุมมอง Lifecycle ของข้อบังคับ

เมื่อผ่านวงจร ข้อมูลโค้ดจะเลื่อนขึ้นและลงตามสถานะต่างๆ เช่น ข้อมูลโค้ดที่เพิ่มไว้ที่ด้านบนของกองซ้อนที่ซ้อนกันจะเลื่อนขึ้นจาก CREATED เป็น STARTED เป็น RESUMED ในทางกลับกัน เมื่อระบบนำรายการที่ฝังอยู่ออกจากกองซ้อนด้านหลัง รายการดังกล่าวจะย้ายลงผ่านสถานะต่างๆ จากRESUMED ไปSTARTED ไปCREATED และสุดท้ายคือDESTROYED

การเปลี่ยนสถานะจากล่างขึ้นบน

เมื่อเลื่อนขึ้นผ่านสถานะต่างๆ ของวงจร ฟรแกรมจะเรียกใช้การเรียกกลับของวงจรที่เกี่ยวข้องสำหรับสถานะใหม่ก่อน เมื่อการเรียกกลับนี้เสร็จสิ้นแล้ว Lifecycle.Event ที่เกี่ยวข้องจะส่งไปยังผู้สังเกตการณ์โดย Lifecycle ของข้อมูลโค้ด จากนั้นตามด้วยมุมมอง Lifecycle ของข้อมูลโค้ด หากมีการสร้างอินสแตนซ์แล้ว

สร้าง Fragment แล้ว

เมื่อ Fragment อยู่ในสถานะ CREATED แสดงว่าระบบได้เพิ่ม Fragment นั้นลงใน FragmentManager และเรียกใช้เมธอด onAttach() แล้ว

การดำเนินการนี้เหมาะสําหรับการกู้คืนสถานะที่บันทึกไว้ซึ่งเชื่อมโยงกับข้อมูลโค้ดผ่านSavedStateRegistry ของข้อมูลโค้ด โปรดทราบว่าระบบยังไม่ได้สร้างมุมมองของข้อมูลโค้ดในตอนนี้ และควรกู้คืนสถานะใดๆ ที่เชื่อมโยงกับมุมมองของข้อมูลโค้ดหลังจากสร้างมุมมองแล้วเท่านั้น

การเปลี่ยนสถานะนี้จะเรียกใช้การเรียกกลับ onCreate() นอกจากนี้ ฟังก์ชัน Callback ยังได้รับอาร์กิวเมนต์ savedInstanceState Bundle ที่มีสถานะใดๆ ที่บันทึกไว้ก่อนหน้านี้โดย onSaveInstanceState() ด้วย โปรดทราบว่า savedInstanceState จะมีค่า null เมื่อสร้างข้อมูลโค้ดครั้งแรก แต่จะไม่เท่ากับ Null เสมอสำหรับการสร้างใหม่ในภายหลัง แม้ว่าคุณจะไม่ได้ลบล้าง onSaveInstanceState() ก็ตาม ดูรายละเอียดเพิ่มเติมได้ที่การบันทึกสถานะด้วยข้อมูลโค้ดที่แยกส่วน

สร้าง FRGMENT และ เริ่มต้นใช้งานมุมมอง

ระบบจะสร้างมุมมอง Lifecycle ของข้อมูลโค้ดเมื่อ Fragment ของคุณระบุอินสแตนซ์ View ที่ถูกต้องเท่านั้น ในกรณีส่วนใหญ่ คุณสามารถใช้ตัวสร้างข้อมูลโค้ดแบบเป็นกลุ่มที่ใช้ @LayoutId ซึ่งจะสร้างมุมมองโดยอัตโนมัติในเวลาที่เหมาะสม นอกจากนี้ คุณยังลบล้าง onCreateView() เพื่อสร้างหรือขยายมุมมองของข้อมูลโค้ดที่ฝังอยู่แบบเป็นโปรแกรมได้ด้วย

เฉพาะในกรณีที่มีการสร้างอินสแตนซ์มุมมองของข้อมูลโค้ดที่ไม่ใช่ค่า Null View ระบบจะตั้งค่า View นั้นในข้อมูลโค้ดและสามารถดึงข้อมูลได้โดยใช้ getView() จากนั้น ระบบจะอัปเดต getViewLifecycleOwnerLiveData() ด้วย INITIALIZED ใหม่ LifecycleOwner ซึ่งสอดคล้องกับมุมมองของข้อมูลโค้ด ระบบจะเรียกใช้ Lifecycle Callback ของ onViewCreated() ในเวลานี้ด้วย

นี่เป็นตําแหน่งที่เหมาะสมในการตั้งค่าสถานะเริ่มต้นของมุมมอง เพื่อเริ่มสังเกตการณ์อินสแตนซ์ LiveData ของ Callback ที่อัปเดตมุมมองของแฟรกเมนต์ และเพื่อตั้งค่าอะแดปเตอร์ในอินสแตนซ์ RecyclerView หรือ ViewPager2 ในมุมมองของแฟรกเมนต์

สร้างข้อมูลโค้ดและมุมมองแล้ว

หลังจากสร้างมุมมองของข้อมูลโค้ดแล้ว ระบบจะกู้คืนสถานะมุมมองก่อนหน้า (หากมี) จากนั้นจะย้าย Lifecycle ของมุมมองไปยังสถานะ CREATED เจ้าของวงจรชีวิตของมุมมองจะส่งเหตุการณ์ ON_CREATE ไปยังผู้สังเกตการณ์ด้วย คุณควรกู้คืนสถานะเพิ่มเติมที่เชื่อมโยงกับมุมมองของข้อมูลโค้ดที่นี่

การเปลี่ยนผ่านนี้จะเรียกใช้การเรียกคืนonViewStateRestored()ด้วย

เริ่มต้นใช้งาน FRG และ View

ขอแนะนำเป็นอย่างยิ่งให้เชื่อมโยงคอมโพเนนต์ที่รับรู้ถึงวงจรกับสถานะ STARTED ของส่วนย่อย เนื่องจากสถานะนี้รับประกันว่าจะมีมุมมองของส่วนย่อยอยู่ หากมีการสร้างมุมมองขึ้นมา และดำเนินการ FragmentTransaction ในส่วนย่อย FragmentManager ของส่วนย่อยได้อย่างปลอดภัย หากมุมมองของข้อมูลโค้ดไม่เท่ากับ Null ระบบจะย้ายLifecycleของข้อมูลโค้ดไปยัง STARTED ทันทีหลังจากที่ย้ายLifecycleของข้อมูลโค้ดไปยัง STARTED

เมื่อข้อมูลโค้ดกลายเป็น STARTED ระบบจะเรียกใช้การเรียกกลับ onStart()

แสดงตัวอย่างและดูต่อ

เมื่อข้อมูลโค้ดแสดงอยู่ แสดงว่าเอฟเฟกต์ Animator และ Transition ทั้งหมดเสร็จสมบูรณ์แล้ว และข้อมูลโค้ดพร้อมให้ผู้ใช้โต้ตอบ Lifecycle ของข้อมูลโค้ดจะเปลี่ยนเป็นสถานะ RESUMED และระบบจะเรียกใช้การเรียกกลับ onResume()

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

การเปลี่ยนสถานะลง

เมื่อมีการย้ายข้อมูลไปยังสถานะวงจรชีวิตของรายการย่อยที่ต่ำลง Lifecycle ที่เกี่ยวข้องจะส่งไปยังผู้สังเกตการณ์โดยมุมมอง Lifecycle ของรายการย่อย หากมีการสร้างอินสแตนซ์แล้ว ตามด้วย Lifecycle ของรายการย่อยLifecycle.Event หลังจากมีการส่งเหตุการณ์วงจรของ Fragment แล้ว Fragment จะเรียกใช้การเรียกกลับวงจรที่เกี่ยวข้อง

เริ่มต้นใช้งาน FRG และ View

เมื่อผู้ใช้เริ่มออกจากข้อมูลโค้ด และในขณะที่ข้อมูลโค้ดนั้นยังมองเห็นได้ ระบบจะย้าย Lifecycle ของข้อมูลโค้ดและมุมมองของข้อมูลโค้ดกลับไปยังสถานะ STARTED และส่งเหตุการณ์ ON_PAUSE ไปยังผู้สังเกตการณ์ จากนั้น ข้อมูลโค้ดจะเรียกใช้การเรียกกลับ onPause()

สร้างข้อมูลโค้ดและมุมมองแล้ว

เมื่อไม่เห็นข้อมูลโค้ดอีกต่อไป ระบบจะย้าย Lifecycle ของข้อมูลโค้ดและมุมมองข้อมูลโค้ดไปยังสถานะ CREATED และส่งเหตุการณ์ ON_STOP ไปยังผู้สังเกตการณ์ การเปลี่ยนสถานะนี้ไม่เพียงทริกเกอร์โดยการหยุดกิจกรรมหรือแฟรกเมนต์หลักเท่านั้น แต่ยังทริกเกอร์โดยการบันทึกสถานะของกิจกรรมหรือแฟรกเมนต์หลักด้วย ลักษณะการทํางานนี้รับประกันว่าระบบจะเรียกเหตุการณ์ ON_STOP ก่อนที่จะบันทึกสถานะของข้อมูลโค้ด ซึ่งทำให้เหตุการณ์ ON_STOP เป็นจุดสุดท้ายที่ปลอดภัยในการดําเนินการ FragmentTransaction กับเด็ก FragmentManager

ดังที่แสดงในรูปที่ 2 ลําดับของ onStop() callback และการบันทึกสถานะด้วย onSaveInstanceState() จะแตกต่างกันไปตามระดับ API สําหรับ API ทุกระดับก่อน API ระดับ 28 ระบบจะเรียกใช้ onSaveInstanceState() ก่อน onStop() สำหรับ API ระดับ 28 ขึ้นไป ลำดับการเรียกจะกลับกัน

ความแตกต่างของลําดับการเรียกใช้สำหรับ onStop() และ onSaveInstanceState()
รูปที่ 2 ความแตกต่างของลําดับการโทรสําหรับ onStop() และ onSaveInstanceState()

สร้างข้อมูลโค้ดแล้วและมุมมองถูกทำลาย

หลังจากที่ภาพเคลื่อนไหวและการเปลี่ยนเฟรมทั้งหมดสิ้นสุดลง และมุมมองของข้อมูลโค้ดโค้ดที่แยกออกจากหน้าต่างแล้ว ระบบจะย้ายมุมมอง Lifecycle ของข้อมูลโค้ดโค้ดไปยังสถานะ DESTROYED และส่งเหตุการณ์ ON_DESTROY ไปยังผู้สังเกตการณ์ จากนั้น ข้อมูลโค้ดจะเรียกใช้การเรียกคืน onDestroyView() เมื่อถึงจุดนี้ มุมมองของข้อมูลโค้ดจะสิ้นสุดวงจร และ getViewLifecycleOwnerLiveData() จะแสดงผลเป็นค่า null

เมื่อถึงจุดนี้ คุณควรนําการอ้างอิงทั้งหมดไปยังมุมมองของข้อมูลโค้ดที่แยกส่วนออก เพื่อให้ระบบรวบรวมขยะในมุมมองของข้อมูลโค้ดที่แยกส่วน

ทำลาย Fragment แล้ว

หากนําเศษข้อมูลออก หรือหาก FragmentManager ถูกทำลาย ระบบจะย้าย Lifecycle ของเศษข้อมูลไปยังสถานะ DESTROYED และส่งเหตุการณ์ ON_DESTROY ไปยังผู้สังเกตการณ์ จากนั้น ข้อมูลโค้ดจะเรียกใช้การเรียกคืน onDestroy() เมื่อถึงจุดนี้ ข้อมูลโค้ดจะสิ้นสุดวงจร

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรชีวิตของข้อมูลโค้ดได้จากแหล่งข้อมูลเพิ่มเติมต่อไปนี้

เส้นนำ

บล็อก