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

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

Android 14 (API ระดับ 34) เพิ่มการรองรับสำหรับภาพเคลื่อนไหวของระบบและ API เพิ่มเติม เพื่อสร้างภาพเคลื่อนไหวที่กำหนดเองได้ สำหรับข้อมูลเพิ่มเติม โปรดดู เพิ่มการรองรับภาพเคลื่อนไหวย้อนกลับแบบคาดเดาที่กำหนดเองและในตัว

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

การรองรับท่าทางสัมผัสการย้อนกลับแบบคาดเดาจำเป็นต้องมีการอัปเดตแอปของคุณโดยใช้ เข้ากันได้แบบย้อนหลัง OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) ขึ้นไป หรือใช้ OnBackInvokedCallback ใหม่ API ของแพลตฟอร์ม แอปส่วนใหญ่จะใช้ AndroidX API ที่เข้ากันได้แบบย้อนหลัง

การอัปเดตนี้มีเส้นทางการย้ายข้อมูลเพื่อให้สกัดกั้นการนำทางกลับได้อย่างเหมาะสม ซึ่งรวมถึงการแทนที่การดักบอลกลับจาก KeyEvent.KEYCODE_BACK และชั้นเรียนทั้งหมดที่มีเมธอด onBackPressed เช่น Activity และ Dialog พร้อม Back API ใหม่ของระบบ

วิดีโอ Codelab และ Google I/O

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

หากแอปของคุณอยู่ในหมวดหมู่นี้ โปรดทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มการสนับสนุนสำหรับ ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้:

  1. เพื่อให้มั่นใจว่า API ที่ใช้ API ของ OnBackPressedDispatcher อยู่แล้ว (เช่น Fragment และคอมโพเนนต์การนำทาง) ทำงานร่วมกับ ท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ อัปเกรดเป็น กิจกรรม 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"
    
  2. เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์ ตามที่อธิบายไว้ใน หน้านี้

ย้ายข้อมูลแอป AndroidX ซึ่งมี API การนำทางกลับที่ไม่รองรับไปยัง AndroidX API

หากแอปใช้ไลบรารี AndroidX แต่ใช้หรืออ้างอิงถึง API การนำทางกลับที่ไม่รองรับคุณจะต้องเปลี่ยนไปใช้ AndroidX API เพื่อรองรับลักษณะการทำงานใหม่

วิธีย้ายข้อมูล API ที่ไม่รองรับไปยัง AndroidX API

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

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

  3. หยุดการสกัดกั้นกิจกรรมย้อนกลับผ่าน OnBackPressed หรือ KeyEvent.KEYCODE_BACK

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

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

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

ทําตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูล API ที่ไม่รองรับไปยัง API ของแพลตฟอร์ม

  1. ใช้ OnBackInvokedCallback API ใหม่ในอุปกรณ์ที่ใช้ Android 13 หรือ สูงกว่า และใช้ API ที่ไม่รองรับในอุปกรณ์ที่ใช้ Android 12 หรือ ด้านล่าง

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

  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 ขึ้นไป

  5. เมื่อย้ายข้อมูลแอปเรียบร้อยแล้ว เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์ (ตามที่อธิบายไว้ใน หน้านี้) เพื่อให้ OnBackInvokedCallback มีผล

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

เลือกใช้ท่าทางสัมผัสการย้อนกลับแบบคาดการณ์

เมื่อคุณกำหนดวิธีอัปเดตแอปตามเคสของคุณแล้ว ให้เลือกใช้ รองรับท่าทางสัมผัสการย้อนกลับแบบคาดเดา

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

<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 เราขอแนะนำให้ปฏิบัติตาม ขั้นตอน

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

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

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

ใช้ Callback ของระบบสำหรับ UI Logic

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

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

ตัวอย่างเช่น หากคุณกำลังสกัดกั้นเหตุการณ์กลับเพื่อบันทึกเท่านั้น ให้บันทึกภายใน กิจกรรมหรือวงจรของ Fragment แทน

  • สำหรับกรณี Activity-to-activity หรือ Fragment-to-activity ให้บันทึกหาก isFinishing ภายใน onDestroy เท่ากับ true ในวงจรกิจกรรม
  • สำหรับกรณีที่เป็นส่วนย่อยถึงส่วนย่อย ให้บันทึกหาก isRemoving ภายใน onDestroy คือ true ในวงจรมุมมองของ Fragment หรือบันทึกโดยใช้ onBackStackChangeStarted หรือ onBackStackChangeCommitted เมธอดภายใน FragmentManager.OnBackStackChangedListener

สำหรับกรณี Compose ให้บันทึกภายใน Callback onCleared() ของ ViewModel ที่เชื่อมโยงกับปลายทางการเขียน นี่คือสัญญาณที่ดีที่สุดสำหรับการทราบว่า เมื่อปลายทางของการเขียนถูกแยกออกจากด้านหลังและทำลายลง

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

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

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

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

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

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

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

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