ผู้ใช้ไปยังหน้าจอก่อนหน้าได้โดยใช้การไปยังส่วนหลัง อุปกรณ์ Android ส่วนใหญ่มีปุ่มย้อนกลับ ไม่ว่าจะเป็นปุ่มบนอุปกรณ์ บนซอฟต์แวร์ หรือปุ่มที่ใช้ท่าทางสัมผัส โดยปกติแล้ว คุณไม่ควรเพิ่มปุ่มย้อนกลับลงในแอป แต่อุปกรณ์ Android Automotive OS (AAOS) ในโหมดความเข้ากันได้จะใช้ปุ่มย้อนกลับของระบบ ซึ่งจะจัดการการนําทาง คุณจึงไม่ต้องเพิ่มการนําทางของคุณเอง โปรดดูรายละเอียดที่หัวข้อโหมดความเข้ากันได้ของ AAOS
Android จะเก็บกองซ้อนย้อนกลับของปลายทางไว้ขณะที่ผู้ใช้ไปยังส่วนต่างๆ ของแอปพลิเคชัน ซึ่งปกติแล้วจะช่วยให้ Android ไปยังปลายทางก่อนหน้าได้อย่างถูกต้องเมื่อกดปุ่มย้อนกลับ อย่างไรก็ตาม อาจมีบางกรณีที่แอปของคุณอาจต้องใช้ลักษณะการทํางานของปุ่ม "กลับ" ของตัวเองเพื่อให้ประสบการณ์ของผู้ใช้ดีที่สุด ตัวอย่างเช่น เมื่อใช้ WebView
คุณอาจต้องการลบล้างลักษณะการทํางานของปุ่มย้อนกลับเริ่มต้นเพื่อให้ผู้ใช้ย้อนกลับผ่านประวัติการท่องเว็บแทนหน้าจอก่อนหน้าในแอป
ใช้การนําทางย้อนกลับที่กําหนดเอง
ComponentActivity
ซึ่งเป็นคลาสพื้นฐานสำหรับ FragmentActivity
และ AppCompatActivity
ช่วยให้คุณควบคุมลักษณะการทำงานของปุ่มย้อนกลับได้โดยใช้ OnBackPressedDispatcher
ของปุ่มดังกล่าว ซึ่งเรียกดูได้โดยเรียกใช้ getOnBackPressedDispatcher()
OnBackPressedDispatcher
จะควบคุมวิธีส่งเหตุการณ์ของปุ่ม "ย้อนกลับ" ไปยังออบเจ็กต์ OnBackPressedCallback
อย่างน้อย 1 รายการ ตัวสร้างของ OnBackPressedCallback
ใช้บูลีนสำหรับสถานะเปิดใช้เริ่มต้น เฉพาะเมื่อเปิดใช้การเรียกกลับ (เช่น
isEnabled()
แสดงผลเป็น true
) Dispatcher จะเรียก Callback ของ
handleOnBackPressed()
เพื่อจัดการเหตุการณ์ปุ่มย้อนกลับ คุณเปลี่ยนสถานะ "เปิดใช้" ได้โดยเรียกใช้ setEnabled()
เพิ่มการเรียกกลับผ่านเมธอด addCallback
เราขอแนะนําอย่างยิ่งให้ใช้เมธอด addCallback()
ซึ่งใช้ LifecycleOwner
วิธีนี้ช่วยให้มั่นใจว่าระบบจะเพิ่ม OnBackPressedCallback
เฉพาะเมื่อ LifecycleOwner
เป็น Lifecycle.State.STARTED
นอกจากนี้ กิจกรรมจะนําการเรียกกลับที่ลงทะเบียนออกด้วยเมื่อLifecycleOwner
ที่เกี่ยวข้องถูกทำลาย ซึ่งจะช่วยป้องกันไม่ให้หน่วยความจํารั่วไหลและทําให้กิจกรรมเหมาะสําหรับใช้ในแฟรกเมนต์หรือเจ้าของวงจรอื่นๆ ที่มีอายุการใช้งานสั้นกว่ากิจกรรม
ตัวอย่างการใช้งาน 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
ตามลําดับ
Callbacks เป็นไปตามรูปแบบลําดับชั้นความรับผิดชอบ ระบบจะเรียกใช้การเรียกกลับแต่ละรายการในเชนต่อเมื่อมีการเปิดใช้การเรียกกลับก่อนหน้าเท่านั้น ซึ่งหมายความว่าในตัวอย่างที่ยกตัวอย่างไปก่อนหน้านี้ ระบบจะเรียกใช้การเรียกกลับ two
เฉพาะในกรณีที่ไม่ได้เปิดใช้การเรียกกลับ three
ระบบจะเรียกใช้การเรียกกลับ one
เฉพาะในกรณีที่ไม่ได้เปิดใช้การเรียกกลับ two
และอื่นๆ
โปรดทราบว่าเมื่อเพิ่มผ่าน addCallback()
ระบบจะไม่เพิ่มการเรียกกลับไปยังลําดับชั้นความรับผิดชอบจนกว่า LifecycleOwner
จะเข้าสู่สถานะ Lifecycle.State.STARTED
เราขอแนะนําอย่างยิ่งให้เปลี่ยนสถานะ "เปิดใช้" ใน OnBackPressedCallback
สำหรับการเปลี่ยนแปลงชั่วคราว เนื่องจากจะรักษาลําดับตามที่อธิบายไว้ข้างต้น ซึ่งสำคัญอย่างยิ่งหากคุณลงทะเบียนคอลแบ็กในเจ้าของวงจรที่ฝังอยู่หลายราย
อย่างไรก็ตาม ในกรณีที่คุณต้องการนำ OnBackPressedCallback
ออกทั้งหมด คุณควรโทรไปที่ remove()
แต่โดยปกติแล้วไม่จําเป็น เนื่องจากระบบจะนำการเรียกกลับออกโดยอัตโนมัติเมื่อLifecycleOwner
ที่เชื่อมโยงกันถูกทำลาย
Activity onBackPressed()
หากคุณใช้ onBackPressed()
เพื่อจัดการเหตุการณ์ของปุ่ม "ย้อนกลับ" เราขอแนะนำให้ใช้ OnBackPressedCallback
แทน
อย่างไรก็ตาม หากทําการเปลี่ยนแปลงนี้ไม่ได้ กฎต่อไปนี้จะมีผล
- ระบบจะประเมินการโทรกลับทั้งหมดที่ลงทะเบียนผ่าน
addCallback
เมื่อคุณโทรไปที่super.onBackPressed()
- ใน Android 12 (API ระดับ 32) และต่ำกว่า ระบบจะเรียก
onBackPressed
เสมอไม่ว่าจะมีอินสแตนซ์OnBackPressedCallback
ที่ลงทะเบียนไว้หรือไม่ก็ตาม