เพิ่มการรองรับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้

รูปที่ 1 แบบจำลองลักษณะการทำงานของท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้บนโทรศัพท์

การย้อนกลับที่คาดการณ์ได้ ซึ่งเป็นฟีเจอร์การไปยังส่วนต่างๆ ด้วยท่าทางสัมผัส ช่วยให้ผู้ใช้ดูตัวอย่างได้ว่าการปัดกลับจะนำผู้ใช้ไปที่ใด

ตัวอย่างเช่น การใช้ท่าทางสัมผัสสำหรับย้อนกลับจะแสดงตัวอย่างภาพเคลื่อนไหวของ หน้าจอหลักที่อยู่ด้านหลังแอปของคุณ ดังที่แสดงในภาพจำลองในรูปที่ 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

  1. ย้ายตรรกะการจัดการปุ่มย้อนกลับของระบบไปยัง OnBackPressedDispatcher ของ AndroidX โดยใช้การติดตั้งใช้งาน OnBackPressedCallback ดูคำแนะนำแบบละเอียดได้ที่ระบุการนำทางย้อนกลับที่กำหนดเอง

  2. ปิดใช้ OnBackPressedCallback เมื่อพร้อมที่จะหยุดการสกัดกั้นท่าทางสัมผัสย้อนกลับ

  3. หยุดการสกัดกั้นเหตุการณ์ย้อนกลับโดยใช้ OnBackPressed หรือ KeyEvent.KEYCODE_BACK

  4. อย่าลืมอัปเกรดเป็น 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 จะปิดภาพเคลื่อนไหวการย้อนกลับแบบคาดการณ์ ที่ระดับกิจกรรมหรือระดับแอป ทั้งนี้ขึ้นอยู่กับ ตำแหน่งที่คุณตั้งค่าแท็ก และสั่งให้ระบบไม่สนใจการเรียกใช้ OnBackInvokedCallback API ของแพลตฟอร์ม อย่างไรก็ตาม การเรียกไปยัง OnBackPressedCallback จะยังคงทำงานต่อไปเนื่องจาก OnBackPressedCallback มี ความเข้ากันได้แบบย้อนหลังและเรียกใช้ API onBackPressed ซึ่งไม่รองรับ ใน Android เวอร์ชันก่อน 13
  • การตั้งค่าแฟล็ก enableOnBackInvokedCallback ที่ระดับแอปจะกำหนด ค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณลบล้างค่าเริ่มต้น ต่อกิจกรรมได้โดยการตั้งค่าแฟล็กที่ระดับกิจกรรม ดังที่แสดงใน ตัวอย่างโค้ดก่อนหน้า

หลักเกณฑ์การโทรกลับ

ปฏิบัติตามหลักเกณฑ์ต่อไปนี้เมื่อใช้การเรียกกลับของระบบที่รองรับ: PredictiveBackHandler หรือ BackHandler (สำหรับ Compose), OnBackPressedCallback หรือ OnBackInvokedCallback

กำหนดสถานะ UI ที่เปิดและปิดใช้ Callback แต่ละรายการ

สถานะ UI คือพร็อพเพอร์ตี้ที่อธิบาย UI เราขอแนะนำให้ทำตามขั้นตอนระดับสูงต่อไปนี้

  1. กำหนดสถานะ UI ที่เปิดและปิดใช้แต่ละแฮนเดิลการเรียกกลับ

  2. กำหนดสถานะดังกล่าวโดยใช้ที่เก็บข้อมูลที่ได้รับอนุญาตให้สังเกตพฤติกรรมผู้ใช้ได้ ประเภท เช่น 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 อยู่ภายใน true Activity.onDestroy() หรือไม่
    • สำหรับการเปลี่ยนฉาก Fragment ให้ตรวจสอบว่า isRemoving เป็น true ภายใน วงจรการแสดงผลของ Fragment onDestroy() หรือใช้ FragmentManager.OnBackStackChangedListener (onBackStackChangeStarted / onBackStackChangeCommitted)

สร้างการเรียกกลับแบบความรับผิดเดียว

