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

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

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

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

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

คุณทดสอบภาพเคลื่อนไหวกลับไปที่หน้าแรกนี้ได้ (ตามที่อธิบายไว้ในส่วนถัดไปของหน้านี้)

การรองรับท่าทางสัมผัสย้อนกลับแบบคาดการณ์ต้องมีการอัปเดตแอปโดยใช้ เข้ากันได้แบบย้อนหลัง OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) หรือ API ที่สูงกว่า หรือใช้ OnBackInvokedCallback Platform 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 ของแพลตฟอร์มได้ด้วย

อัปเดตแอปที่ใช้การนำทางย้อนกลับเริ่มต้น

ระบบจะเปิดใช้การคาดการณ์การย้อนกลับโดยค่าเริ่มต้น

หากแอปใช้ Fragment หรือ Navigation Component ให้อัปเกรดเป็น AndroidX Activity 1.6.0-alpha05 ขึ้นไปด้วย

อัปเดตแอปที่ใช้การนำทางย้อนกลับที่กำหนดเอง

หากแอปของคุณใช้ลักษณะการทำงานย้อนกลับที่กำหนดเอง จะมีเส้นทางการย้ายข้อมูลที่แตกต่างกัน ขึ้นอยู่กับว่าแอปใช้ AndroidX หรือไม่ และจัดการการนำทางย้อนกลับอย่างไร

แอปของคุณใช้ AndroidX วิธีที่แอปจัดการการนำทางย้อนกลับ เส้นทางการย้ายข้อมูลที่แนะนำ (ลิงก์ในหน้านี้)
ใช่ AndroidX APIs ย้ายข้อมูลการใช้งานย้อนกลับของ AndroidX ที่มีอยู่
API ของแพลตฟอร์มที่ไม่รองรับ ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางย้อนกลับที่ไม่รองรับไปยัง AndroidX API
ไม่ API ของแพลตฟอร์มที่ไม่รองรับ ย้ายข้อมูลได้ ย้ายข้อมูลแอปที่ใช้ API การนำทางย้อนกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม
API ของแพลตฟอร์มที่ไม่รองรับ แต่ย้ายข้อมูลไม่ได้ เลือกไม่ใช้ชั่วคราวโดยตั้งค่าแอตทริบิวต์ android:enableOnBackInvokedCallback เป็น false ในแท็ก <application> หรือ <activity> ของไฟล์ AndroidManifest.xml ของแอป

ย้ายข้อมูลการติดตั้งใช้งานการนำทางย้อนกลับของ AndroidX

กรณีการใช้งานนี้เป็นกรณีที่พบบ่อยที่สุด (และแนะนํามากที่สุด) โดยมีผลกับแอปใหม่หรือแอปที่มีอยู่ซึ่งใช้การจัดการการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสที่กำหนดเองด้วย OnBackPressedDispatcher ตามที่อธิบายไว้ใน จัดให้มีการนำทางย้อนกลับที่กำหนดเอง

หากต้องการให้ API ที่ใช้ OnBackPressedDispatcher (เช่น Fragment และ Navigation Component) ทำงานร่วมกับ ท่าทางสัมผัสย้อนกลับแบบคาดการณ์ได้อย่างราบรื่น ให้อัปเกรดเป็น 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

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

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

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

  4. โปรดอัปเกรดเป็น 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"
    

ย้ายข้อมูลแอปที่ใช้ API การนำทางย้อนกลับที่ไม่รองรับไปยัง API ของแพลตฟอร์ม

หากแอปใช้ไลบรารี AndroidX ไม่ได้ และใช้หรืออ้างอิงการนำทางย้อนกลับที่กำหนดเองโดยใช้ API ที่ไม่รองรับแทน คุณต้องย้ายข้อมูลไปยัง OnBackInvokedCallbackPlatform API

ทำตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูล API ที่ไม่รองรับไปยัง Platform API

  1. ใช้ OnBackInvokedCallback API ใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป และใช้ API ที่ไม่รองรับในอุปกรณ์ที่ใช้ Android 12 ลงไป

  2. ลงทะเบียนตรรกะย้อนกลับที่กำหนดเองใน OnBackInvokedCallback ด้วย onBackInvokedDispatcher ซึ่งจะป้องกันไม่ให้กิจกรรมปัจจุบัน สิ้นสุด และการเรียกกลับจะมีโอกาสตอบสนองต่อการดำเนินการย้อนกลับเมื่อ ผู้ใช้ทำการนำทางย้อนกลับของระบบเสร็จสมบูรณ์

  3. ยกเลิกการลงทะเบียน 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)
               */
            }
        );
      }
    }
  4. หยุดการสกัดกั้นเหตุการณ์ย้อนกลับโดยใช้ OnBackPressed หรือ KeyEvent.KEYCODE_BACK สำหรับ Android 13 ขึ้นไป

คุณลงทะเบียน OnBackInvokedCallback ด้วย PRIORITY_DEFAULT หรือ PRIORITY_OVERLAY ซึ่งไม่พร้อมใช้งานใน AndroidX OnBackPressedCallback ที่คล้ายกัน การลงทะเบียนการเรียกกลับด้วย PRIORITY_OVERLAY มีประโยชน์ในบางกรณี

ซึ่งจะมีผลเมื่อคุณย้ายข้อมูลจาก onKeyPreIme() และ Callback ของคุณต้อง รับท่าทางสัมผัสย้อนกลับแทนการเปิด IME IME จะลงทะเบียนการเรียกกลับด้วย PRIORITY_DEFAULT เมื่อเปิด ลงทะเบียนการเรียกกลับด้วย PRIORITY_OVERLAY เพื่อให้แน่ใจว่า OnBackInvokedDispatcher จะส่งท่าทางสัมผัสย้อนกลับไปยังการเรียกกลับ แทนที่จะเปิด IME

เลือกไม่ใช้การย้อนกลับที่คาดการณ์ได้

หากต้องการเลือกไม่ใช้ ให้ตั้งค่า Flag android:enableOnBackInvokedCallback เป็น false ใน AndroidManifest.xml ในแท็ก <application>

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

การตั้งค่านี้เป็น "เท็จ" จะมีผลดังนี้

  • ปิดใช้ภาพเคลื่อนไหวของระบบสำหรับท่าทางสัมผัสย้อนกลับแบบคาดเดา
  • ไม่สนใจ OnBackInvokedCallback แต่OnBackPressedCallback การโทร จะยังคงใช้งานได้

เลือกไม่ใช้ที่ระดับกิจกรรม

ตั้งแต่ Android 16 เป็นต้นไป แฟล็ก 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 ที่ระดับแอปจะกำหนด ค่าเริ่มต้นสำหรับกิจกรรมทั้งหมดในแอป คุณลบล้างค่าเริ่มต้นต่อกิจกรรมได้โดยการตั้งค่าแฟล็กที่ระดับกิจกรรม ดังที่แสดงใน ตัวอย่างโค้ดก่อนหน้า

แนวทางปฏิบัติแนะนำในการเรียกกลับ

แนวทางปฏิบัติแนะนำสำหรับการใช้การเรียกกลับของระบบที่รองรับมีดังนี้ BackHandler (สำหรับ Compose), OnBackPressedCallback หรือ OnBackInvokedCallback

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

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

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

  2. กำหนดสถานะดังกล่าวโดยใช้ที่เก็บข้อมูลที่สังเกตได้ ประเภท เช่น StateFlow หรือ สถานะ Compose แล้วเปิดหรือปิดใช้การเรียกกลับเมื่อสถานะเปลี่ยนแปลง

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

ใช้การเรียกกลับของฟีเจอร์ย้อนกลับของระบบสำหรับตรรกะ UI

ตรรกะของ UI กำหนดวิธีแสดง UI ใช้การเรียกกลับของระบบเพื่อเรียกใช้ตรรกะ UI เช่น การแสดงกล่องโต้ตอบหรือการเรียกใช้ภาพเคลื่อนไหว

หากแอปเปิดใช้ OnBackPressedCallback หรือ OnBackInvokedCallback ด้วย PRIORITY_DEFAULT หรือ PRIORITY_OVERLAY ภาพเคลื่อนไหวการย้อนกลับที่คาดการณ์ได้ จะไม่ทำงานและคุณต้องจัดการเหตุการณ์ย้อนกลับ อย่าสร้างการเรียกกลับเหล่านี้เพื่อเรียกใช้ตรรกะทางธุรกิจหรือเพื่อบันทึก

