แพลตฟอร์ม Android 16 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ
การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้มีผลกับแอปทั้งหมดเมื่อทำงานบน Android 16 โดยไม่คำนึงถึง targetSdkVersion
คุณควรทดสอบแอปแล้วแก้ไขแอปตามที่จำเป็นเพื่อรองรับการเปลี่ยนแปลงเหล่านี้ (หากมี)
โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่ส่งผลต่อแอปที่กําหนดเป้าหมายเป็น Android 16 เท่านั้นด้วย
ฟังก์ชันหลัก
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งแก้ไขหรือขยายความสามารถหลักต่างๆ ของระบบ Android
การเพิ่มประสิทธิภาพโควต้า JobScheduler
ตั้งแต่ Android 16 เป็นต้นไป เราจะปรับโควต้ารันไทม์ของงานแบบปกติและแบบเร่งด่วนตามปัจจัยต่อไปนี้
- บัคเก็ตสแตนด์บายของแอปที่แอปพลิเคชันอยู่: ใน Android 16 ระบบจะเริ่มบังคับใช้บัคเก็ตสแตนด์บายที่ใช้งานอยู่ด้วยโควต้ารันไทม์ที่เพียงพอ
- หากงานเริ่มดำเนินการขณะที่แอปอยู่ในสถานะบนสุด: ใน Android 16 งานเริ่มต้นขณะที่ผู้ใช้มองเห็นแอปและดำเนินการต่อหลังจากแอปมองไม่เห็นจะเป็นไปตามโควต้ารันไทม์ของงาน
- หากงานกำลังดำเนินการขณะเรียกใช้บริการที่ทำงานอยู่เบื้องหน้า: ใน Android 16 งานที่กำลังดำเนินการพร้อมกันกับบริการที่ทำงานอยู่เบื้องหน้าจะเป็นไปตามโควต้ารันไทม์ของงาน หากคุณใช้ประโยชน์จากงานสำหรับการโอนข้อมูลที่เริ่มต้นโดยผู้ใช้ ให้พิจารณาใช้งานการโอนข้อมูลที่เริ่มต้นโดยผู้ใช้แทน
การเปลี่ยนแปลงนี้จะส่งผลต่องานที่กําหนดเวลาไว้โดยใช้ WorkManager, JobScheduler และ DownloadManager หากต้องการแก้ไขข้อบกพร่องว่าเหตุใดงานจึงหยุดทำงาน เราขอแนะนำให้บันทึกสาเหตุที่งานหยุดทำงานโดยเรียกใช้ WorkInfo.getStopReason()
(สำหรับงาน JobScheduler ให้เรียกใช้ JobParameters.getStopReason()
)
ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติแนะนำเพื่อเพิ่มประสิทธิภาพแบตเตอรี่ได้ที่คำแนะนำเกี่ยวกับเพิ่มประสิทธิภาพการใช้แบตเตอรี่สำหรับ API การจัดตารางงาน
นอกจากนี้ เราขอแนะนําให้ใช้ประโยชน์จาก JobScheduler#getPendingJobReasonsHistory
API ใหม่ที่เปิดตัวใน Android 16 เพื่อทําความเข้าใจสาเหตุที่การทํางานไม่ทํางาน
การทดสอบ
หากต้องการทดสอบลักษณะการทํางานของแอป คุณสามารถเปิดใช้การลบล้างการเพิ่มประสิทธิภาพโควต้างานบางอย่างได้ ตราบใดที่แอปทํางานบนอุปกรณ์ Android 16
หากต้องการปิดใช้การบังคับใช้ "สถานะบนสุดจะยึดตามโควต้ารันไทม์ของงาน" ให้เรียกใช้คำสั่ง adb
ต่อไปนี้
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
หากต้องการปิดใช้การบังคับใช้ "งานที่ดำเนินการอยู่ขณะที่บริการที่ทำงานอยู่เบื้องหน้าจะยึดตามโควต้ารันไทม์ของงาน" ให้เรียกใช้คำสั่งadb
ต่อไปนี้
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
หากต้องการทดสอบลักษณะการทํางานของที่เก็บข้อมูลสแตนด์บายของแอปบางรายการ ให้ตั้งค่าที่เก็บข้อมูลสแตนด์บายของแอปโดยใช้คําสั่ง adb
ต่อไปนี้
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
หากต้องการทำความเข้าใจที่เก็บข้อมูลสแตนด์บายของแอปที่คุณใช้อยู่ ให้ดูที่เก็บข้อมูลสแตนด์บายของแอปโดยใช้คำสั่ง adb
ต่อไปนี้
adb shell am get-standby-bucket APP_PACKAGE_NAME
เหตุผลที่หยุดงานว่างเปล่าที่หยุดทำงาน
งานที่ถูกทิ้งจะเกิดขึ้นเมื่อมีการรวบรวมขยะจากออบเจ็กต์ JobParameters
ที่เชื่อมโยงกับงาน แต่ไม่มีการเรียกใช้ JobService#jobFinished(JobParameters,
boolean)
เพื่อส่งสัญญาณว่างานเสร็จสมบูรณ์ ซึ่งหมายความว่างานอาจกำลังทำงานและกำลังกำหนดเวลาใหม่โดยที่แอปไม่รู้
แอปที่อาศัย JobScheduler จะไม่เก็บการอ้างอิงแบบ Strong กับออบเจ็กต์ JobParameters
และตอนนี้การหมดเวลาจะได้รับเหตุผลใหม่ในการหยุดงาน STOP_REASON_TIMEOUT_ABANDONED
แทน STOP_REASON_TIMEOUT
หากมีสาเหตุใหม่ของการหยุดกลางคันเกิดขึ้นบ่อยครั้ง ระบบจะดำเนินการตามขั้นตอนเพื่อลดความถี่ของงาน
แอปควรใช้เหตุผลในการหยุดใหม่เพื่อตรวจหาและลดงานที่หยุดกลางคัน
หากคุณใช้ WorkManager, AsyncTask หรือ DownloadManager คุณจะได้รับผลกระทบเนื่องจาก API เหล่านี้จัดการวงจรงานในนามของแอป
เลิกใช้งาน JobInfo#setImportantWhileForeground อย่างสมบูรณ์
วิธีการ JobInfo.Builder#setImportantWhileForeground(boolean)
จะระบุความสำคัญของงานขณะที่แอปกำหนดเวลาอยู่เบื้องหน้าหรือเมื่อได้รับการยกเว้นจากข้อจำกัดของเบื้องหลังชั่วคราว
เราเลิกใช้งานเมธอดนี้ตั้งแต่ Android 12 (API ระดับ 31) ตั้งแต่ Android 16 เป็นต้นไป วิธีการนี้จะใช้งานไม่ได้อีกต่อไป และระบบจะไม่สนใจการเรียกใช้เมธอดนี้
การนําฟังก์ชันการทำงานนี้ออกจะมีผลกับJobInfo#isImportantWhileForeground()
ด้วย ตั้งแต่ Android 16 เป็นต้นไป หากมีการเรียกใช้เมธอด เมธอดจะแสดงผลลัพธ์เป็น false
ขอบเขตลําดับความสําคัญของประกาศตามลําดับไม่ได้เป็นแบบทั่วโลกอีกต่อไป
แอป Android ได้รับอนุญาตให้กำหนดลำดับความสำคัญในเครื่องรับการออกอากาศเพื่อควบคุมลำดับที่เครื่องรับจะรับและประมวลผลการออกอากาศ สําหรับตัวรับที่ประกาศในไฟล์ Manifest แอปสามารถใช้แอตทริบิวต์ android:priority
เพื่อกําหนดลําดับความสําคัญ และสำหรับตัวรับที่ลงทะเบียนตามบริบท แอปสามารถใช้ IntentFilter#setPriority()
API เพื่อกําหนดลําดับความสําคัญ เมื่อส่งการออกอากาศ ระบบจะส่งการออกอากาศไปยังผู้รับตามลําดับความสําคัญจากสูงไปต่ำ
ใน Android 16 ระบบจะไม่รับประกันลำดับการนำส่งแบบออกอากาศที่ใช้แอตทริบิวต์ android:priority
หรือ IntentFilter#setPriority()
ในกระบวนการต่างๆ ระบบจะพิจารณาลำดับความสำคัญของการออกอากาศภายในกระบวนการสมัครเดียวกันเท่านั้น ไม่ใช่ในทุกกระบวนการ
นอกจากนี้ ระบบจะจำกัดลําดับความสําคัญของรายการออกอากาศให้อยู่ในช่วง (SYSTEM_LOW_PRIORITY
+ 1,
SYSTEM_HIGH_PRIORITY
- 1) โดยอัตโนมัติ เฉพาะคอมโพเนนต์ของระบบเท่านั้นที่จะได้รับอนุญาตให้ตั้งค่า SYSTEM_LOW_PRIORITY
, SYSTEM_HIGH_PRIORITY
เป็นลำดับความสำคัญของการออกอากาศ
แอปของคุณอาจได้รับผลกระทบหากมีลักษณะการทำงานอย่างใดอย่างหนึ่งต่อไปนี้
- แอปพลิเคชันของคุณประกาศกระบวนการหลายรายการที่มี Intent การออกอากาศเดียวกัน และคาดหวังที่จะได้รับการส่ง Intent เหล่านั้นตามลำดับที่แน่นอนโดยอิงตามลําดับความสําคัญ
- กระบวนการสมัครของคุณจะโต้ตอบกับกระบวนการอื่นๆ และมีสิ่งที่คาดหวังเกี่ยวกับการรับ Intent การออกอากาศตามลําดับที่กําหนด
หากกระบวนการต่างๆ จำเป็นต้องประสานงานกัน ทีมควรสื่อสารโดยใช้ช่องทางประสานงานอื่นๆ
การเปลี่ยนแปลงภายในของ ART
Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.
As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.
Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.
All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.
โหมดความเข้ากันได้กับขนาดหน้า 16 KB
Android 15 รองรับหน้าหน่วยความจำขนาด 16 KB เพื่อเพิ่มประสิทธิภาพแพลตฟอร์ม Android 16 เพิ่มโหมดความเข้ากันได้ ซึ่งช่วยให้แอปบางแอปที่สร้างขึ้นสำหรับหน้าหน่วยความจำขนาด 4 KB ทำงานในอุปกรณ์ที่กำหนดค่าไว้สำหรับหน้าหน่วยความจำขนาด 16 KB ได้
เมื่อแอปทำงานในอุปกรณ์ที่ใช้ Android 16 ขึ้นไป หาก Android ตรวจพบว่าแอปของคุณมีหน้าหน่วยความจำที่ปรับแนวขนาด 4 KB ระบบจะใช้โหมดเข้ากันได้โดยอัตโนมัติและแสดงกล่องโต้ตอบการแจ้งเตือนต่อผู้ใช้ การตั้งค่าพร็อพเพอร์ตี้ android:pageSizeCompat
ใน AndroidManifest.xml
เพื่อเปิดใช้โหมดความเข้ากันได้แบบย้อนหลังจะป้องกันไม่ให้กล่องโต้ตอบแสดงเมื่อแอปเปิดขึ้น หากต้องการใช้พร็อพเพอร์ตี้ android:pageSizeCompat
ให้คอมไพล์แอปโดยใช้ Android 16 SDK
แอปของคุณควรยังคงมีขนาด 16 KB เพื่อให้มีประสิทธิภาพ ความน่าเชื่อถือ และความเสถียรที่ดีที่สุด ดูรายละเอียดเพิ่มเติมได้ในบล็อกโพสต์ล่าสุดเกี่ยวกับการอัปเดตแอปให้รองรับหน้าหน่วยความจำ 16 KB

