بدءًا من الإصدار 1.2.0، يتيح Navigation 3 الربط بصفحات معيّنة في تطبيقك باستخدام الفئتَين DeepLinkRequest وDeepLinkMatcher.
لإتاحة الروابط لصفحات معيّنة في تطبيقك، أكمِل الخطوات التالية:
- حدِّد فلاتر الأهداف في
AndroidManifest.xmlلتحديد معرّفات الموارد المنتظمة (URI) التي يمكن لتطبيقك التعامل معها. - أنشئ مثيلات
DeepLinkMatcherلربط الطلبات الواردة بمفاتيح التنقّل. - طابِق الطلبات الواردة في إجراء
onCreateأوonNewIntentالخاص بنشاطك وعدِّل الأنشطة السابقة وفقًا لذلك.
إنشاء DeepLinkRequest
يمثّل DeepLinkRequest رابطًا عميقًا واردًا. يحتوي على
DeepLinkUri وRequestExtras اختياري مع معلومات
إضافية، مثل إجراء intent أو نوع 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. لجعل تحديد الإضافات وإنشائها آمنًا من حيث النوع،
توفّر المكتبة واجهة RequestExtrasKey وrequestExtras DSL.
بالإضافة إلى ذلك، توفّر المكتبة مفتاحَين إضافيَين ومساعدَين مرتبطَين بهما:
-
MimeTypeExtrasKey: يُستخدَم لتخزين نوع MIMEString. ActionExtrasKey(على أجهزة Android فقط): يُستخدَم لتخزين إجراء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
على أجهزة Android، يمكنك إنشاء DeepLinkRequest مباشرةً من Intent. عند إنشائها بهذه الطريقة، يتم إنشاء DeepLinkRequest على النحو التالي:
- يتم نسخ
uriمن حقلdataالخاص بالintent. - إذا لم تكن القيمة فارغة، يتم ضبط نوع 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 الواردة بمفاتيح التنقّل التي يمكن إضافتها إلى الأنشطة السابقة في تطبيقك. توفّر Navigation 3
ثلاثة أدوات مطابقة مدمجة: UriDeepLinkMatcher لمطابقة معرّفات الموارد المنتظمة (URI) المستندة إلى الأنماط، وStaticKeyDeepLinkMatcher للروابط الأساسية، وBackStackMatcher لإنشاء الأنشطة السابقة الاصطناعية. تتيح المكتبة أيضًا استخدام أدوات المطابقة المخصّصة لحالات الاستخدام التي لا تغطيها أدوات المطابقة المضمّنة.
لمزيد من المعلومات، يُرجى الاطّلاع على إنشاء DeepLinkMatchers.
إضافة فلاتر الأهداف
لتفعيل رابط لصفحة معيّنة لبدء نشاطك، عليك تحديد عناصر <intent-filter> المطابقة في AndroidManifest.xml لتطبيقك. لمزيد من المعلومات، يُرجى الاطّلاع على إضافة intent filter للروابط الواردة.
مطابقة طلب وارد
بعد إنشاء مثيلات DeepLinkMatcher، يمكنك مطابقة
الطلبات الواردة في نشاطك.
لمطابقة طلب وارد، أكمِل الخطوات التالية:
- إنشاء نُسخ
DeepLinkMatcher - اجمع كل مثيلات
DeepLinkMatcher، إما بشكل صريح أو باستخدام عمليات الربط المتعددة. - إنشاء
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) } } }