Android 14 (API ระดับ 34) เพิ่มการรองรับสำหรับภาพเคลื่อนไหวของระบบและ API เพิ่มเติม เพื่อสร้างภาพเคลื่อนไหวที่กำหนดเองได้ สำหรับข้อมูลเพิ่มเติม โปรดดู เพิ่มการรองรับภาพเคลื่อนไหวย้อนกลับแบบคาดเดาที่กำหนดเองและในตัว
เช่น การใช้ท่าทางสัมผัสเพื่อย้อนกลับจะแสดงตัวอย่างแบบเคลื่อนไหวของ หน้าจอหลักที่อยู่หลังแอป ดังที่แสดงในภาพจำลองที่ 1 ตั้งแต่ Android 13 เป็นต้นไป คุณสามารถทดสอบภาพเคลื่อนไหวการกลับไปยังหน้าแรกนี้ได้โดยเปิดใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ (ตามที่อธิบายไว้ในหน้านี้)
การรองรับท่าทางสัมผัสเพื่อย้อนกลับแบบคาดการณ์ต้องอัปเดตแอปโดยใช้ API OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) ขึ้นไปที่ใช้งานร่วมกันได้ย้อนหลัง หรือใช้ 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 ของแพลตฟอร์มมาใช้
อัปเดตแอปที่ใช้การนําทางกลับเริ่มต้น
การอัปเดตแอปเพื่อสนับสนุนฟีเจอร์นี้นั้นตรงไปตรงมา หากแอปไม่ทำ ใช้ลักษณะการทำงานที่กำหนดเองย้อนกลับ (หรืออีกนัยหนึ่งคือกลับไปจัดการ กับระบบ) เลือกใช้ฟีเจอร์นี้ตามที่อธิบายไว้ใน
หากแอปของคุณใช้ Fragments หรือคอมโพเนนต์การนำทาง ให้อัปเกรดเป็น กิจกรรม AndroidX 1.6.0-alpha05 หรือสูงกว่า
อัปเดตแอปที่ใช้การนำทางย้อนกลับที่กำหนดเอง
หากแอปใช้ลักษณะการย้อนกลับที่กำหนดเอง เส้นทางการย้ายข้อมูลจะมีเส้นทางที่แตกต่างกัน ขึ้นอยู่กับว่า AndroidX ใช้ AndroidX หรือไม่ และจัดการการนำทางย้อนกลับอย่างไร
แอปของคุณใช้ AndroidX | วิธีที่แอปจัดการการนําทางกลับ | เส้นทางการย้ายข้อมูลที่แนะนำ (ลิงก์ในหน้านี้) |
ใช่ | API ของ AndroidX | ย้ายข้อมูลการใช้งาน AndroidX ที่มีอยู่ย้อนหลัง |
API ของแพลตฟอร์มที่ไม่รองรับ | ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางกลับที่ไม่รองรับไปยัง AndroidX API | |
ไม่ | API ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลได้ | ย้ายข้อมูลแอปที่ใช้ API การนําทางกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม |
API ของแพลตฟอร์มที่ไม่รองรับ แต่ไม่สามารถย้ายข้อมูลได้ | เลื่อนการเลือกใช้จนกว่าจะกลายเป็นฟีเจอร์ที่จำเป็น |
ย้ายข้อมูลการใช้งานการนำทางกลับของ AndroidX
Use Case นี้พบบ่อยที่สุด (และแนะนํามากที่สุด) จะมีผลกับ
หรือแอปที่มีอยู่ซึ่งใช้การจัดการการนำทางด้วยท่าทางสัมผัสที่กำหนดเอง
OnBackPressedDispatcher
ตามที่อธิบายไว้ใน
ใช้การนำทางกลับที่กำหนดเอง
หากแอปของคุณอยู่ในหมวดหมู่นี้ โปรดทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มการสนับสนุนสำหรับ ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้:
โปรดอัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 เพื่อให้ API ที่ใช้
OnBackPressedDispatcher
API อยู่แล้ว (เช่น ฟragment และคอมโพเนนต์การนำทาง) ทํางานร่วมกับท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้อย่างราบรื่น// 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
OnBackPressedDispatcher
ที่มีการใช้งานOnBackPressedCallback
ดูคำแนะนำโดยละเอียดได้ที่ ใช้การนำทางกลับที่กำหนดเองปิดใช้
OnBackPressedCallback
เมื่อพร้อมหยุดการสกัดกั้นด้านหลัง ท่าทางสัมผัสหยุดการสกัดกั้นกิจกรรมย้อนกลับผ่าน
OnBackPressed
หรือKeyEvent.KEYCODE_BACK
อย่าลืมอัปเกรดเป็น กิจกรรม AndroidX 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"
เมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์ (ตามที่อธิบายไว้ใน หน้านี้) เพื่อดูภาพเคลื่อนไหวของระบบ เมื่อนำทางกลับบ้าน
ย้ายข้อมูลแอปที่ใช้ API การนําทางกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม
หากแอปไม่สามารถใช้ไลบรารี AndroidX แต่ใช้หรือทำให้
การอ้างอิงไปยังการนำทางกลับที่กำหนดเองโดยใช้ API ที่ไม่รองรับ คุณต้องย้ายข้อมูล
ไปยัง API ของแพลตฟอร์ม OnBackInvokedCallback
ทําตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูล API ที่ไม่รองรับไปยัง API ของแพลตฟอร์ม
ใช้
OnBackInvokedCallback
API ใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป และใช้ API ที่ไม่รองรับในอุปกรณ์ที่ใช้ Android 12 หรือต่ำกว่าลงทะเบียนตรรกะย้อนกลับที่กำหนดเองใน
OnBackInvokedCallback
ด้วยonBackInvokedDispatcher
วิธีนี้จะป้องกันไม่ให้กิจกรรมปัจจุบัน เสร็จสิ้นแล้ว และ Callback จะมีโอกาสตอบสนองต่อการดำเนินการ "กลับ" 1 ครั้ง ผู้ใช้ดำเนินการตามการนำทางย้อนกลับของระบบยกเลิกการลงทะเบียน
OnBackInvokedCallback
เมื่อพร้อมที่จะหยุดการสกัดกั้น ท่าทางสัมผัสเพื่อย้อนกลับ มิเช่นนั้น ผู้ใช้อาจเห็นลักษณะการทำงานที่ไม่พึงประสงค์เมื่อใช้การนําทางกลับของระบบ เช่น "ค้าง" ระหว่างมุมมองต่างๆ และบังคับให้ผู้ใช้ปิดแอปตัวอย่างวิธีย้ายข้อมูลตรรกะออกจาก
onBackPressed
มีดังนี้Kotlin
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Java
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
หยุดการสกัดกั้นเหตุการณ์ย้อนกลับผ่าน
OnBackPressed
หรือKeyEvent.KEYCODE_BACK
สำหรับ Android 13 ขึ้นไปเมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์ (ตามที่อธิบายไว้ใน หน้านี้) เพื่อให้
OnBackInvokedCallback
มีผล
คุณสามารถลงทะเบียน OnBackInvokedCallback
กับ PRIORITY_DEFAULT
หรือ
PRIORITY_OVERLAY
ซึ่งไม่มีให้บริการใน AndroidX ที่คล้ายกัน
OnBackPressedCallback
การลงทะเบียนการติดต่อกลับด้วย PRIORITY_OVERLAY
จะมีประโยชน์ในบางกรณี กรณีที่สามารถใช้เป็นเช่นนี้ได้คือเมื่อคุณย้ายข้อมูล
จาก onKeyPreIme()
และ Callback ต้องได้รับท่าทางสัมผัสการย้อนกลับแทน
ของ IME ที่เปิดอยู่ IME จะลงทะเบียนการเรียกกลับกับ PRIORITY_DEFAULT
เมื่อเปิด
ลงทะเบียนการติดต่อกลับกับ PRIORITY_OVERLAY
เพื่อให้มั่นใจว่า
OnBackInvokedDispatcher
จะส่งท่าทางสัมผัสย้อนกลับไปยัง Callback แทน
ของ IME แบบเปิด
เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์
เมื่อคุณกำหนดวิธีอัปเดตแอปตามเคสของคุณแล้ว ให้เลือกใช้ รองรับท่าทางสัมผัสการย้อนกลับแบบคาดเดา
หากต้องการเลือกใช้ ให้ตั้งค่า Flag android:enableOnBackInvokedCallback
เป็น true
ในแท็ก <application>
ของ AndroidManifest.xml
<application
...
android:enableOnBackInvokedCallback="true"
... >
...
</application>
หากคุณไม่ระบุค่า ค่าเริ่มต้นจะเป็น false
และดำเนินการต่อไปนี้
- ปิดใช้ภาพเคลื่อนไหวของระบบท่าทางสัมผัสการย้อนกลับแบบคาดเดา
- ไม่สนใจ
OnBackInvokedCallback
แต่รับสายOnBackPressedCallback
ครั้ง ทำงานต่อ
เลือกใช้ที่ระดับกิจกรรม
ใน Android 14 เป็นต้นไป แฟล็ก 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=true
สำหรับ
".SecondActivity"
เปิดใช้ภาพเคลื่อนไหวของระบบข้ามกิจกรรม
โปรดคำนึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้
แฟล็ก android:enableOnBackInvokedCallback
รายการ:
- การตั้งค่า
android:enableOnBackInvokedCallback=false
จะปิดการย้อนกลับที่คาดการณ์ได้ ภาพเคลื่อนไหวขณะทำกิจกรรม หรือที่ระดับแอป ขึ้นอยู่กับตำแหน่งที่คุณกำหนดแท็กและให้คำแนะนำ ระบบจะไม่สนใจการเรียกไปยัง API ของแพลตฟอร์มOnBackInvokedCallback
แต่การโทรไปยังOnBackPressedCallback
ยังคงทำงานต่อไปเนื่องจากOnBackPressedCallback
สามารถใช้งานร่วมกันได้แบบย้อนหลังและเรียกonBackPressed
API ที่ระบบไม่รองรับก่อน Android 13 - การตั้งค่า Flag
enableOnBackInvokedCallback
ที่ระดับแอปจะสร้าง ค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณสามารถลบล้าง ค่าเริ่มต้นต่อกิจกรรมโดยการตั้งค่า Flag ที่ระดับกิจกรรม ดังที่แสดงใน ตัวอย่างโค้ดก่อนหน้า
แนวทางปฏิบัติแนะนำในการติดต่อกลับ
แนวทางปฏิบัติแนะนำในการใช้ Callback ของระบบที่รองรับมีดังนี้
BackHandler
(สำหรับการเขียน), OnBackPressedCallback
หรือ
OnBackInvokedCallback
กำหนดสถานะ UI ที่เปิดใช้และปิดใช้ Callback แต่ละรายการ
สถานะ UI เป็นพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนำให้ปฏิบัติตาม ขั้นตอน
กำหนดสถานะ UI ที่เปิดใช้และปิดใช้ Callback แต่ละรายการ
กำหนดสถานะนั้นโดยใช้ผู้ถือข้อมูลที่ได้รับอนุญาตให้สังเกตพฤติกรรมผู้ใช้ได้ ประเภท เช่น
StateFlow
หรือ เขียนสถานะ และเปิดหรือปิดใช้ Callback เมื่อสถานะเปลี่ยนแปลง
หากก่อนหน้านี้แอปได้เชื่อมโยงตรรกะแบบย้อนกลับกับคำสั่งแบบมีเงื่อนไข สัญญาณนี้อาจบ่งบอกว่าคุณกำลังโต้ตอบกับเหตุการณ์ย้อนกลับหลังจากที่เหตุการณ์ เกิดขึ้นแล้ว ซึ่งเป็นรูปแบบที่คุณควรหลีกเลี่ยงเมื่อใช้ Callback ที่ใหม่กว่า หากเป็นไปได้ ให้ย้ายการเรียกกลับออกไปนอกคำสั่งแบบมีเงื่อนไขและใช้แทน เชื่อมโยง Callback กับประเภทผู้ถือข้อมูลที่ได้รับอนุญาตให้สังเกตพฤติกรรมผู้ใช้ได้
ใช้การติดต่อกลับของระบบสำหรับตรรกะ UI
ตรรกะ UI กำหนดวิธีแสดง UI ใช้ Callback ของระบบเพื่อเรียกใช้ตรรกะ UI เช่น ที่แสดงป๊อปอัปหรือการเรียกใช้ภาพเคลื่อนไหว
หากแอปเปิดใช้ Callback ของระบบ ภาพเคลื่อนไหวตามการคาดการณ์จะไม่ทำงาน และคุณต้องจัดการ เหตุการณ์การย้อนกลับ อย่าสร้าง Callback เพื่อเรียกใช้เฉพาะโหมดที่ไม่ใช่ UI
เช่น หากคุณจะขัดขวางเหตุการณ์ Back เพื่อบันทึกเท่านั้น ให้บันทึกภายในวงจรของกิจกรรมหรือ Fragment แทน
- สำหรับกรณี Activity-to-activity หรือ Fragment-to-activity ให้บันทึกหาก
isFinishing
ภายในonDestroy
เท่ากับtrue
ในวงจรกิจกรรม - สําหรับกรณีจากข้อมูลโค้ดหนึ่งไปยังอีกข้อมูลโค้ดหนึ่ง ให้บันทึกหาก
isRemoving
ภายในonDestroy
เป็นจริงภายในวงจรการแสดงผลของข้อมูลโค้ด หรือบันทึกโดยใช้เมธอดonBackStackChangeStarted
หรือonBackStackChangeCommitted
ภายในFragmentManager.OnBackStackChangedListener
สำหรับกรณี Compose ให้บันทึกภายใน Callback onCleared()
ของ ViewModel
ที่เชื่อมโยงกับปลายทางการเขียน นี่เป็นสัญญาณที่ดีที่สุดในการระบุว่ามีการนำปลายทางการเขียนออกจากกองซ้อนด้านหลังและทำลายแล้ว
สร้าง Callback ที่มีหน้าที่รับผิดชอบรายการเดียว
ซึ่งเป็นไปได้ เนื่องจากคุณสามารถเพิ่ม Callback หลายรายการให้กับผู้มอบหมายงานได้ ระบบจะเพิ่ม Callback ลงในสแต็กที่มี Callback ที่เปิดใช้ล่าสุด จัดการท่าทางสัมผัสการย้อนกลับถัดไปด้วยท่าทางสัมผัสการติดต่อกลับ 1 ครั้งต่อท่าทางสัมผัสการย้อนกลับ
ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับแบบคาดเดา
ตั้งแต่ Android 13 รุ่นสุดท้าย คุณจะสามารถเปิดใช้ ตัวเลือกสำหรับนักพัฒนาแอปในการทดสอบภาพเคลื่อนไหวที่บ้านซึ่งแสดงในรูปที่ 1
ทำตามขั้นตอนต่อไปนี้เพื่อทดสอบภาพเคลื่อนไหวนี้
บนอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป
เลือกภาพเคลื่อนไหวย้อนกลับแบบคาดการณ์
เปิดแอปที่อัปเดตแล้วและใช้ท่าทางสัมผัสการย้อนกลับเพื่อดูการทำงาน