ประสบการณ์ของผู้ใช้และ UI ของระบบ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์เพื่อมอบประสบการณ์การใช้งานที่สม่ำเสมอและใช้งานง่ายยิ่งขึ้นแก่ผู้ใช้
การเลิกใช้งานการประกาศการช่วยเหลือพิเศษที่รบกวน
Android 16 เลิกใช้งานการประกาศการช่วยเหลือพิเศษ ซึ่งมีลักษณะการใช้งาน announceForAccessibility
หรือการส่งเหตุการณ์การช่วยเหลือพิเศษ TYPE_ANNOUNCEMENT
การดำเนินการเหล่านี้อาจทำให้ผู้ใช้ TalkBack และโปรแกรมอ่านหน้าจอของ Android ได้รับประสบการณ์การใช้งานที่ไม่สอดคล้องกัน และทางเลือกอื่นๆ จะตอบสนองความต้องการของผู้ใช้ได้หลากหลายมากขึ้นในเทคโนโลยีความช่วยเหลือพิเศษต่างๆ ของ Android
ตัวอย่างทางเลือกมีดังนี้
- สำหรับการเปลี่ยนแปลง UI ที่สำคัญ เช่น การเปลี่ยนแปลงหน้าต่าง ให้ใช้
Activity.setTitle(CharSequence)
และsetAccessibilityPaneTitle(java.lang.CharSequence)
ในโหมดเขียน ให้ใช้Modifier.semantics { paneTitle = "paneTitle" }
- หากต้องการแจ้งให้ผู้ใช้ทราบถึงการเปลี่ยนแปลง UI ที่สำคัญ ให้ใช้
setAccessibilityLiveRegion(int)
ในโหมดเขียน ให้ใช้Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
คุณควรใช้ฟีเจอร์เหล่านี้อย่างจำกัดเนื่องจากอาจสร้างประกาศทุกครั้งที่มีการอัปเดตมุมมอง - หากต้องการแจ้งให้ผู้ใช้ทราบเกี่ยวกับข้อผิดพลาด ให้ส่ง
AccessibilityEvent
ประเภทAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
และตั้งค่าAccessibilityNodeInfo#setError(CharSequence)
หรือใช้TextView#setError(CharSequence)
เอกสารอ้างอิงสําหรับ announceForAccessibility
API ที่เลิกใช้งานแล้วมีรายละเอียดเพิ่มเติมเกี่ยวกับทางเลือกที่แนะนํา
การรองรับการไปยังส่วนต่างๆ แบบ 3 ปุ่ม
Android 16 รองรับการกดย้อนกลับแบบคาดการณ์ในการนําทางด้วยปุ่ม 3 ปุ่มสําหรับแอปที่ย้ายข้อมูลไปยังการกดย้อนกลับแบบคาดการณ์อย่างถูกต้อง การกดปุ่มย้อนกลับค้างไว้จะเป็นการเริ่มภาพเคลื่อนไหวย้อนกลับแบบคาดเดา ซึ่งจะแสดงตัวอย่างตำแหน่งที่คุณจะไปเมื่อปัดกลับ
ลักษณะการทำงานนี้มีผลกับทุกส่วนของระบบที่รองรับภาพเคลื่อนไหวแบบคาดเดาของการย้อนกลับ รวมถึงภาพเคลื่อนไหวของระบบ (การย้อนกลับไปยังหน้าจอหลัก การข้ามงาน และการทำงานข้ามแอป)
รูปแบบของอุปกรณ์
Android 16 (ระดับ API 36) มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อเจ้าของอุปกรณ์เสมือนโปรเจ็กต์ไปยังจอแสดงผล
การลบล้างของเจ้าของอุปกรณ์เสมือนจริง
เจ้าของอุปกรณ์เสมือนคือแอปที่เชื่อถือได้หรือมีสิทธิ์พิเศษซึ่งสร้างและจัดการอุปกรณ์เสมือน เจ้าของอุปกรณ์เสมือนจะเรียกใช้แอปในอุปกรณ์เสมือน จากนั้นจะโปรเจ็กต์แอปไปยังจอแสดงผลของอุปกรณ์ระยะไกล เช่น คอมพิวเตอร์ส่วนบุคคล อุปกรณ์ Virtual Reality หรือระบบสาระบันเทิงในรถยนต์ เจ้าของอุปกรณ์เสมือนอยู่ในอุปกรณ์ภายใน เช่น โทรศัพท์มือถือ

