Để liên kết các thực thể DeepLinkRequest đến với các khoá có thể thêm vào ngăn xếp lui của ứng dụng, bạn cần xác định các thực thể DeepLinkMatcher.
DeepLinkMatcher là một lớp trừu tượng bao gồm hai phương thức, match và matchRequest. Các lớp con phải triển khai matchRequest, lấy DeepLinkRequest và trả về DeepLinkMatcher.MatchResult nếu yêu cầu khớp hoặc null nếu không khớp.
Vì nhiều trình so khớp có thể khớp với một yêu cầu, nên MatchResult sẽ triển khai Comparable để xếp hạng kết quả và chọn kết quả phù hợp nhất.
Tham số loại
Lớp DeepLinkMatcher khai báo hai tham số kiểu dữ liệu chung: DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>>.
T : Any: Loại khoá điều hướng đích đến (chẳng hạn nhưUserProfileKeyhoặcNavKey) được trả về khi đường liên kết sâu khớp.R : DeepLinkMatcher.MatchResult<T>: Loại phụMatchResultcụ thể domatchRequestvàmatchtrả về.
Tham số loại thứ hai, R, giữ nguyên thông tin khớp chuyên biệt mà không cần truyền kiểu dữ liệu xuống không được kiểm tra:
StaticKeyDeepLinkMatcherliên kếtRvớiDeepLinkMatcher.MatchResult<T>.UriDeepLinkMatcherliên kếtRvớiUriMatchResult, giữ lại đường dẫn đã phân tích cú pháp và đối số truy vấn cùng với điểm số khớp mẫu.BackStackMatcherliên kếtRvớiBackStackMatchResult, giữ lại danh sách ngăn xếp lui tổng hợp được tạo bởiwithBackStack.
Yêu cầu lọc trước
Các phương thức triển khai DeepLinkMatcher có thể chỉ định danh sách các thực thể DeepLinkMatcher.Filter để lọc yêu cầu trước khi đánh giá.
Thư viện này bao gồm các hàm trợ giúp để tạo bộ lọc phổ biến:
DeepLinkMatcher.mimeTypeFilter: So khớp theo chuỗimimeTypechính xác (kiểm traMimeTypeExtrasKey).DeepLinkMatcher.actionFilter: Khớp theo chuỗiactionchính xác (kiểm traActionExtrasKey).
Phương pháp này cho phép bạn sử dụng lại cùng một mẫu URI cho nhiều hành động, chẳng hạn như xem và chỉnh sửa:
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))
Vì Filter là một giao diện chức năng (SAM), nên bạn cũng có thể tạo bộ lọc bằng biểu thức lambda:
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
Sử dụng trình so khớp được cung cấp
Thư viện này bao gồm 3 cách triển khai DeepLinkMatcher chuẩn:
StaticKeyDeepLinkMatcher, UriDeepLinkMatcher và
BackStackMatcher. Nếu các trình so khớp này không đáp ứng yêu cầu của ứng dụng,
bạn có thể tạo trình so khớp đường liên kết sâu tuỳ chỉnh.
So khớp đường liên kết sâu cơ bản
Đối với các đường liên kết sâu cơ bản không có đối số để trích xuất, hãy sử dụng StaticKeyDeepLinkMatcher để so khớp các yêu cầu đáp ứng tất cả bộ lọc được cung cấp.
Ví dụ: để xử lý ý định cho ACTION_APPLICATION_PREFERENCES:
val preferencesActionFilter = DeepLinkMatcher.actionFilter(Intent.ACTION_APPLICATION_PREFERENCES) val preferencesActionDeepLinkMatcher = StaticKeyDeepLinkMatcher(PreferencesScreen, listOf(preferencesActionFilter))
Liên kết sâu URI khớp
Để so khớp URI phân cấp với các mẫu và trích xuất đối số, hãy sử dụng UriDeepLinkMatcher. Ví dụ: bạn có thể so khớp www.example.com/users/{id} để trích xuất đối số id vào khoá đích. Để biết thêm thông tin, hãy xem phần
Khớp đường liên kết sâu URI.
Tạo ngăn xếp lui tổng hợp
Để xác định cách tạo ngăn xếp lui tổng hợp từ một kết quả khớp thành công, hãy sử dụng BackStackMatcher. Thay vì tạo thực thể trực tiếp cho BackStackMatcher, hãy gọi hàm mở rộng withBackStack trên một DeepLinkMatcher khác. withBackStack gói trình nhận trong một BackStackMatcher
trả về một BackStackMatchResult chứa ngăn xếp lui tổng hợp
List. Vì BackStackMatchResult uỷ quyền so sánh cho kết quả trùng khớp cơ bản, nên việc gói một trình so khớp trong withBackStack sẽ giữ nguyên thứ hạng trùng khớp ban đầu.
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) }
Để xử lý ngăn xếp lui thu được trong hoạt động, hãy xem phần Khớp yêu cầu đến.