Để 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 hãy xác định các thực thể DeepLinkMatcher.
DeepLinkMatcher là một lớp trừu tượng bao gồm 2 phương thức là match và matchRequest. Các lớp con phải triển khai matchRequest. Lớp này lấy DeepLinkRequest và trả về DeepLinkMatcher.MatchResult nếu yêu cầu khớp hoặc null nếu không.
Vì nhiều đối tượng so khớp có thể so khớp một yêu cầu duy nhất, nên MatchResult 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, duy trì thông tin so khớp chuyên biệt mà không yêu cầu truyền xuống chưa 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ố so khớp mẫu.BackStackMatcherliên kếtRvớiBackStackMatchResult, giữ lại danh sách ngăn xếp lui tổng hợp dowithBackStacktạo.
Yêu cầu lọc trước
Các hoạt động triển khai DeepLinkMatcher có thể chỉ định một danh sách các thực thể DeepLinkMatcher.Filter để lọc các yêu cầu trước khi đánh giá chúng.
Thư viện này có 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: So 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 thao tác, chẳng hạn như xem so với 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 tiêu chuẩn: StaticKeyDeepLinkMatcher, UriDeepLinkMatcher và BackStackMatcher. Nếu các đối sánh này không đáp ứng yêu cầu của ứng dụng, bạn có thể tạo đối sánh đườ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))
So khớp các đường liên kết sâu URI
Để so khớp các 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 một khoá đích. Để biết thêm thông tin, hãy xem bài viết So khớp đường liên kết sâu URI.
Tạo một ngăn xếp lui tổng hợp
Để xác định cách tạo một ngăn xếp lui ảo từ một kết quả khớp thành công, hãy sử dụng BackStackMatcher. Thay vì khởi tạo BackStackMatcher trực tiếp, hãy gọi hàm tiện ích withBackStack trên một DeepLinkMatcher khác. withBackStack gói trình nhận trong một BackStackMatcher trả về BackStackMatchResult chứa ngăn xếp lui nhân tạo List. Vì BackStackMatchResult uỷ quyền so sánh cho kết quả trùng khớp cơ bản, nên việc bao bọc một đối tượng so khớp trong withBackStack sẽ giữ lại 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 kết quả trong hoạt động của bạn, hãy xem phần So khớp yêu cầu đến.