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

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

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

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

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

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

การรองรับท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้ต้องมีการอัปเดตแอป โดยใช้ OnBackPressedCallback ที่เข้ากันได้แบบย้อนหลังใน API AndroidX Activity 1.6.0 ขึ้นไป หรือใช้ API แพลตฟอร์ม OnBackInvokedCallback ใหม่ แอปส่วนใหญ่ใช้ AndroidX API ที่เข้ากันได้แบบย้อนหลัง

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

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

นอกจากการใช้เอกสารประกอบในหน้านี้แล้ว ให้ลองใช้ Codelab ซึ่งจะแสดงการติดตั้งใช้งาน Use Case ทั่วไปของ WebView ที่จัดการท่าทางสัมผัสการย้อนกลับที่คาดการณ์ได้โดยใช้ Activity API ของ AndroidX

นอกจากนี้ คุณยังดูวิดีโอ 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 หรือคอมโพเนนต์การนําทาง ให้อัปเกรดเป็น AndroidX Activity 1.6.0 ขึ้นไปด้วย

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

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

วิธีที่แอปจัดการการนำทางย้อนกลับ เส้นทางการย้ายข้อมูลที่แนะนำ (ลิงก์ในหน้านี้)
AndroidX API ย้ายข้อมูลการใช้งานการย้อนกลับของ AndroidX ที่มีอยู่
API ของแพลตฟอร์มที่ไม่รองรับ ย้ายข้อมูลแอป AndroidX ที่มี API การนำทางย้อนกลับที่ไม่รองรับไปยัง AndroidX API

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

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

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

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

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

หลักเกณฑ์เกี่ยวกับ Callback

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

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

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

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

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

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

ใช้ Callback การย้อนกลับของระบบสำหรับตรรกะ UI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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