受信した 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 }
提供されているマッチャーを使用する
ライブラリには、3 つの標準的な DeepLinkMatcher 実装が含まれています:
StaticKeyDeepLinkMatcher、UriDeepLinkMatcher、および
BackStackMatcher。これらのマッチャーがアプリの要件を満たしていない場合は、
カスタム ディープリンク マッチャーを作成できます。
基本的なディープリンクを照合する
抽出する引数のない基本的なディープリンクの場合は、
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) }
アクティビティで結果のバックスタックを処理するには、 受信リクエストを照合するをご覧ください。