如需将传入的 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
,而是在另一个
上调用 withBackStack 扩展函数DeepLinkMatcher。withBackStack 会将接收器封装在 BackStackMatcher
中,该 BackStackMatchResult 会返回包含合成返回堆栈
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) }
如需在 activity 中处理生成的返回堆栈,请参阅 匹配传入的请求。