การย้อนกลับที่คาดการณ์ได้ ซึ่งเป็นฟีเจอร์การไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสจะช่วยให้ผู้ใช้ดูตัวอย่างได้ว่าการปัดย้อนกลับจะนำผู้ใช้ไปที่ใด
ตัวอย่างเช่น การใช้ท่าทางสัมผัสย้อนกลับสามารถแสดงภาพเคลื่อนไหวตัวอย่างของหน้าจอหลักที่อยู่เบื้องหลังแอปของคุณได้ ดังที่แสดงในภาพจำลองในรูปที่ 1
ตั้งแต่ Android 15 เป็นต้นไป ตัวเลือกสำหรับนักพัฒนาแอปสำหรับภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้จะไม่มีให้บริการอีกต่อไป ภาพเคลื่อนไหวของระบบ เช่น การกลับไปที่หน้าจอหลัก การสลับงาน และการสลับกิจกรรมจะปรากฏขึ้นสำหรับแอปที่เลือกใช้ท่าทางสัมผัสย้อนกลับแบบคาดเดา ไม่ว่าจะทั้งหมดหรือที่ระดับกิจกรรม
คุณสามารถทดสอบภาพเคลื่อนไหวการกลับไปที่หน้าจอหลักนี้ (ตามที่อธิบายไว้ในส่วนถัดไปของหน้านี้)
การรองรับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ต้องมีการอัปเดตแอปโดยใช้
ที่เข้ากันได้แบบย้อนหลัง
OnBackPressedCallback AppCompat 1.6.0-alpha05
(AndroidX) หรือ API ที่สูงกว่า หรือใช้ OnBackInvokedCallback
API แพลตฟอร์มใหม่ แอปส่วนใหญ่ใช้ 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 มีคอมโพสได้ PredictiveBackHandler เพื่อจัดการท่าทางสัมผัสย้อนกลับที่กำหนดเอง API นี้ช่วยให้คุณตอบสนองต่อท่าทางสัมผัสย้อนกลับและมี Flow ของออบเจ็กต์ BackEventCompat ที่คุณใช้เพื่อติดตั้งใช้งานภาพเคลื่อนไหวหรือการเปลี่ยนภาพที่กำหนดเองได้ขณะที่ผู้ใช้ปัด
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 หรือคอมโพเนนต์การไปยังส่วนต่างๆ ให้อัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 ขึ้นไปด้วย
อัปเดตแอปที่ใช้การไปยังส่วนต่างๆ ย้อนกลับที่กำหนดเอง
หากแอปของคุณติดตั้งใช้งานลักษณะการทำงานย้อนกลับที่กำหนดเอง จะมีเส้นทางการย้ายข้อมูลที่แตกต่างกันไปขึ้นอยู่กับว่าแอปใช้ AndroidX หรือไม่และจัดการการไปยังส่วนต่างๆ ย้อนกลับอย่างไร
| วิธีที่แอปจัดการการไปยังส่วนต่างๆ ย้อนกลับ | เส้นทางการย้ายข้อมูลที่แนะนำ (ลิงก์ในหน้านี้) |
| AndroidX API | ย้ายข้อมูลการติดตั้งใช้งานย้อนกลับของ AndroidX ที่มีอยู่ |
| แพลตฟอร์ม API ที่ระบบไม่รองรับ | ย้ายข้อมูลแอป AndroidX ที่มี API การไปยังส่วนต่างๆ ย้อนกลับที่ระบบไม่รองรับไปยัง AndroidX API |
ย้ายข้อมูลการติดตั้งใช้งานการไปยังส่วนต่างๆ ย้อนกลับของ AndroidX
Use Case นี้เป็น Use Case ที่พบบ่อยที่สุด (และแนะนำมากที่สุด) ซึ่งใช้ได้กับแอปใหม่
หรือแอปที่มีอยู่ซึ่งติดตั้งใช้งานการจัดการการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสที่กำหนดเองด้วย
OnBackPressedDispatcher ตามที่อธิบายไว้ใน
หัวข้อการให้การไปยังส่วนต่างๆ ย้อนกลับที่กำหนดเอง
หากต้องการให้แน่ใจว่า API ที่ใช้ OnBackPressedDispatcher
(เช่น Fragment และคอมโพเนนต์การไปยังส่วนต่างๆ) ทำงานร่วมกับ
ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ได้อย่างราบรื่น ให้อัปเกรดเป็น
AndroidX Activity 1.6.0-alpha05
```xml
// In your build.gradle file:
dependencies {
// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0-alpha05"
```
ย้ายข้อมูลแอป AndroidX ที่มี API การไปยังส่วนต่างๆ ย้อนกลับที่ระบบไม่รองรับไปยัง AndroidX API
หากแอปของคุณใช้ไลบรารี AndroidX แต่ติดตั้งใช้งานหรืออ้างอิง API การไปยังส่วนต่างๆ ย้อนกลับที่ระบบไม่รองรับ คุณจะต้องย้ายข้อมูลไปใช้ AndroidX API เพื่อรองรับลักษณะการทำงานใหม่
วิธีย้ายข้อมูล API ที่ระบบไม่รองรับไปยัง AndroidX API
ย้ายข้อมูลตรรกะการจัดการการย้อนกลับของระบบไปยัง AndroidX’s
OnBackPressedDispatcherด้วยการติดตั้งใช้งานOnBackPressedCallbackดูคำแนะนำโดยละเอียดได้ที่ หัวข้อการให้การไปยังส่วนต่างๆ ย้อนกลับที่กำหนดเองปิดใช้
OnBackPressedCallbackเมื่อพร้อมที่จะหยุดสกัดกั้นท่าทางสัมผัสย้อนกลับหยุดสกัดกั้นเหตุการณ์ย้อนกลับผ่าน
OnBackPressedหรือKeyEvent.KEYCODE_BACKอย่าลืมอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
เลือกไม่ใช้การย้อนกลับที่คาดการณ์ได้
หากต้องการเลือกไม่ใช้ ให้ตั้งค่าแฟล็ก
android:enableOnBackInvokedCallback เป็น false ในแท็ก <application> ใน AndroidManifest.xml
<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จะปิดภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้ ไม่ว่าจะที่ระดับกิจกรรมหรือระดับแอป ทั้งนี้ขึ้นอยู่กับตำแหน่งที่คุณตั้งค่าแท็ก และสั่งให้ระบบละเว้นการเรียกใช้แพลตฟอร์ม APIOnBackInvokedCallbackอย่างไรก็ตาม การเรียกใช้OnBackPressedCallbackจะยังคงทำงานต่อไปเนื่องจากOnBackPressedCallbackเข้ากันได้แบบย้อนหลังและเรียกใช้ APIonBackPressedซึ่งระบบไม่รองรับใน Android เวอร์ชันก่อน Android 13 - การตั้งค่าแฟล็ก
enableOnBackInvokedCallbackที่ระดับแอปจะเป็นการกำหนดค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณสามารถลบล้างค่าเริ่มต้นต่อกิจกรรมได้โดยการตั้งค่าแฟล็กที่ระดับกิจกรรม ดังที่แสดงในตัวอย่างโค้ดก่อนหน้า
แนวทางปฏิบัติแนะนำสำหรับการเรียกกลับ
ต่อไปนี้เป็นแนวทางปฏิบัติแนะนำสำหรับการใช้การเรียกกลับย้อนกลับของระบบที่รองรับ ได้แก่
PredictiveBackHandler หรือ BackHandler (สำหรับ Compose),
OnBackPressedCallback หรือ OnBackInvokedCallback
กำหนดสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ
สถานะ UI เป็นพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนำให้ทำตามขั้นตอนระดับสูงต่อไปนี้
กำหนดสถานะ UI ที่เปิดและปิดใช้การเรียกกลับแต่ละรายการ
กำหนดสถานะดังกล่าวโดยใช้ประเภทตัวยึดข้อมูลที่ได้รับอนุญาตให้สังเกตพฤติกรรมผู้ใช้ได้ เช่น
StateFlowหรือ Compose State และเปิดหรือปิดใช้ Callback เมื่อสถานะเปลี่ยนแปลง
หากแอปของคุณเคยเชื่อมโยงตรรกะย้อนกลับกับคำสั่งแบบมีเงื่อนไข นี่อาจบ่งบอกว่าคุณกำลังตอบสนองต่อเหตุการณ์ย้อนกลับหลังจากที่เหตุการณ์เกิดขึ้นแล้ว หลีกเลี่ยงรูปแบบนี้ด้วยการเรียกกลับที่ใหม่กว่า หากเป็นไปได้ ให้ย้าย Callback ออกจากคำสั่งแบบมีเงื่อนไขและเชื่อมโยง Callback กับประเภทตัวยึดข้อมูลที่สังเกตได้แทน
ใช้การเรียกกลับย้อนกลับของระบบสำหรับตรรกะ UI
ตรรกะ UI กำหนดวิธีแสดง UI ใช้การเรียกกลับย้อนกลับของระบบเพื่อเรียกใช้ตรรกะ UI เช่น การแสดงกล่องโต้ตอบหรือการเรียกใช้ภาพเคลื่อนไหว
หากแอปเปิดใช้ OnBackPressedCallback หรือ OnBackInvokedCallback ที่มี PRIORITY_DEFAULT หรือ PRIORITY_OVERLAY ภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้จะไม่ทำงาน และคุณต้องจัดการเหตุการณ์ย้อนกลับ อย่าสร้างการเรียกกลับเหล่านี้เพื่อเรียกใช้ตรรกะทางธุรกิจหรือเพื่อบันทึก
ใช้วิธีต่อไปนี้หากแอปต้องเรียกใช้ตรรกะทางธุรกิจหรือบันทึกเมื่อผู้ใช้ปัดย้อนกลับ
- ใช้
OnBackInvokedCallbackที่มีPRIORITY_SYSTEM_NAVIGATION_OBSERVERในอุปกรณ์ที่ใช้ Android 16 ขึ้นไป ซึ่งจะสร้างการเรียกกลับของ Observer ที่ไม่ใช้เหตุการณ์ย้อนกลับ ตัวอย่างเช่น คุณอาจลงทะเบียน Callback นี้เมื่อผู้ใช้ปัดย้อนกลับจากกิจกรรมรูท หรือกล่าวอีกนัยหนึ่งคือเมื่อผู้ใช้ออกจากแอป ในกรณีนี้ คุณสามารถบันทึกเหตุการณ์ย้อนกลับหรือเรียกใช้ตรรกะทางธุรกิจอื่นๆ และภาพเคลื่อนไหวการกลับไปที่หน้าจอหลักจะยังคงเล่นต่อไป - สำหรับกรณีจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่งหรือจาก Fragment หนึ่งไปยังอีก Fragment หนึ่ง ให้บันทึกหาก
isFinishingภายในonDestroyเป็นtrueภายในวงจรกิจกรรม - สำหรับกรณีจาก Fragment หนึ่งไปยังอีก Fragment หนึ่ง ให้บันทึกหาก
isRemovingภายในonDestroyเป็น "จริง" ภายในวงจรของมุมมองของ Fragment หรือบันทึกโดยใช้เมธอดonBackStackChangeStartedหรือonBackStackChangeCommittedภายในFragmentManager.OnBackStackChangedListener - สำหรับกรณี Compose ให้บันทึกภายในการเรียกกลับ
onCleared()ของViewModelที่เชื่อมโยงกับปลายทาง Compose นี่เป็นสัญญาณที่ดีที่สุดในการทราบว่าเมื่อใดที่ปลายทาง Compose ถูกนำออกจาก Back Stack และถูกทำลาย
สร้างการเรียกกลับที่มีความรับผิดชอบเดียว
คุณสามารถเพิ่มการเรียกกลับหลายรายการลงใน Dispatcher ได้ ระบบจะเพิ่มการเรียกกลับลงในสแต็กที่การเรียกกลับที่เปิดใช้ซึ่งเพิ่มล่าสุดจะจัดการท่าทางสัมผัสย้อนกลับถัดไป โดยมีการเรียกกลับ 1 รายการต่อท่าทางสัมผัสย้อนกลับ
การจัดการสถานะที่เปิดใช้ของการเรียกกลับจะง่ายขึ้นหากการเรียกกลับนั้นมีความรับผิดชอบเดียว เช่น
รูปที่ 2 แสดงวิธีที่คุณสามารถมีการเรียกกลับหลายรายการในสแต็ก ซึ่งแต่ละรายการมีความรับผิดชอบเดียว การเรียกกลับจะทำงานก็ต่อเมื่อการเรียกกลับที่อยู่เหนือการเรียกกลับนั้นในสแต็กปิดใช้อยู่ ในตัวอย่างนี้ การเรียกกลับ "คุณแน่ใจหรือไม่..." จะเปิดใช้เมื่อผู้ใช้ป้อนข้อมูลลงในแบบฟอร์ม และปิดใช้ในกรณีอื่นๆ การเรียกกลับจะเปิดกล่องโต้ตอบการยืนยันเมื่อผู้ใช้ปัดย้อนกลับเพื่อออกจากแบบฟอร์ม
การเรียกกลับอื่นๆ อาจรวมถึงคอมโพเนนต์ Material ที่รองรับการย้อนกลับที่คาดการณ์ได้ การเปลี่ยนภาพ AndroidX โดยใช้ Progress API หรือการเรียกกลับที่กำหนดเองอื่นๆ
ลักษณะการทำงานของสแต็กเดียวกันนี้ใช้ได้ใน Compose โดย PredictiveBackHandler
หรือ BackHandler ที่อยู่ด้านในสุดจะมีลำดับความสำคัญสูงสุด
ในทำนองเดียวกัน การเรียกกลับของ childFragmentManager จะทำงานหากการเรียกกลับด้านบน
ปิดใช้อยู่และ Back Stack สำหรับ FragmentManager นี้ไม่ว่างเปล่า ในตัวอย่างนี้ การเรียกกลับภายในนี้ปิดใช้อยู่
เช่นเดียวกัน การเรียกกลับภายในของ supportFragmentManager จะทำงานหากการเรียกกลับด้านบนปิดใช้อยู่และสแต็กไม่ว่างเปล่า ในตัวอย่างนี้ การเรียกกลับนี้จะทำงานหากผู้ใช้ไม่ได้ป้อนข้อความลงในแบบฟอร์ม ซึ่งทำให้การเรียกกลับ "คุณแน่ใจหรือไม่..." ปิดใช้อยู่
สุดท้าย ระบบจะจัดการท่าทางสัมผัสย้อนกลับหากการเรียกกลับด้านบนปิดใช้อยู่ หากต้องการทริกเกอร์ภาพเคลื่อนไหวของระบบ เช่น การกลับไปที่หน้าจอหลัก การสลับกิจกรรม และการสลับงาน Back Stack ของ supportFragmentManager ต้องว่างเปล่าเพื่อให้การเรียกกลับภายในปิดใช้อยู่
ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้
หากยังใช้ Android 13 หรือ Android 14 อยู่ คุณสามารถทดสอบภาพเคลื่อนไหวการกลับไปที่หน้าจอหลักที่แสดงในรูปที่ 1 ได้
หากต้องการทดสอบภาพเคลื่อนไหวนี้ ให้ทำตามขั้นตอนต่อไปนี้
ในอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป
เลือกภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้
เปิดแอปที่อัปเดตแล้ว และใช้ท่าทางสัมผัสย้อนกลับเพื่อดูการทำงาน