หากต้องการแมปอินสแตนซ์ DeepLinkRequest ขาเข้ากับคีย์ที่สามารถเพิ่มลงใน Back Stack ของแอป คุณต้องกำหนดอินสแตนซ์ DeepLinkMatcher
DeepLinkMatcher เป็นคลาสนามธรรมที่มี 2 เมธอด ได้แก่ match และ matchRequest คลาสย่อยต้องติดตั้งใช้งาน matchRequest ซึ่งใช้ DeepLinkRequest และแสดงผล DeepLinkMatcher.MatchResult หากคำขอตรงกัน หรือแสดงผล null หากไม่ตรงกัน
เนื่องจากตัวจับคู่หลายตัวอาจจับคู่กับคำขอเดียว MatchResult จึงใช้ Comparable เพื่อจัดอันดับผลลัพธ์และเลือกรายการที่ตรงกันมากที่สุด
พารามิเตอร์ประเภท
คลาส DeepLinkMatcher ประกาศพารามิเตอร์ประเภททั่วไป 2 รายการ ได้แก่ DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>
T : Any: ประเภทคีย์การนำทางปลายทาง (เช่นUserProfileKeyหรือNavKey) ที่แสดงผลเมื่อ Deep Link ตรงกันR : DeepLinkMatcher.MatchResult<T>: ประเภทย่อยMatchResultที่เฉพาะเจาะจงซึ่งแสดงผลโดยmatchRequestและmatch
พารามิเตอร์ประเภทที่ 2 R จะเก็บรักษาข้อมูลการจับคู่เฉพาะทางโดยไม่ต้องใช้การดาวน์แคสต์ที่ไม่ได้ตรวจสอบ
StaticKeyDeepLinkMatcherจะเชื่อมโยงRกับDeepLinkMatcher.MatchResult<T>UriDeepLinkMatcherเชื่อมโยงRกับUriMatchResultโดยคงเส้นทางที่แยกวิเคราะห์และอาร์กิวเมนต์การค้นหาไว้พร้อมกับคะแนนการจับคู่รูปแบบBackStackMatcherเชื่อมโยงRกับBackStackMatchResultโดยคงรายการ Back Stack สังเคราะห์ที่สร้างโดยwithBackStackไว้
คำขอตัวกรองล่วงหน้า
การติดตั้งใช้งาน DeepLinkMatcher สามารถระบุรายการอินสแตนซ์ DeepLinkMatcher.Filter เพื่อกรองคำขอก่อนประเมินได้
ไลบรารีมีฟังก์ชันตัวช่วยในการสร้างตัวกรองทั่วไป ดังนี้
DeepLinkMatcher.mimeTypeFilter: จับคู่ตามสตริงmimeTypeที่ตรงกันทุกประการ (ตรวจสอบMimeTypeExtrasKey)DeepLinkMatcher.actionFilter: จับคู่ตามสตริงactionที่ตรงกันทุกประการ (ตรวจสอบActionExtrasKey)
วิธีนี้ช่วยให้คุณใช้รูปแบบ URI เดียวกันซ้ำสำหรับการดำเนินการต่างๆ ได้ เช่น การดูและการแก้ไข
val viewFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW) val editFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_EDIT) val imageUriPattern = DeepLinkUri("www.example.com/image/{id}") val viewMatcher = UriDeepLinkMatcher(imageUriPattern, serializer<Gallery>(), filters = listOf(viewFilter)) val editMatcher = UriDeepLinkMatcher(imageUriPattern, serializer<Editor>(), filters = listOf(editFilter))
เนื่องจาก Filter เป็นอินเทอร์เฟซแบบฟังก์ชัน (SAM) คุณจึงสร้างตัวกรองโดยใช้นิพจน์ Lambda ได้ด้วย ดังนี้
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
ใช้ Matcher ที่มีให้
ไลบรารีประกอบด้วยการติดตั้งใช้งาน DeepLinkMatcher มาตรฐาน 3 รายการ ได้แก่ StaticKeyDeepLinkMatcher, UriDeepLinkMatcher และ BackStackMatcher หากตัวจับคู่เหล่านี้ไม่เป็นไปตามข้อกำหนดของแอป คุณสามารถสร้างตัวจับคู่ Deep Link ที่กำหนดเองได้
จับคู่ Deep Link พื้นฐาน
สำหรับ Deep Link พื้นฐานที่ไม่มีอาร์กิวเมนต์ให้ดึงข้อมูล ให้ใช้ StaticKeyDeepLinkMatcher เพื่อจับคู่คำขอที่ตรงกับตัวกรองทั้งหมดที่ระบุ
ตัวอย่างเช่น หากต้องการจัดการ Intent สำหรับ ACTION_APPLICATION_PREFERENCES ให้ทำดังนี้
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
จับคู่ Deep Link ของ URI
หากต้องการจับคู่ URI แบบลำดับชั้นกับรูปแบบและดึงอาร์กิวเมนต์ ให้ใช้ UriDeepLinkMatcher เช่น คุณสามารถจับคู่ www.example.com/users/{id} เพื่อดึงอาร์กิวเมนต์ id ไปยังคีย์ปลายทาง ดูข้อมูลเพิ่มเติมได้ที่จับคู่ Deep Link ของ URI
สร้าง Back Stack สังเคราะห์
หากต้องการกำหนดวิธีสร้าง Back Stack สังเคราะห์จากการจับคู่ที่สำเร็จ ให้ใช้ BackStackMatcher แทนที่จะสร้างอินสแตนซ์ BackStackMatcher โดยตรง ให้เรียกใช้ฟังก์ชันส่วนขยาย withBackStack ใน DeepLinkMatcher อื่น withBackStack จะรวม Receiver ไว้ใน BackStackMatcher ที่แสดงผล BackStackMatchResult ซึ่งมี Back Stack สังเคราะห์ List เนื่องจาก BackStackMatchResult มอบสิทธิ์การเปรียบเทียบให้กับผลลัพธ์การจับคู่ที่สำคัญ การรวม Matcher ไว้ใน withBackStack จะคงการจัดอันดับการจับคู่เดิมไว้
val homeMatcher = StaticKeyDeepLinkMatcher(HomeKey, listOf(DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW))) val userListMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users?page={page}"), serializer<UserListKey>() ).withBackStack { matchResult -> listOf(HomeKey, matchResult.key) } val userProfileMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ).withBackStack { matchResult -> listOf(HomeKey, UserListKey(), matchResult.key) }
หากต้องการจัดการ Back Stack ที่ได้ในกิจกรรม โปรดดูหัวข้อจับคู่คำขอที่เข้ามา