คุณเพิ่มการเรียกกลับหลายรายการไปยัง Dispatcher ได้ ระบบจะเพิ่มการเรียกกลับไปยังสแต็ก ซึ่งการเรียกกลับที่เปิดใช้ที่เพิ่มล่าสุดจะจัดการท่าทางสัมผัสย้อนกลับถัดไป โดยมีการเรียกกลับ 1 รายการต่อท่าทางสัมผัสย้อนกลับ

การจัดการสถานะที่เปิดใช้ของ Callback จะง่ายขึ้นหาก Callback นั้นมี ความรับผิดชอบเดียว เช่น

ลำดับการเรียกกลับในสแต็กใน Compose
รูปที่ 2 แผนภาพสแต็กการเรียกกลับใน Compose

รูปที่ 2 แสดงวิธีที่คุณสามารถมีหลายการเรียกกลับในสแต็ก โดยแต่ละการเรียกกลับ จะรับผิดชอบสิ่งหนึ่ง ใน Compose ระบบจะประเมินการเรียกกลับจาก Composable ที่อยู่ด้านในสุดไปยังด้านนอกสุด และการเรียกกลับจะทำงานก็ต่อเมื่อมีการปิดใช้การเรียกกลับที่อยู่ก่อนหน้าในสแต็ก

  • "คุณแน่ใจไหม..." PredictiveBackHandler จะเปิดใช้เมื่อผู้ใช้ป้อน ข้อมูลลงในแบบฟอร์ม และจะปิดใช้ในกรณีอื่นๆ เมื่อเปิดใช้ ฟีเจอร์นี้จะสกัดกั้น ท่าทางสัมผัสย้อนกลับเพื่อแสดงกล่องโต้ตอบการยืนยันหรือภาพเคลื่อนไหวในแอปที่กำหนดเอง
  • BackHandler ระดับหน้าจอจะทํางานหากปิดใช้การเรียกกลับก่อนหน้า ใน ตัวอย่างนี้ ฟีเจอร์นี้ถูกปิดใช้
  • การเรียกกลับ NavHost จะจัดการการนำทางย้อนกลับไปยังปลายทางป๊อปจาก Back Stack หากปิดใช้การเรียกกลับที่กำหนดเองก่อนหน้า
  • สุดท้าย ระบบจะจัดการท่าทางสัมผัสย้อนกลับหากปิดใช้การเรียกกลับก่อนหน้าทั้งหมด เมื่อ Back Stack อยู่ที่ปลายทางรูท ระบบจะทริกเกอร์ภาพเคลื่อนไหวระดับระบบ เช่น กลับไปหน้าแรก ข้ามกิจกรรม และข้ามงาน

ลักษณะการทำงานของสแต็กเดียวกันนี้จะใช้ในแอปที่อิงตาม View ด้วย โดย OnBackPressedCallbackที่เปิดใช้และเพิ่มล่าสุดจะมีลำดับความสำคัญสูงสุด รองลงมาคือ FragmentManager และ สุดท้ายคือการจัดการการกลับของระบบ

ทดสอบภาพเคลื่อนไหวของท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้

ตั้งแต่ Android 15 เป็นต้นไป ระบบจะเปิดใช้ภาพเคลื่อนไหวของระบบ เช่น กลับไปที่หน้าแรก ข้ามงาน และข้ามกิจกรรมโดยค่าเริ่มต้นสำหรับแอปที่รองรับการนำทางด้วยท่าทางสัมผัสย้อนกลับแบบคาดเดา โดยฟีเจอร์เหล่านี้จะไม่อยู่ในตัวเลือกสำหรับนักพัฒนาแอปอีกต่อไป

ในอุปกรณ์ที่ใช้ Android 13 หรือ Android 14 คุณสามารถเปิดใช้ตัวเลือกสำหรับนักพัฒนาแอปเพื่อทดสอบภาพเคลื่อนไหวกลับไปที่หน้าแรกที่แสดงในรูปที่ 1 ได้โดยทำดังนี้

  1. ในอุปกรณ์ ให้ไปที่การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป

  2. เลือกภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้

  3. เปิดแอปที่อัปเดตแล้ว และใช้ท่าทางสัมผัสย้อนกลับเพื่อดูการทำงาน