受信した DeepLinkRequest インスタンスを、アプリのバックスタックに追加できるキーにマッピングするには、DeepLinkMatcher インスタンスを定義します。
DeepLinkMatcher は、match と matchRequest の 2 つのメソッドを含む抽象クラスです。サブクラスは matchRequest を実装する必要があります。これは DeepLinkRequest を受け取り、リクエストが一致する場合は DeepLinkMatcher.MatchResult を返し、一致しない場合は null を返します。
複数のマッチャーが 1 つのリクエストに一致する可能性があるため、MatchResult は Comparable を実装して結果をランク付けし、最適な一致を選択します。
型パラメータ
DeepLinkMatcher クラスは、DeepLinkMatcher<T : Any, R : DeepLinkMatcher.MatchResult<T>> という 2 つの汎用型パラメータを宣言します。
T : Any: ディープリンクが一致したときに返される、デスティネーション ナビゲーション キーのタイプ(UserProfileKeyやNavKeyなど)。R : DeepLinkMatcher.MatchResult<T>:matchRequestとmatchによって返される特定のMatchResultサブタイプ。
2 番目の型パラメータ 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)インターフェースであるため、ラムダ式を使用してフィルタを作成することもできます。
val myFilter = DeepLinkMatcher.Filter { request -> request.uri != null }
提供されているマッチャーを使用する
このライブラリには、StaticKeyDeepLinkMatcher、UriDeepLinkMatcher、BackStackMatcher の 3 つの標準 DeepLinkMatcher 実装が含まれています。これらのマッチャーがアプリの要件を満たしていない場合は、カスタム ディープリンク マッチャーを作成できます。
基本的なディープリンクを照合する
抽出する引数がない基本的なディープリンクの場合は、StaticKeyDeepLinkMatcher を使用して、指定されたすべてのフィルタに一致するリクエストを照合します。
たとえば、ACTION_APPLICATION_PREFERENCES のインテントを処理するには、次のようにします。
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 は、合成バックスタック List を含む BackStackMatchResult を返す BackStackMatcher でレシーバーをラップします。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) }
アクティビティで結果のバックスタックを処理するには、受信リクエストを照合するをご覧ください。