หากต้องการแมปอินสแตนซ์ 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) คุณจึงสร้างตัวกรองโดยใช้นิพจน์แลมบ์ดาได้ด้วย
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
ใช้ตัวจับคู่ที่ให้มา
ไลบรารีมีการติดตั้งใช้งานมาตรฐาน 3 รายการ:DeepLinkMatcher
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 ให้เรียกใช้ฟังก์ชันส่วนขยาย withBackStack ใน
DeepLinkMatcher อื่นแทนการสร้างอินสแตนซ์ BackStackMatcher
โดยตรง withBackStack จะห่อหุ้มตัวรับไว้ใน BackStackMatcher
ซึ่งแสดงผล BackStackMatchResult ที่มี Back Stack สังเคราะห์
List เนื่องจาก BackStackMatchResult มอบหมายการเปรียบเทียบให้กับผลการจับคู่พื้นฐาน การห่อหุ้มตัวจับคู่ใน 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 ที่ได้ในกิจกรรม ให้ดูหัวข้อ จับคู่คำขอขาเข้า