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