از نسخه ۱.۲.۰ به بعد، Navigation 3 از لینکدهی عمیق به مقاصد در برنامه شما با استفاده از کلاسهای DeepLinkRequest و DeepLinkMatcher پشتیبانی میکند.
برای پشتیبانی از لینکهای عمیق در برنامه خود، مراحل زیر را انجام دهید:
- فیلترهای intent را در
AndroidManifest.xmlخود تعریف کنید تا مشخص کنید برنامه شما کدام URI ها را می تواند مدیریت کند. - نمونههای
DeepLinkMatcherایجاد کنید تا درخواستهای ورودی را به کلیدهای ناوبری شما نگاشت کند. - درخواستهای ورودی را در متد
onCreateیاonNewIntentمربوط به activity خود تطبیق دهید و back stack خود را بر اساس آن بهروزرسانی کنید.
ایجاد یک DeepLinkRequest
یک DeepLinkRequest نشان دهنده یک لینک عمیق ورودی است. این شامل یک DeepLinkUri و RequestExtras اختیاری با اطلاعات اضافی، مانند اقدام هدف یا نوع MIME، است.
// Create a request with a String URI val request = DeepLinkRequest(uri = "https://www.example.com/home") // Create a request from a DeepLinkUri val deepLinkUri = DeepLinkUri("https://www.example.com/home") val requestFromUri = DeepLinkRequest(uri = deepLinkUri) // Create a request with a URI and action val requestWithAction = DeepLinkRequest( uri = "https://www.example.com/home", extras = DeepLinkRequest.actionExtra("android.intent.action.VIEW") ) // Create a request with URI, action and mimeType val requestWithMimeType = DeepLinkRequest( uri = "https://www.example.com/image", extras = requestExtras { put(DeepLinkRequest.ActionExtrasKey, "android.intent.action.VIEW") put(DeepLinkRequest.Companion.MimeTypeExtrasKey, "image/png") } )
امکانات اضافی DeepLinkRequest را ارائه دهید
برای ذخیره اطلاعات اضافی مربوط به لینک عمیق، از کلاس RequestExtras استفاده کنید. برای تعریف و نمونهسازی extraها از نظر نوع ایمن، این کتابخانه رابط RequestExtrasKey و requestExtras DSL را ارائه میدهد.
علاوه بر این، این کتابخانه دو کلید اضافی و کمککنندههای مرتبط ارائه میدهد:
-
MimeTypeExtrasKey: برای ذخیره یکStringاز نوع MIME استفاده میشود. -
ActionExtrasKey(فقط اندروید): برای ذخیرهStringاکشنِ یکIntentاستفاده میشود.
val extras: RequestExtras = requestExtras { put(DeepLinkRequest.Companion.MimeTypeExtrasKey, "application/json") put(DeepLinkRequest.ActionExtrasKey, Intent.ACTION_VIEW) } // Access typed values using the get operator val mimeType: String? = extras[DeepLinkRequest.Companion.MimeTypeExtrasKey] val action: String? = extras[DeepLinkRequest.ActionExtrasKey] // Create extras using helper functions and combine them val mimeTypeExtras: RequestExtras = DeepLinkRequest.mimeTypeExtra("application/json") val combinedExtras: RequestExtras = extras + DeepLinkRequest.actionExtra(Intent.ACTION_VIEW)
برای تعریف موارد اضافی سفارشی خود، رابط RequestExtrasKey را با یک ژنریک تایپ شده پیادهسازی کنید:
// Define a custom typed key: object CampaignIdExtrasKey : RequestExtrasKey<String> val customExtras: RequestExtras = requestExtras { put(CampaignIdExtrasKey, "123") } val campaignId: String? = customExtras[CampaignIdExtrasKey]
همچنین میتوانید از emptyRequestExtras() برای ساخت یک نمونه خالی استفاده کنید، یا موارد اضافی را با استفاده از عملگرهای + ( plus ) و - ( minus ) ترکیب کنید.
ایجاد یک DeepLinkRequest از یک Intent
در اندروید، میتوانید مستقیماً از یک Intent یک DeepLinkRequest ایجاد کنید. وقتی به این روش ساخته شود، DeepLinkRequest به صورت زیر ساخته میشود:
-
uriاز فیلدdataintent کپی میشود. - اگر null نباشد، نوع MIME و اکشنهای اضافی از فیلدهای intent مربوطه تنظیم میشوند.
- تمام
intent.extrasکه مقادیر غیر تهی دارند، به عنوان یکSavedStateدرDeepLinkRequest.IntentExtrasKeyذخیره میشوند. - هرگونه ویژگی اضافی ارائه شده با استفاده از پارامتر
extrasاضافه میشود.
object CampaignIdExtrasKey : RequestExtrasKey<String> val intent = Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("https://www.example.com/item/42") type = "application/json" putExtra("user_id", "123") } val request = DeepLinkRequest( intent = intent, extras = requestExtras { put(CampaignIdExtrasKey, "spring_promo") } ) // The resulting DeepLinkRequest contains: val uri = request.uri // "https://www.example.com/item/42" val action = request.extras[DeepLinkRequest.ActionExtrasKey] // "android.intent.action.VIEW" val mimeType = request.extras[DeepLinkRequest.Companion.MimeTypeExtrasKey] // "application/json" val intentExtras: SavedState? = request.extras[DeepLinkRequest.IntentExtrasKey] val userId: String? = intentExtras?.read { getStringOrNull("user_id") } // "123" val campaignId: String? = request.extras[CampaignIdExtrasKey] // "spring_promo"
ایجاد نمونههای DeepLinkMatcher
یک DeepLinkMatcher نمونههای DeepLinkRequest ورودی را به کلیدهای ناوبری نگاشت میکند که میتوانند به back stack برنامه شما اضافه شوند. Navigation 3 سه matcher داخلی ارائه میدهد: UriDeepLinkMatcher برای تطبیق URI مبتنی بر الگو، StaticKeyDeepLinkMatcher برای لینکهای پایه و BackStackMatcher برای ساخت back stack های مصنوعی. این کتابخانه همچنین از matcher های سفارشی برای موارد استفادهای که توسط matcher های داخلی پوشش داده نمیشوند، پشتیبانی میکند.
برای اطلاعات بیشتر، به ایجاد DeepLinkMatchers مراجعه کنید.
فیلترهای هدف را اضافه کنید
برای فعال کردن یک لینک عمیق برای شروع فعالیت خود، باید عناصر <intent-filter> منطبق را در AndroidManifest.xml برنامه خود تعریف کنید. برای اطلاعات بیشتر، به بخش «افزودن فیلترهای intent برای لینکهای ورودی » مراجعه کنید.
مطابقت با درخواست ورودی
پس از ایجاد نمونههای DeepLinkMatcher ، میتوانید درخواستهای ورودی را در activity خود مطابقت دهید.
برای تطبیق درخواست ورودی، مراحل زیر را انجام دهید:
- نمونههای
DeepLinkMatcherخود را نمونهسازی کنید . - تمام نمونههای
DeepLinkMatcherخود را، چه به صورت صریح و چه با استفاده از multibindings ، جمعآوری کنید . - یک
DeepLinkRequestازIntentورودی ایجاد کنید . - درخواست را با تمام تطبیقدهندهها مطابقت دهید و بهترین تطابق را پیدا کنید.
- پشته پشتی را از نتیجه تطبیق ایجاد کنید .
// 1. Instantiate your DeepLinkMatcher instances. val homeMatcher = StaticKeyDeepLinkMatcher(HomeKey, listOf(DeepLinkMatcher.actionFilter(Intent.ACTION_VIEW))) val userProfileMatcher = UriDeepLinkMatcher( DeepLinkUri("www.example.com/users/{id}"), serializer<UserProfileKey>() ).withBackStack { matchResult -> listOf(HomeKey, matchResult.key) } val telMatcher = TelDeepLinkMatcher() // 2. Collate all of your DeepLinkMatcher instances. // Note: Collating matchers with different generic types requires wildcards, // erasing the specific generic types. val deepLinkMatchers: List<DeepLinkMatcher<*, *>> = listOf( homeMatcher, userProfileMatcher, telMatcher ) class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... // 3. Create a DeepLinkRequest from the incoming Intent val request = DeepLinkRequest(intent = intent) // 4. Match the request against all matchers and find the best match. // Because DeepLinkMatcher.MatchResult implements Comparable, you can // use maxOrNull() to find the best match. val matchResult = deepLinkMatchers .mapNotNull { it.match(request) } // List<DeepLinkMatcher.MatchResult<*>> .maxOrNull() // DeepLinkMatcher.MatchResult<*>? // 5. Create the back stack from the match result (or fall back to a default). val backStack: List<NavKey> = when (matchResult) { // If no match is found, use the default back stack (e.g., HomeKey) null -> listOf(HomeKey) // If a BackStackMatchResult is found, use the back stack from the result is BackStackMatchResult<*, *> -> { // Because star-projected matchers erase the key type, cast the back stack to List<NavKey>. @Suppress("UNCHECKED_CAST") matchResult.backStack as List<NavKey> } // Otherwise, use the key from the match result to make a single-item back stack else -> listOf(matchResult.key as NavKey) } } }