การย้อนกลับที่คาดการณ์ได้ ซึ่งเป็นฟีเจอร์การไปยังส่วนต่างๆ ด้วยท่าทางสัมผัส ช่วยให้ผู้ใช้ดูตัวอย่างได้ว่าการปัดกลับจะนำผู้ใช้ไปที่ใด
ตัวอย่างเช่น การใช้ท่าทางสัมผัสสำหรับย้อนกลับจะแสดงตัวอย่างภาพเคลื่อนไหวของ หน้าจอหลักที่อยู่ด้านหลังแอปของคุณ ดังที่แสดงในภาพจำลองในรูปที่ 1
ตั้งแต่ Android 15 เป็นต้นไป ตัวเลือกสำหรับนักพัฒนาแอปสำหรับการเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้จะไม่มีให้บริการอีกต่อไป ตอนนี้ภาพเคลื่อนไหวของระบบ เช่น กลับไปหน้าแรก ข้ามงาน และ ข้ามกิจกรรม จะปรากฏในแอปที่เลือกใช้ท่าทางสัมผัสย้อนกลับแบบคาดการณ์ ทั้งหมดหรือที่ระดับกิจกรรม
คุณทดสอบภาพเคลื่อนไหวกลับไปที่หน้าแรกนี้ได้ (ตามที่อธิบายไว้ในส่วนถัดไปของหน้านี้)
การรองรับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ต้องมีการอัปเดตแอป โดยใช้
OnBackPressedCallback ที่เข้ากันได้แบบย้อนหลังใน AndroidX Activity 1.6.0
หรือ API ที่สูงกว่า หรือใช้ API แพลตฟอร์ม OnBackInvokedCallback ใหม่
แอปส่วนใหญ่ใช้ AndroidX API ที่เข้ากันได้แบบย้อนหลัง
การอัปเดตนี้จะแสดงเส้นทางการย้ายข้อมูลเพื่อสกัดกั้นการนำทางย้อนกลับอย่างเหมาะสม
ซึ่งเกี่ยวข้องกับการแทนที่การสกัดกั้นการย้อนกลับจาก KeyEvent.KEYCODE_BACK
และคลาสใดๆ ที่มีเมธอด onBackPressed เช่น Activity และ
Dialog ด้วย Back API ใหม่ของระบบ
วิดีโอ Codelab และ Google I/O
นอกเหนือจากการใช้เอกสารประกอบในหน้านี้แล้ว ลองใช้ Codelab ของเรา โดยจะมีการติดตั้งใช้งาน Use Case ทั่วไปของ WebView ที่จัดการท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้โดยใช้ AndroidX Activity API
นอกจากนี้ คุณยังดูวิดีโอ Google I/O ซึ่งมีตัวอย่างเพิ่มเติมเกี่ยวกับการ ใช้ AndroidX และ API ของแพลตฟอร์มได้ด้วย
จัดการท่าทางสัมผัสย้อนกลับที่กำหนดเองใน Compose
Compose มี Composable PredictiveBackHandler เพื่อจัดการท่าทางสัมผัสย้อนกลับที่กำหนดเอง API นี้ช่วยให้คุณตอบสนองต่อท่าทางสัมผัสย้อนกลับและมีFlowของออบเจ็กต์ BackEventCompat ที่คุณใช้เพื่อใช้ภาพเคลื่อนไหวหรือการเปลี่ยนฉากที่กำหนดเองได้เมื่อผู้ใช้ปัด
หากต้องการใช้ PredictiveBackHandler ให้ตรวจสอบว่าแอปของคุณมีทรัพยากร Dependency ของ
androidx.activity:activity-compose (เวอร์ชัน 1.8.0 ขึ้นไป)
// In your build.gradle.kts file:
dependencies {
implementation("androidx.activity:activity-compose:1.8.0")
}
PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> -> try { progress.collect { backEvent -> // Update your UI or animation based on backEvent.progress. } // Handle the final back action (e.g., navigate back). } catch (e: CancellationException) { // Back gesture was cancelled, reset your UI. } }
หากต้องการสกัดกั้นท่าทางสัมผัสย้อนกลับโดยไม่ต้องติดตามความคืบหน้า ให้ใช้
BackHandler
อัปเดตแอปที่ใช้การนำทางย้อนกลับเริ่มต้น
ระบบจะเปิดใช้การย้อนกลับที่คาดการณ์ได้โดยค่าเริ่มต้น
หากแอปใช้ Fragment หรือ Navigation Component ให้อัปเกรดเป็น AndroidX Activity 1.6.0 ขึ้นไปด้วย
อัปเดตแอปที่ใช้การนำทางย้อนกลับที่กำหนดเอง
หากแอปของคุณใช้ลักษณะการทำงานย้อนกลับที่กำหนดเอง จะมีเส้นทางการย้ายข้อมูลที่แตกต่างกัน ขึ้นอยู่กับว่าแอปใช้ AndroidX หรือไม่ และจัดการการนำทางย้อนกลับอย่างไร
| วิธีที่แอปจัดการการนำทางย้อนกลับ | เส้นทางการย้ายข้อมูลที่แนะนำ (ลิงก์ในหน้านี้) |
| AndroidX APIs | ย้ายข้อมูลการใช้งานการย้อนกลับของ AndroidX ที่มีอยู่ |
| API ของแพลตฟอร์มที่ไม่รองรับ | ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางย้อนกลับที่ไม่รองรับไปยัง AndroidX API |
ย้ายข้อมูลการติดตั้งใช้งานการนำทางย้อนกลับของ AndroidX
กรณีการใช้งานนี้เป็นกรณีที่พบบ่อยที่สุด (และแนะนํามากที่สุด) โดยมีผลกับแอปใหม่หรือแอปที่มีอยู่ซึ่งใช้การจัดการการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสที่กำหนดเองด้วย OnBackPressedDispatcher ตามที่อธิบายไว้ในจัดให้มีการนำทางย้อนกลับที่กำหนดเอง
หากต้องการให้แน่ใจว่า API ที่ใช้ OnBackPressedDispatcher
(เช่น Fragment และ Navigation Component) จะทำงานร่วมกับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้อย่างราบรื่น ให้อัปเกรดเป็น AndroidX Activity 1.6.0 ขึ้นไป
// In your build.gradle file:
dependencies {
// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0"
}
ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางย้อนกลับที่ไม่รองรับไปยัง AndroidX API
หากแอปใช้ไลบรารี AndroidX แต่ติดตั้งใช้งานหรืออ้างอิง API การนำทางย้อนกลับที่ไม่รองรับ คุณจะต้องย้ายข้อมูลไปใช้ API ของ AndroidX เพื่อรองรับลักษณะการทำงานใหม่
วิธีย้ายข้อมูล API ที่ไม่รองรับไปยัง AndroidX API
ย้ายตรรกะการจัดการปุ่มย้อนกลับของระบบไปยัง
OnBackPressedDispatcherของ AndroidX โดยใช้การติดตั้งใช้งานOnBackPressedCallbackดูคำแนะนำแบบละเอียดได้ที่ระบุการนำทางย้อนกลับที่กำหนดเองปิดใช้
OnBackPressedCallbackเมื่อพร้อมที่จะหยุดการสกัดกั้นท่าทางสัมผัสย้อนกลับหยุดการสกัดกั้นเหตุการณ์ย้อนกลับโดยใช้
OnBackPressedหรือKeyEvent.KEYCODE_BACKอย่าลืมอัปเกรดเป็น AndroidX Activity 1.6.0 ขึ้นไป
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0" }
เลือกไม่ใช้การย้อนกลับที่คาดการณ์ได้
หากต้องการเลือกไม่ใช้ ให้ตั้งค่า Flag android:enableOnBackInvokedCallback เป็น false ใน AndroidManifest.xml ในแท็ก <application>
<application
...
android:enableOnBackInvokedCallback="false"
... >
...
</application>
การตั้งค่านี้เป็น "เท็จ" จะมีผลดังนี้
- ปิดใช้ภาพเคลื่อนไหวของระบบสำหรับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้
- ไม่สนใจ
OnBackInvokedCallbackแต่OnBackPressedCallbackการโทร จะยังคงทำงานต่อไป
เลือกไม่ใช้ที่ระดับกิจกรรม
โดยandroid:enableOnBackInvokedCallbackจะช่วยให้คุณเลือกไม่ใช้ภาพเคลื่อนไหวของระบบแบบคาดการณ์
ที่ระดับกิจกรรมได้ ลักษณะการทำงานนี้ช่วยให้จัดการการย้ายข้อมูลแอปขนาดใหญ่ที่มีหลายกิจกรรมไปยังท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้ง่ายขึ้น
โค้ดต่อไปนี้แสดงตัวอย่างของ enableOnBackInvokedCallback ที่ตั้งค่าเป็น
เปิดใช้ภาพเคลื่อนไหวของระบบกลับไปที่หน้าแรกจาก MainActivity
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
โปรดคำนึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้แฟล็ก
android:enableOnBackInvokedCallback
- การตั้งค่า
android:enableOnBackInvokedCallback=falseจะปิดภาพเคลื่อนไหวการย้อนกลับแบบคาดการณ์ ที่ระดับกิจกรรมหรือระดับแอป ทั้งนี้ขึ้นอยู่กับ ตำแหน่งที่คุณตั้งค่าแท็ก และสั่งให้ระบบไม่สนใจการเรียกใช้OnBackInvokedCallbackAPI ของแพลตฟอร์ม อย่างไรก็ตาม การเรียกไปยังOnBackPressedCallbackจะยังคงทำงานต่อไปเนื่องจากOnBackPressedCallbackมี ความเข้ากันได้แบบย้อนหลังและเรียกใช้ APIonBackPressedซึ่งไม่รองรับ ใน Android เวอร์ชันก่อน 13 - การตั้งค่าแฟล็ก
enableOnBackInvokedCallbackที่ระดับแอปจะกำหนด ค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณลบล้างค่าเริ่มต้น ต่อกิจกรรมได้โดยการตั้งค่าแฟล็กที่ระดับกิจกรรม ดังที่แสดงใน ตัวอย่างโค้ดก่อนหน้า
หลักเกณฑ์การโทรกลับ
ปฏิบัติตามหลักเกณฑ์ต่อไปนี้เมื่อใช้การเรียกกลับของระบบที่รองรับ:
PredictiveBackHandler หรือ BackHandler (สำหรับ Compose),
OnBackPressedCallback หรือ OnBackInvokedCallback
กำหนดสถานะ UI ที่เปิดและปิดใช้ Callback แต่ละรายการ
สถานะ UI คือพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนำให้ทำตามขั้นตอนระดับสูงต่อไปนี้
กำหนดสถานะ UI ที่เปิดและปิดใช้แต่ละแฮนเดิลการเรียกกลับ
กำหนดสถานะดังกล่าวโดยใช้ที่เก็บข้อมูลที่ได้รับอนุญาตให้สังเกตพฤติกรรมผู้ใช้ได้ ประเภท เช่น
StateFlowหรือ สถานะ Compose แล้วเปิดหรือปิดใช้ Callback เมื่อสถานะเปลี่ยนแปลง
หากก่อนหน้านี้แอปของคุณเชื่อมโยงตรรกะย้อนกลับกับคำสั่งแบบมีเงื่อนไข นี่อาจหมายความว่าคุณกำลังตอบสนองต่อเหตุการณ์ย้อนกลับหลังจากที่ เกิดขึ้นแล้ว หลีกเลี่ยงรูปแบบนี้ด้วยการเรียกกลับที่ใหม่กว่า หากเป็นไปได้ ให้ย้ายการเรียกกลับออกนอกคำสั่งแบบมีเงื่อนไข แล้วเชื่อมโยงการเรียกกลับกับประเภทตัวยึดข้อมูลที่สังเกตได้แทน
ใช้การเรียกกลับของระบบสำหรับตรรกะ UI
ตรรกะของ UI กำหนดวิธีแสดง UI ใช้การเรียกกลับของระบบเพื่อเรียกใช้ตรรกะ UI เช่น การแสดงกล่องโต้ตอบหรือการเรียกใช้ภาพเคลื่อนไหว
หากแอปเปิดใช้ OnBackPressedCallback หรือ OnBackInvokedCallback
ด้วย PRIORITY_DEFAULT หรือ PRIORITY_OVERLAY ภาพเคลื่อนไหวการย้อนกลับที่คาดการณ์ได้
จะไม่ทำงาน และคุณต้องจัดการเหตุการณ์ย้อนกลับ อย่าสร้างการเรียกกลับเหล่านี้เพื่อ
เรียกใช้ตรรกะทางธุรกิจหรือเพื่อบันทึก
ใช้วิธีต่อไปนี้หากแอปต้องเรียกใช้ตรรกะทางธุรกิจหรือบันทึกเมื่อผู้ใช้ปัดกลับ
- ใน Compose: บันทึกภายใน
onCleared()การเรียกกลับของViewModelที่เชื่อมโยงกับปลายทาง Compose นี่คือสัญญาณที่ดีที่สุดในการทราบ เมื่อมีการนำปลายทาง Compose ออกจาก Back Stack และทำลาย - ใน Android 16 ขึ้นไป ให้ใช้
OnBackInvokedCallbackกับPRIORITY_SYSTEM_NAVIGATION_OBSERVERซึ่งจะสร้าง Observer callback ที่ไม่ใช้เหตุการณ์ย้อนกลับ เช่น คุณสามารถลงทะเบียน การเรียกกลับนี้เมื่อผู้ใช้ปัดกลับจากกิจกรรมรูท (ออกจากแอปของคุณ) เพื่อบันทึกเหตุการณ์ย้อนกลับหรือเรียกใช้ตรรกะทางธุรกิจในขณะที่ยังอนุญาตให้ เล่นภาพเคลื่อนไหวกลับไปหน้าแรกได้ - ในแอปที่อิงตาม View: บันทึกภายในวงจรหรือการเรียกกลับของ Back Stack แทน
การใช้เหตุการณ์ย้อนกลับ
- สําหรับการเปลี่ยนกิจกรรม ให้ตรวจสอบว่า
isFinishingอยู่ภายในtrueActivity.onDestroy()หรือไม่ - สำหรับการเปลี่ยนฉาก Fragment ให้ตรวจสอบว่า
isRemovingเป็นtrueภายใน วงจรการแสดงผลของ FragmentonDestroy()หรือใช้FragmentManager.OnBackStackChangedListener(onBackStackChangeStarted/onBackStackChangeCommitted)
- สําหรับการเปลี่ยนกิจกรรม ให้ตรวจสอบว่า
สร้างการเรียกกลับแบบความรับผิดเดียว
คุณเพิ่มการเรียกกลับหลายรายการไปยัง Dispatcher ได้ ระบบจะเพิ่มการเรียกกลับไปยังสแต็ก ซึ่งการเรียกกลับที่เปิดใช้ที่เพิ่มล่าสุดจะจัดการท่าทางสัมผัสย้อนกลับถัดไป โดยมีการเรียกกลับ 1 รายการต่อท่าทางสัมผัสย้อนกลับ
การจัดการสถานะที่เปิดใช้ของ Callback จะง่ายขึ้นหาก Callback นั้นมี ความรับผิดชอบเดียว เช่น
รูปที่ 2 แสดงวิธีที่คุณสามารถมีหลายการเรียกกลับในสแต็ก โดยแต่ละการเรียกกลับ จะรับผิดชอบสิ่งหนึ่ง ใน Compose ระบบจะประเมินการเรียกกลับจาก Composable ที่อยู่ด้านในสุดไปยังด้านนอกสุด และการเรียกกลับจะทำงานก็ต่อเมื่อมีการปิดใช้การเรียกกลับที่อยู่ก่อนหน้าในสแต็ก
- "คุณแน่ใจไหม..."
PredictiveBackHandlerจะเปิดใช้เมื่อผู้ใช้ป้อน ข้อมูลลงในแบบฟอร์ม และจะปิดใช้ในกรณีอื่นๆ เมื่อเปิดใช้ ฟีเจอร์นี้จะสกัดกั้น ท่าทางสัมผัสย้อนกลับเพื่อแสดงกล่องโต้ตอบการยืนยันหรือภาพเคลื่อนไหวในแอปที่กำหนดเอง BackHandlerระดับหน้าจอจะทํางานหากปิดใช้การเรียกกลับก่อนหน้า ใน ตัวอย่างนี้ ฟีเจอร์นี้ถูกปิดใช้- การเรียกกลับ
NavHostจะจัดการการนำทางย้อนกลับไปยังปลายทางป๊อปจาก Back Stack หากปิดใช้การเรียกกลับที่กำหนดเองก่อนหน้า - สุดท้าย ระบบจะจัดการท่าทางสัมผัสย้อนกลับหากปิดใช้การเรียกกลับก่อนหน้าทั้งหมด เมื่อ Back Stack อยู่ที่ปลายทางรูท ระบบจะทริกเกอร์ภาพเคลื่อนไหวระดับระบบ เช่น กลับไปหน้าแรก ข้ามกิจกรรม และข้ามงาน
ลักษณะการทำงานของสแต็กเดียวกันนี้จะใช้ในแอปที่อิงตาม View ด้วย โดย
OnBackPressedCallbackที่เปิดใช้และเพิ่มล่าสุดจะมีลำดับความสำคัญสูงสุด รองลงมาคือ FragmentManager และ
สุดท้ายคือการจัดการการกลับของระบบ
ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้
ตั้งแต่ Android 15 เป็นต้นไป ระบบจะเปิดใช้ภาพเคลื่อนไหวของระบบ เช่น กลับไปที่หน้าแรก ข้ามงาน และข้ามกิจกรรมโดยค่าเริ่มต้นสำหรับแอปที่รองรับการนำทางด้วยท่าทางสัมผัสย้อนกลับแบบคาดเดา โดยฟีเจอร์เหล่านี้จะไม่อยู่ในตัวเลือกสำหรับนักพัฒนาแอปอีกต่อไป
ในอุปกรณ์ที่ใช้ Android 13 หรือ Android 14 คุณสามารถเปิดใช้ตัวเลือกสำหรับนักพัฒนาแอปเพื่อทดสอบภาพเคลื่อนไหวกลับไปที่หน้าแรกที่แสดงในรูปที่ 1 ได้โดยทำดังนี้
ในอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป
เลือกภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้
เปิดแอปที่อัปเดตแล้ว และใช้ท่าทางสัมผัสย้อนกลับเพื่อดูการทำงาน