ใช้วิธีต่อไปนี้หากแอปต้องเรียกใช้ตรรกะทางธุรกิจหรือบันทึกเมื่อผู้ใช้ปัดกลับ

  • ใช้ OnBackInvokedCallback กับ PRIORITY_SYSTEM_NAVIGATION_OBSERVER ในอุปกรณ์ที่ใช้ Android 16 ขึ้นไป ซึ่งจะสร้างการเรียกกลับของ Observer ที่ไม่ ใช้เหตุการณ์ย้อนกลับ เช่น คุณอาจลงทะเบียนการเรียกกลับนี้เมื่อผู้ใช้ปัดกลับจากกิจกรรมรูท หรือกล่าวอีกนัยหนึ่งคือเมื่อผู้ใช้ได้ออกจากแอปของคุณ ในกรณีนี้ คุณสามารถบันทึกเหตุการณ์ย้อนกลับหรือเรียกใช้ตรรกะทางธุรกิจอื่นๆ และภาพเคลื่อนไหวกลับไปที่หน้าแรกจะยังคงเล่นอยู่
  • สำหรับกรณีจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่งหรือจาก Fragment ไปยังกิจกรรม ให้บันทึกหาก isFinishing ภายใน onDestroy เป็น true ภายในวงจรของกิจกรรม
  • สำหรับกรณีจาก Fragment ไปยัง Fragment ให้บันทึกหาก isRemoving ภายใน onDestroy เป็น จริงภายในวงจรการดูของ Fragment หรือบันทึกโดยใช้วิธีการ onBackStackChangeStarted หรือ onBackStackChangeCommitted ภายใน FragmentManager.OnBackStackChangedListener
  • สำหรับกรณีการเขียน ให้บันทึกภายในonCleared()การเรียกกลับของViewModel ที่เชื่อมโยงกับปลายทางการเขียน นี่คือสัญญาณที่ดีที่สุดในการระบุ เมื่อมีการนำปลายทางการเขียนออกจาก Back Stack และทำลาย

สร้างการเรียกกลับที่มีความรับผิดชอบเดียว

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

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

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

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

ส่วนการเรียกกลับอื่นๆ อาจมีคอมโพเนนต์ Material ที่รองรับการคาดคะเนการย้อนกลับ, การเปลี่ยน AndroidX โดยใช้ Progress API หรือการเรียกกลับที่กำหนดเองอื่นๆ

การเรียกกลับของ childFragmentManager จะทำงานหากปิดใช้การเรียกกลับข้างต้นและสแต็กย้อนกลับสำหรับ FragmentManager นี้ไม่ว่าง โดย childFragmentManager จะแนบภายใน Fragment ในตัวอย่างนี้ ระบบจะปิดใช้ การเรียกกลับภายใน

ในทำนองเดียวกัน การเรียกกลับภายในของ supportFragmentManager จะทำงานหากปิดใช้การเรียกกลับข้างต้นและสแต็กไม่ว่าง ลักษณะการทำงานนี้จะสอดคล้องกัน เมื่อใช้ FragmentManager หรือ NavigationComponent ในการนำทาง เนื่องจาก NavigationComponent ต้องอาศัย FragmentManager ในตัวอย่างนี้ การเรียกกลับนี้จะทํางานหากผู้ใช้ไม่ได้ป้อนข้อความลงในแบบฟอร์ม ซึ่งทําให้ระบบปิดใช้การเรียกกลับ "คุณแน่ใจไหม..."

สุดท้าย super.onBackPressed()คือการเรียกกลับระดับระบบ ซึ่งจะทำงานอีกครั้งหาก ปิดใช้การเรียกกลับข้างต้น หากต้องการทริกเกอร์ภาพเคลื่อนไหวของระบบ เช่น กลับไปหน้าแรก กิจกรรมข้าม และงานข้าม supportFragmentManager's back stack ต้องว่างเปล่าเพื่อปิดใช้การเรียกกลับภายใน

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

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

หากต้องการทดสอบภาพเคลื่อนไหวนี้ ให้ทำตามขั้นตอนต่อไปนี้

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

  2. เลือกการเคลื่อนไหวย้อนกลับแบบคาดเดา

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