如需将传入的 DeepLinkRequest 实例映射到可添加到应用返回堆栈的键,您需要定义 DeepLinkMatcher 实例。
DeepLinkMatcher 是一个抽象类,包含 match 和 matchRequest 两个方法。子类必须实现 matchRequest,它接受 DeepLinkRequest,并在请求匹配时返回 DeepLinkMatcher.MatchResult,否则返回 null。
由于多个匹配器可能会匹配单个请求,因此 MatchResult 会实现 Comparable 来对结果进行排名并选择最佳匹配项。
类型形参
DeepLinkMatcher 类声明了两个通用类型形参:DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>。
T : Any:深层链接匹配时返回的目标导航键类型(例如UserProfileKey或NavKey)。R : DeepLinkMatcher.MatchResult<T>:matchRequest和match返回的特定MatchResult子类型。
第二个类型参数 R 会保留专用匹配信息,而无需进行未经检查的向下转型:
StaticKeyDeepLinkMatcher将R绑定到DeepLinkMatcher.MatchResult<T>。UriDeepLinkMatcher将R绑定到UriMatchResult,同时保留解析后的路径和查询参数以及模式匹配分数。BackStackMatcher将R绑定到BackStackMatchResult,从而保留由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 }
使用提供的匹配器
该库包含三种标准 DeepLinkMatcher 实现:StaticKeyDeepLinkMatcher、UriDeepLinkMatcher 和 BackStackMatcher。如果这些匹配器不符合应用的要求,您可以创建自定义深层链接匹配器。
匹配基本深层链接
对于没有要提取的实参的基本深层链接,请使用 StaticKeyDeepLinkMatcher 匹配满足所有提供的过滤条件的请求。
例如,如需处理 ACTION_APPLICATION_PREFERENCES 的 intent,请执行以下操作:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
匹配 URI 深层链接
如需将分层 URI 与模式进行匹配并提取实参,请使用 UriDeepLinkMatcher。例如,您可以匹配 www.example.com/users/{id},以将 id 实参提取到目标键中。如需了解详情,请参阅匹配 URI 深层链接。
构建合成返回堆栈
如需定义如何根据成功匹配构建合成返回堆栈,请使用 BackStackMatcher。请勿直接实例化 BackStackMatcher,而应在另一个 DeepLinkMatcher 上调用 withBackStack 扩展函数。withBackStack 会将接收器封装在 BackStackMatcher 中,后者会返回一个包含合成返回堆栈 List 的 BackStackMatchResult。由于 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) }
如需在 activity 中处理生成的返回堆栈,请参阅匹配传入请求。