การนำทางกลับคือวิธีที่ผู้ใช้เลื่อนไปตามประวัติของหน้าจอ ที่เข้าชมก่อนหน้านี้ อุปกรณ์ Android ทั้งหมดมีปุ่ม "กลับ" สำหรับ การนำทาง ดังนั้นคุณจึงไม่ควรเพิ่มปุ่ม "ย้อนกลับ" ลงใน UI ของแอป ขึ้นอยู่กับ อุปกรณ์ Android ของผู้ใช้ ปุ่มนี้อาจเป็นปุ่มจริงหรือซอฟต์แวร์
Android เก็บรักษาสแต็กสำรองของปลายทางไว้ขณะที่ผู้ใช้ไปยังส่วนต่างๆ
ในแอปพลิเคชันของคุณ ซึ่งโดยปกติจะช่วยให้ Android สามารถไปยัง
ปลายทางก่อนหน้าเมื่อกดปุ่มย้อนกลับ อย่างไรก็ตาม ก็มี
ที่แอปอาจต้องใช้ลักษณะการทำงาน "ย้อนกลับ" ของตัวเองเพื่อ
มอบประสบการณ์ที่ดีที่สุดแก่ผู้ใช้ เช่น เมื่อใช้ WebView
คุณอาจต้องการลบล้างการทำงานเริ่มต้นของปุ่ม "กลับ" เพื่อให้ผู้ใช้
ย้อนกลับผ่านประวัติการท่องเว็บแทนหน้าจอก่อนหน้า
ในแอปของคุณ
ใช้การนำทางกลับที่กำหนดเอง
ComponentActivity
ฐาน
ชั้นเรียนสำหรับ FragmentActivity
และ AppCompatActivity
จะช่วยให้คุณควบคุมการทำงานของปุ่ม "ย้อนกลับ" ได้โดยใช้
OnBackPressedDispatcher
ซึ่งสามารถดึงข้อมูลได้โดยโทรไปที่ getOnBackPressedDispatcher()
OnBackPressedDispatcher
จะควบคุมวิธีการส่งเหตุการณ์ของปุ่มย้อนกลับ
ไปยัง OnBackPressedCallback
อย่างน้อย 1 รายการ
ออบเจ็กต์ ตัวสร้างสำหรับ OnBackPressedCallback
จะใช้บูลีนสำหรับค่า
สถานะเปิดใช้งานเริ่มต้น เฉพาะเมื่อเปิดใช้การติดต่อกลับ (เช่น
isEnabled()
ส่งคืน true
) ผู้จัดการจะโทรหา
handleOnBackPressed()
ในการจัดการกับเหตุการณ์ของปุ่มย้อนกลับ คุณสามารถเปลี่ยนสถานะเปิดใช้โดยการโทร
setEnabled()
เพิ่มการติดต่อกลับผ่านเมธอด addCallback
ขอแนะนำเป็นอย่างยิ่งให้
ใช้addCallback()
ซึ่งใช้ LifecycleOwner
การดำเนินการนี้จะทำให้มีการเพิ่ม OnBackPressedCallback
เมื่อ LifecycleOwner
เท่านั้น
Lifecycle.State.STARTED
กิจกรรมจะนำ Callback ที่ลงทะเบียนไว้ออกเมื่อเชื่อมโยง
LifecycleOwner
ถูกทำลาย ซึ่งช่วยป้องกันการรั่วไหลของหน่วยความจำและทำให้เหมาะสม
เพื่อใช้ใน Fragment หรือเจ้าของวงจรรายอื่นๆ ที่มีอายุการใช้งานสั้นกว่า
มากกว่ากิจกรรม
ตัวอย่างการใช้งาน Callback
Kotlin
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback will only be called when MyFragment is at least Started. val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Java
public class MyFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // This callback will only be called when MyFragment is at least Started. OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) { @Override public void handleOnBackPressed() { // Handle the back button event } }; requireActivity().getOnBackPressedDispatcher().addCallback(this, callback); // The callback can be enabled or disabled here or in handleOnBackPressed() } ... }
คุณโทรกลับได้หลายรายการผ่านaddCallback()
เมื่อดำเนินการดังกล่าว ระบบจะเรียกใช้ Callback ตามลำดับกลับกัน
เพิ่ม - Callback ที่เพิ่มล่าสุดคือรายการแรกที่ให้โอกาสในการจัดการ
เหตุการณ์ของปุ่มย้อนกลับ ตัวอย่างเช่น หากคุณเพิ่ม Callback 3 รายการที่ชื่อ
one
, two
และ three
ในลำดับ จะมีการเรียกใช้ตามลำดับ
three
, two
และ one
ตามลำดับ
Callback จะเป็นไปตาม
ห่วงโซ่ความรับผิดชอบ
รูปแบบ ระบบจะเรียกใช้ Callback แต่ละรายการในเชนเฉพาะเมื่อมีการเรียกใช้
ไม่ได้เปิดใช้ Callback ซึ่งหมายความว่าใน
ตัวอย่างก่อนหน้านี้ ระบบจะเรียกใช้ Callback two
เฉพาะในกรณีที่ Callback three
ไม่ได้เปิดใช้งาน จะมีการเรียกใช้ one
ของ Callback หาก Callback two
เท่านั้น
ไม่ได้เปิดใช้งาน และอื่นๆ
โปรดทราบว่าเมื่อเพิ่มผ่าน addCallback()
Callback จะไม่เพิ่มลงในห่วงโซ่ความรับผิดชอบจนกว่า
LifecycleOwner
เข้าสู่
Lifecycle.State.STARTED
การเปลี่ยนสถานะการเปิดใช้ใน OnBackPressedCallback
มีผลอย่างมาก
ขอแนะนําสําหรับการเปลี่ยนแปลงชั่วคราวเนื่องจากยังคงเป็นไปตามลําดับที่อธิบายไว้ข้างต้น
ซึ่งสำคัญอย่างยิ่งหากคุณมี Callback ที่ลงทะเบียนใน
เจ้าของวงจรที่ซ้อนกันแต่ละราย
แต่ในกรณีที่ต้องการนำ OnBackPressedCallback
ออกทั้งหมด
เธอควรโทรหา
remove()
แต่โดยทั่วไปจะไม่จำเป็นต้องดำเนินการ เนื่องจากระบบจะนำ Callback ออกโดยอัตโนมัติเมื่อ LifecycleOwner
ที่เชื่อมโยง
ถูกทำลาย
กิจกรรม onBackPressed()
หากคุณกำลังใช้
onBackPressed()
ในการจัดการกับเหตุการณ์ของปุ่มย้อนกลับ เราขอแนะนำให้คุณใช้
OnBackPressedCallback
แทน
แต่หากคุณทำการเปลี่ยนแปลงนี้ไม่ได้ ให้ใช้กฎต่อไปนี้
- ระบบจะประเมิน Callback ทั้งหมดที่ลงทะเบียนผ่าน
addCallback
เมื่อคุณโทรหาsuper.onBackPressed()
- ใน Android 12 (API ระดับ 32) และต่ำกว่า จะมีการเรียกใช้
onBackPressed
เสมอ โดยไม่คำนึงถึงอินสแตนซ์ที่ลงทะเบียนของOnBackPressedCallback