সংস্করণ ১.২.০ থেকে শুরু করে, নেভিগেশন ৩ আপনার অ্যাপের গন্তব্যস্থলে DeepLinkRequest এবং DeepLinkMatcher ক্লাস ব্যবহার করে ডিপ লিঙ্কিং সমর্থন করে।
আপনার অ্যাপে ডিপ লিঙ্ক সমর্থন করতে, নিম্নলিখিত ধাপগুলি সম্পন্ন করুন:
- আপনার অ্যাপ কোন কোন URI হ্যান্ডেল করতে পারবে তা নির্দিষ্ট করতে আপনার
AndroidManifest.xmlএ ইন্টেন্ট ফিল্টার সংজ্ঞায়িত করুন । - আগত অনুরোধগুলোকে আপনার নেভিগেশন কী-গুলোর সাথে ম্যাপ করতে
DeepLinkMatcherইনস্ট্যান্স তৈরি করুন । - আপনার অ্যাক্টিভিটির
onCreateবাonNewIntentমেথডে আগত অনুরোধগুলো মেলান এবং সেই অনুযায়ী আপনার ব্যাক স্ট্যাক আপডেট করুন।
একটি 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 ক্লাসটি ব্যবহার করুন। এক্সট্রা-এর সংজ্ঞা ও ইনস্ট্যানশিয়েটকে টাইপ-সেফ করার জন্য, লাইব্রেরিটি RequestExtrasKey ইন্টারফেস এবং requestExtras DSL প্রদান করে।
এছাড়াও, লাইব্রেরিটি দুটি অতিরিক্ত কী এবং সংশ্লিষ্ট হেল্পার প্রদান করে:
-
MimeTypeExtrasKey: একটি MIME টাইপStringসংরক্ষণ করতে ব্যবহৃত হয়। -
ActionExtrasKey(শুধুমাত্র অ্যান্ড্রয়েডের জন্য): একটিIntentএর অ্যাকশনStringসংরক্ষণ করতে ব্যবহৃত হয়।
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 ) অপারেটর ব্যবহার করে এক্সট্রাগুলো একত্রিত করতে পারেন।
একটি Intent থেকে একটি DeepLinkRequest তৈরি করুন
অ্যান্ড্রয়েডে, আপনি সরাসরি একটি Intent থেকে একটি DeepLinkRequest তৈরি করতে পারেন। এভাবে তৈরি করা হলে, DeepLinkRequest টি নিম্নোক্তভাবে গঠিত হয়:
-
uriইন্টেন্টেরdataফিল্ড থেকে কপি করা হয়। - নাল না হলে, MIME টাইপ এবং অ্যাকশন এক্সট্রাগুলো সংশ্লিষ্ট ইন্টেন্ট ফিল্ড থেকে সেট করা হয়।
- যেসব
intent.extrasএর মান null নয়, সেগুলোকেDeepLinkRequest.IntentExtrasKeyতে একটিSavedStateহিসেবে সংরক্ষণ করা হয়। -
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 তিনটি বিল্ট-ইন ম্যাচিং টুল প্রদান করে: প্যাটার্ন-ভিত্তিক URI ম্যাচিংয়ের জন্য UriDeepLinkMatcher , সাধারণ লিঙ্কের জন্য StaticKeyDeepLinkMatcher , এবং সিন্থেটিক ব্যাক স্ট্যাক তৈরির জন্য BackStackMatcher । লাইব্রেরিটি এমন সব ব্যবহারের জন্য কাস্টম ম্যাচিং টুলও সমর্থন করে, যা বিল্ট-ইন ম্যাচিং টুলগুলোর আওতাভুক্ত নয়।
আরও তথ্যের জন্য, Create DeepLinkMatchers দেখুন।
ইন্টেন্ট ফিল্টার যোগ করুন
আপনার অ্যাক্টিভিটি শুরু করার জন্য একটি ডিপ লিঙ্ক সক্ষম করতে, আপনাকে অবশ্যই আপনার অ্যাপের AndroidManifest.xml এ সংশ্লিষ্ট <intent-filter> এলিমেন্টগুলো সংজ্ঞায়িত করতে হবে। আরও তথ্যের জন্য, "ইনকামিং লিঙ্কের জন্য ইন্টেন্ট ফিল্টার যোগ করুন" দেখুন।
আগত অনুরোধের সাথে মেলান
আপনার DeepLinkMatcher ইনস্ট্যান্সগুলো তৈরি করার পরে, আপনি আপনার অ্যাক্টিভিটিতে আগত অনুরোধগুলো মেলাতে পারবেন।
আগত অনুরোধটি মেলাতে, নিম্নলিখিত ধাপগুলি সম্পন্ন করুন:
- আপনার
DeepLinkMatcherইনস্ট্যান্সগুলো তৈরি করুন । - আপনার সমস্ত
DeepLinkMatcherইনস্ট্যান্সগুলিকে সুস্পষ্টভাবে অথবা মাল্টিবাইন্ডিং ব্যবহার করে একত্রিত করুন । - আগত
Intentথেকে একটিDeepLinkRequestতৈরি করুন । - অনুরোধটি সমস্ত সম্ভাব্য মিলের সাথে মিলিয়ে দেখুন এবং সেরা মিলটি খুঁজে বের করুন।
- ম্যাচের ফলাফল থেকে ব্যাক স্ট্যাক তৈরি করুন ।
// 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) } } }