ผู้ใช้จะย้อนกลับผ่านหน้าจอต่างๆ โดยใช้การนำทางย้อนกลับ อุปกรณ์ Android ส่วนใหญ่มีปุ่มย้อนกลับ ซึ่งอาจเป็นปุ่มจริง ซอฟต์แวร์ หรือการใช้ท่าทางสัมผัส โดยปกติแล้ว คุณไม่ควรเพิ่มปุ่มย้อนกลับลงในแอป แต่อุปกรณ์ Android Automotive OS (AAOS) ในโหมดความเข้ากันได้จะใช้ปุ่มย้อนกลับของระบบ ซึ่งจะจัดการการนำทาง คุณจึงไม่จำเป็นต้องเพิ่มการนำทางของคุณเอง โปรดดูรายละเอียดที่โหมดความเข้ากันได้ของ AAOS
Android จะดูแลสแต็กย้อนกลับของปลายทางขณะที่ผู้ใช้ไปยังส่วนต่างๆ
ในแอปพลิเคชัน ซึ่งโดยปกติแล้วจะช่วยให้ Android นำทางไปยัง
ปลายทางก่อนหน้าได้อย่างถูกต้องเมื่อกดปุ่มย้อนกลับ อย่างไรก็ตาม มีบางกรณีที่แอปอาจต้องใช้ลักษณะการทำงานของปุ่มย้อนกลับของตัวเองเพื่อมอบประสบการณ์การใช้งานที่ดีที่สุดเท่าที่จะเป็นไปได้ ตัวอย่างเช่น เมื่อใช้ WebView
คุณอาจต้องการลบล้างลักษณะการทำงานเริ่มต้นของปุ่มย้อนกลับเพื่อให้ผู้ใช้
ย้อนกลับผ่านประวัติการท่องเว็บแทนหน้าจอก่อนหน้า
ในแอป
ใช้การนำทางย้อนกลับที่กำหนดเองใน Compose
ใน Jetpack Compose คุณสามารถจัดการการนำทางย้อนกลับที่กำหนดเองได้โดยใช้ Composable BackHandler
เมื่อใช้ Navigation Compose โดยปกติแล้วคุณจะใช้
NavController.navigateUp() หรือ NavController.popBackStack()
เพื่อไปยังหน้าจอก่อนหน้าใน Back Stack อย่างไรก็ตาม BackHandler
มีประโยชน์ในกรณีที่คุณต้องการใช้ลักษณะการทำงานที่กำหนดเองเมื่อผู้ใช้
กดปุ่มย้อนกลับของระบบหรือใช้ท่าทางสัมผัสย้อนกลับ เช่น หากคุณแสดง WebView ในแอป คุณอาจต้องการอนุญาตให้ผู้ใช้
ย้อนกลับผ่านประวัติการท่องเว็บเมื่อกดปุ่มย้อนกลับของระบบ
หากคุณมี Composable BackHandler ที่เปิดใช้หลายรายการในระดับต่างๆ ของ
โครงสร้าง Composable เฉพาะ Composable ที่อยู่ด้านในสุดเท่านั้นที่จะสกัดกั้นเหตุการณ์ย้อนกลับ
ใช้การนำทางย้อนกลับที่กำหนดเองด้วย View
ComponentActivity ซึ่งเป็นคลาสฐานสำหรับ FragmentActivity และ
AppCompatActivity ช่วยให้คุณควบคุมลักษณะการทำงานของปุ่มย้อนกลับ
ได้โดยใช้ OnBackPressedDispatcher ซึ่งคุณเรียกข้อมูลได้โดยการเรียก
getOnBackPressedDispatcher()
OnBackPressedDispatcher ควบคุมวิธีส่งเหตุการณ์ปุ่มย้อนกลับ
ไปยังออบเจ็กต์ OnBackPressedCallback อย่างน้อย 1 รายการ ตัวสร้างสำหรับ
OnBackPressedCallback จะใช้บูลีนสำหรับสถานะเริ่มต้นที่เปิดใช้ เฉพาะเมื่อเปิดใช้ Callback เช่น เมื่อ isEnabled() แสดงผล true เท่านั้น
Dispatcher จะเรียกใช้ handleOnBackPressed() ของ Callback เพื่อจัดการ
เหตุการณ์ปุ่มย้อนกลับ คุณเปลี่ยนสถานะที่เปิดใช้ได้โดยเรียกใช้
setEnabled()
ระบบจะเพิ่มการเรียกกลับโดยใช้วิธีการ addCallback ใช้วิธี addCallback() ซึ่งรับ LifecycleOwner ด้วยวิธีนี้ ระบบจะเพิ่ม
OnBackPressedCallback เฉพาะเมื่อ LifecycleOwner เป็น
Lifecycle.State.STARTED นอกจากนี้ กิจกรรมยังนำการเรียกกลับที่ลงทะเบียนออกด้วย
เมื่อมีการทำลาย 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()
เมื่อทำเช่นนั้น ระบบจะเรียกใช้การเรียกกลับตามลำดับย้อนกลับของลำดับที่เพิ่มการเรียกกลับ โดยการเรียกกลับที่เพิ่มล่าสุดจะเป็นการเรียกกลับแรกที่ได้รับโอกาสในการจัดการเหตุการณ์ปุ่มย้อนกลับ เช่น หากคุณเพิ่มการเรียกกลับ 3 รายการชื่อ
one, two และ three ตามลำดับ ระบบจะเรียกใช้การเรียกกลับตามลำดับ three, two และ one ตามลำดับ
Callback จะเป็นไปตามรูปแบบChain of Responsibility
ระบบจะเรียกใช้การเรียกกลับแต่ละรายการในเชนก็ต่อเมื่อไม่ได้เปิดใช้การเรียกกลับก่อนหน้า ซึ่งหมายความว่าใน
ตัวอย่างก่อนหน้า ระบบจะเรียกใช้การเรียกกลับ two ก็ต่อเมื่อไม่ได้เปิดใช้การเรียกกลับ three
ระบบจะเรียกใช้การโทรกลับ one ก็ต่อเมื่อไม่ได้เปิดใช้การโทรกลับ two
เป็นต้น
โปรดทราบว่าเมื่อเพิ่มโดยใช้ addCallback()
ระบบจะไม่เพิ่มการเรียกกลับลงในห่วงโซ่ความรับผิดจนกว่า LifecycleOwner จะเข้าสู่สถานะ Lifecycle.State.STARTED
เราขอแนะนำอย่างยิ่งให้เปลี่ยนสถานะที่เปิดใช้ใน OnBackPressedCallback สำหรับการเปลี่ยนแปลงชั่วคราว เนื่องจากจะรักษาลำดับที่อธิบายไว้ข้างต้น ซึ่งมีความสำคัญอย่างยิ่งหากคุณลงทะเบียนการเรียกกลับในเจ้าของวงจรการทำงานที่ซ้อนกันหลายรายการ
อย่างไรก็ตาม ในกรณีที่คุณต้องการนำ OnBackPressedCallback ออกทั้งหมด
คุณควรโทรหา
remove()
โดยปกติแล้วไม่จำเป็นต้องดำเนินการนี้ เนื่องจากระบบจะนำการเรียกกลับออกโดยอัตโนมัติเมื่อLifecycleOwnerที่เชื่อมโยงถูกทำลาย