การลบล้างสำหรับแต่ละแอป
ในอุปกรณ์ที่ใช้ Android 16 (API ระดับ 36) เจ้าของอุปกรณ์เสมือนสามารถลบล้างการตั้งค่าแอปในอุปกรณ์เสมือนบางเครื่องที่เจ้าของอุปกรณ์เสมือนจัดการได้ ตัวอย่างเช่น หากต้องการปรับปรุงเลย์เอาต์แอป เจ้าของอุปกรณ์เสมือนสามารถละเว้นข้อจำกัดเกี่ยวกับการวางแนว สัดส่วนการแสดงผล และความสามารถในการปรับขนาดได้เมื่อโปรเจ็กต์แอปไปยังจอแสดงผลภายนอก
การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบที่พบได้ทั่วไป
ลักษณะการทํางานของ Android 16 อาจส่งผลต่อ UI ของแอปในหน้าจอขนาดใหญ่ เช่น จอแสดงผลของรถยนต์หรือ Chromebook โดยเฉพาะเลย์เอาต์ที่ออกแบบมาสำหรับจอแสดงผลขนาดเล็กในแนวตั้ง ดูวิธีทําให้แอปปรับเปลี่ยนรูปแบบให้เหมาะกับอุปกรณ์ทุกรูปแบบได้ที่เกี่ยวกับเลย์เอาต์แบบปรับเปลี่ยนได้
ข้อมูลอ้างอิง
ความปลอดภัย
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงที่ส่งเสริมความปลอดภัยของระบบเพื่อช่วยปกป้องแอปและผู้ใช้จากแอปที่เป็นอันตราย
ปรับปรุงความปลอดภัยเพื่อป้องกันการโจมตีด้วยการเปลี่ยนเส้นทาง Intent
Android 16 มีการรักษาความปลอดภัยเริ่มต้นเพื่อป้องกันIntent
การโจมตีด้วยการเปลี่ยนเส้นทางทั่วไป โดยมีการรองรับการทำงานร่วมกันขั้นต่ำและการเปลี่ยนแปลงที่นักพัฒนาแอปต้องทำ
เรากำลังเปิดตัวโซลูชันการปิดช่องโหว่เพื่อความปลอดภัยโดยค่าเริ่มต้นเพื่อIntent
การโจมตีด้วยการเปลี่ยนเส้นทาง ในกรณีส่วนใหญ่ แอปที่ใช้ Intent จะไม่พบปัญหาความเข้ากันได้ เนื่องจากเราได้รวบรวมเมตริกตลอดกระบวนการพัฒนาเพื่อตรวจสอบว่าแอปใดอาจพบปัญหา
การเปลี่ยนเส้นทาง Intent ใน Android เกิดขึ้นเมื่อผู้โจมตีควบคุมเนื้อหาของ Intent ที่ใช้เพื่อเปิดคอมโพเนนต์ใหม่ในบริบทของแอปที่มีช่องโหว่ได้บางส่วนหรือทั้งหมด ขณะที่แอปเหยื่อเปิด Intent ระดับย่อยที่ไม่น่าเชื่อถือในช่อง extras ของ Intent ("ระดับบนสุด") ซึ่งอาจทําให้แอปของผู้โจมตีเปิดใช้งานคอมโพเนนต์ส่วนตัวในบริบทของแอปเหยื่อ ทริกเกอร์การดําเนินการที่มีสิทธิ์ หรือรับสิทธิ์เข้าถึง URI สําหรับข้อมูลที่ละเอียดอ่อน ซึ่งอาจทําให้เกิดการขโมยข้อมูลและการดำเนินการโค้ดตามอำเภอใจ
เลือกไม่ใช้การจัดการการเปลี่ยนเส้นทาง Intent
Android 16 เปิดตัว API ใหม่ที่ช่วยให้แอปเลือกไม่ใช้การป้องกันด้านความปลอดภัยเมื่อเปิดตัวได้ ซึ่งอาจจำเป็นในบางกรณีที่ลักษณะการทำงานด้านความปลอดภัยเริ่มต้นรบกวน Use Case ของแอปที่ถูกต้อง
สําหรับแอปพลิเคชันที่คอมไพล์กับ SDK ของ Android 16 (API ระดับ 36) ขึ้นไป
คุณสามารถใช้เมธอด removeLaunchSecurityProtection()
กับออบเจ็กต์ Intent ได้โดยตรง
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
สําหรับแอปพลิเคชันที่คอมไพล์กับ Android 15 (API ระดับ 35) หรือต่ำกว่า
แม้ว่าเราจะไม่แนะนํา แต่คุณก็ใช้การสะท้อนเพื่อเข้าถึงเมธอด removeLaunchSecurityProtection()
ได้
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
// Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }
การเชื่อมต่อ
Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ในกองซ้อนบลูทูธเพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง
การจัดการการสูญเสียพันธบัตรที่ดีขึ้น
ตั้งแต่ Android 16 เป็นต้นไป สแต็กบลูทูธได้รับการอัปเดตเพื่อปรับปรุงความปลอดภัยและประสบการณ์ของผู้ใช้เมื่อตรวจพบการสูญเสียการเชื่อมโยงระยะไกล ก่อนหน้านี้ ระบบจะนำการจับคู่ออกโดยอัตโนมัติและเริ่มกระบวนการจับคู่ใหม่ ซึ่งอาจนำไปสู่การจับคู่อีกครั้งโดยไม่ตั้งใจ เราพบว่ามีหลายครั้งที่แอปไม่ได้จัดการเหตุการณ์การสูญเสียพันธบัตรอย่างสม่ำเสมอ
Android 16 ได้ปรับปรุงการจัดการการสูญเสียการเชื่อมโยงกับระบบเพื่อรวมประสบการณ์การใช้งาน หากไม่สามารถตรวจสอบสิทธิ์อุปกรณ์บลูทูธที่จับคู่ไว้ก่อนหน้านี้เมื่อเชื่อมต่ออีกครั้ง ระบบจะยกเลิกการเชื่อมต่อ เก็บข้อมูลการจับคู่ในเครื่อง และแสดงกล่องโต้ตอบของระบบเพื่อแจ้งให้ผู้ใช้ทราบถึงการสูญเสียการจับคู่และนำผู้ใช้ไปยังการจับคู่อีกครั้ง