একটি গন্তব্যের জন্য একটি গভীর লিঙ্ক তৈরি করুন

অ্যান্ড্রয়েডে, ডিপ লিঙ্ক হলো এমন একটি লিঙ্ক যা আপনাকে অ্যাপের মধ্যে সরাসরি কোনো নির্দিষ্ট গন্তব্যে নিয়ে যায়।

আপনি আপনার অ্যাপে দুই ধরনের ডিপ লিঙ্ক সমর্থন করতে পারেন: এক্সপ্লিসিট এবং ইমপ্লিসিট । আপনার অ্যাপ কোন ধরনের গ্রাফ— XML or programmatic ব্যবহার করে, তার উপর নির্ভর করে ডিপ লিঙ্ক বাস্তবায়নের পদ্ধতি ভিন্ন হয়।

একটি সুস্পষ্ট ডিপ লিঙ্ক তৈরি করুন

একটি এক্সপ্লিসিট ডিপ লিঙ্ক হলো ডিপ লিঙ্কের একটি একক উদাহরণ, যা একটি PendingIntent ব্যবহার করে ব্যবহারকারীদের আপনার অ্যাপের মধ্যে একটি নির্দিষ্ট স্থানে নিয়ে যায়। উদাহরণস্বরূপ, আপনি একটি নোটিফিকেশন বা অ্যাপ উইজেটের অংশ হিসেবে একটি এক্সপ্লিসিট ডিপ লিঙ্ক প্রদর্শন করতে পারেন।

যখন কোনো ব্যবহারকারী একটি সুস্পষ্ট ডিপ লিঙ্কের মাধ্যমে আপনার অ্যাপ খোলেন, তখন টাস্ক ব্যাক স্ট্যাকটি খালি হয়ে যায় এবং তার জায়গায় ডিপ লিঙ্কের গন্তব্যটি যুক্ত হয়। গ্রাফ নেস্ট করার সময়, নেস্টিংয়ের প্রতিটি স্তরের শুরুর গন্তব্য—অর্থাৎ, হায়ারার্কির প্রতিটি <navigation> এলিমেন্টের শুরুর গন্তব্য—স্ট্যাকে যুক্ত হয়। এর মানে হলো, যখন কোনো ব্যবহারকারী একটি ডিপ লিঙ্কের গন্তব্য থেকে ব্যাক বাটন চাপেন, তখন তিনি নেভিগেশন স্ট্যাকের ওপরের দিকে ঠিক সেভাবেই ফিরে যান, যেন তিনি আপনার অ্যাপের এন্ট্রি পয়েন্ট থেকে প্রবেশ করেছেন।

প্রোগ্রাম্যাটিক গ্রাফ

যদি আপনার নেভিগেশন গ্রাফ প্রোগ্রাম্যাটিকভাবে সংজ্ঞায়িত করা হয় (যেমনটি নেভিগেশন কম্পোজ বা কোটলিন ডিএসএল-এ সাধারণত হয়ে থাকে), তাহলে আমরা ডিপ লিঙ্ক PendingIntent ) তৈরি করার জন্য TaskStackBuilder ব্যবহার করার পরামর্শ দিই।

val id = "exampleId"
val context = LocalContext.current
val deepLinkIntent = Intent(
    Intent.ACTION_VIEW,
    "https://www.example.com/profile/$id".toUri(),
    context,
    MyActivity::class.java
)

val pendingIntent: PendingIntent? = TaskStackBuilder.create(context).run {
    addNextIntentWithParentStack(deepLinkIntent)
    getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
}

এক্সএমএল গ্রাফ

আপনি NavDeepLinkBuilder ক্লাস ব্যবহার করে একটি PendingIntent তৈরি করতে পারেন, যেমনটি নীচের উদাহরণে দেখানো হয়েছে। মনে রাখবেন যে, যদি প্রদত্ত কনটেক্সটটি একটি Activity না হয়, তাহলে কনস্ট্রাক্টরটি ডিফল্ট অ্যাক্টিভিটি হিসেবে PackageManager.getLaunchIntentForPackage() ব্যবহার করে, যদি তা উপলব্ধ থাকে।

কোটলিন

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent()

জাভা

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent();

ডিফল্টরূপে, NavDeepLinkBuilder আপনার অ্যাপের ম্যানিফেস্টে ঘোষিত ডিফল্ট লঞ্চ Activity আপনার সুস্পষ্ট ডিপ লিঙ্কটি চালু করে। যদি আপনার NavHost অন্য কোনো অ্যাক্টিভিটিতে থাকে, তাহলে ডিপ লিঙ্ক বিল্ডার তৈরি করার সময় আপনাকে অবশ্যই এর কম্পোনেন্টের নামটি উল্লেখ করতে হবে:

কোটলিন

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(DestinationActivity::class.java)
    .createPendingIntent()

জাভা

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(DestinationActivity.class)
        .createPendingIntent();

আপনার যদি একটি ComponentName থাকে, তাহলে আপনি সেটি সরাসরি বিল্ডারে পাঠাতে পারেন:

কোটলিন

val componentName = ...

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.android)
    .setArguments(args)
    .setComponentName(componentName)
    .createPendingIntent()

জাভা

ComponentName componentName = ...;

PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
        .setGraph(R.navigation.nav_graph)
        .setDestination(R.id.android)
        .setArguments(args)
        .setComponentName(componentName)
        .createPendingIntent();

আপনার যদি আগে থেকেই একটি NavController থাকে, তাহলে আপনি NavController.createDeepLink() ব্যবহার করে একটি ডিপ লিঙ্কও তৈরি করতে পারেন।

একটি অন্তর্নিহিত গভীর লিঙ্ক তৈরি করুন

একটি ইমপ্লিসিট ডিপ লিঙ্ক অ্যাপের মধ্যে একটি নির্দিষ্ট গন্তব্যকে নির্দেশ করে। যখন ডিপ লিঙ্কটি সক্রিয় হয়—উদাহরণস্বরূপ, যখন কোনো ব্যবহারকারী একটি লিঙ্কে ক্লিক করেন—তখন অ্যান্ড্রয়েড আপনার অ্যাপটিকে সেই সংশ্লিষ্ট গন্তব্যে খুলতে পারে।

ডিপ লিঙ্ক URI, ইনটেন্ট অ্যাকশন এবং MIME টাইপের মাধ্যমে মেলানো যায়। আপনি একটিমাত্র ডিপ লিঙ্কের জন্য একাধিক ম্যাচ টাইপ নির্দিষ্ট করতে পারেন, কিন্তু মনে রাখবেন যে URI আর্গুমেন্ট মেলানোর বিষয়টিকে প্রথমে অগ্রাধিকার দেওয়া হয়, এরপর অ্যাকশন এবং তারপর MIME টাইপ।

প্রোগ্রাম্যাটিক গ্রাফ

আপনি যদি প্রোগ্রাম্যাটিকভাবে (নেভিগেশন কম্পোজ বা কোটলিন ডিএসএল ব্যবহার করে) আপনার নেভিগেশন গ্রাফ নির্ধারণ করেন, তাহলে আপনি কোডের মাধ্যমে ডিপ লিঙ্কগুলো সংজ্ঞায়িত করেন।

রচনা করুন

ন্যাভিগেশন কম্পোজে, আপনি composable() ডেস্টিনেশন বিল্ডারের অংশ হিসেবে ` deepLinks প্যারামিটার ব্যবহার করে ডিপ লিঙ্ক সংজ্ঞায়িত করতে পারেন। এটি NavDeepLink অবজেক্টের একটি তালিকা গ্রহণ করে, যা আপনি ` navDeepLink() ফাংশন ব্যবহার করে তৈরি করতে পারেন:

@Serializable
data class Profile(val id: String)

val uri = "https://www.example.com"

composable<Profile>(
  deepLinks = listOf(
    navDeepLink<Profile>(basePath = "$uri/profile")
  )
) { backStackEntry ->
  val profile: Profile = backStackEntry.toRoute()
  ProfileScreen(id = profile.id)
}

কোটলিন ডিএসএল

Kotlin DSL ব্যবহার করার সময়, আপনি ডেস্টিনেশন ব্লকের মধ্যে deepLink() বিল্ডার ফাংশন ব্যবহার করে ডিপ লিঙ্ক সংজ্ঞায়িত করতে পারেন:

@Serializable
data class Profile(val id: String)

val uri = "https://www.example.com"

fragment<ProfileFragment, Profile> {
    deepLink<Profile>(basePath = "$uri/profile")
}

প্রোগ্রাম্যাটিক গ্রাফের জন্য ইন্টেন্ট ফিল্টার যোগ করুন

যেহেতু প্রোগ্রাম্যাটিক নেভিগেশন গ্রাফ রানটাইমে তৈরি হয়, তাই নেভিগেশন কম্পোনেন্ট আপনার AndroidManifest.xml এ স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট <intent-filter> এলিমেন্টগুলো তৈরি করতে পারে না। এর পরিবর্তে, আপনাকে ম্যানুয়ালি উপযুক্ত <intent-filter> এলিমেন্টগুলো যোগ করতে হবে।

পূর্ববর্তী উদাহরণগুলিতে ডিপ লিঙ্ক সক্রিয় করতে, আপনার ম্যানিফেস্টের সংশ্লিষ্ট <activity> এলিমেন্টের ভিতরে নিম্নলিখিতটি যোগ করুন:

<activity …>
  <intent-filter>
    ...
    <data android:scheme="https" android:host="www.example.com" />
  </intent-filter>
</activity>

এক্সএমএল গ্রাফ

এক্সএমএল-ভিত্তিক গ্রাফে একটি অন্তর্নিহিত ডিপ লিঙ্ক তৈরি করতে, আপনি সরাসরি এক্সএমএল-এ <deepLink> এলিমেন্টটি সংজ্ঞায়িত করতে পারেন অথবা নেভিগেশন এডিটর ব্যবহার করতে পারেন।

এখানে একটি ডিপ লিঙ্কের উদাহরণ দেওয়া হলো, যাতে একটি URI, একটি অ্যাকশন এবং একটি MIME টাইপ রয়েছে:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          tools:layout="@layout/a">
        <deepLink app:uri="www.example.com"
                app:action="android.intent.action.MY_ACTION"
                app:mimeType="type/subtype"/>
</fragment>

এছাড়াও আপনি নেভিগেশন এডিটর ব্যবহার করে নিম্নলিখিত উপায়ে কোনো গন্তব্যে একটি ইমপ্লিসিট ডিপ লিঙ্ক তৈরি করতে পারেন:

  1. নেভিগেশন এডিটরের ডিজাইন ট্যাবে, ডিপ লিঙ্কের জন্য গন্তব্য নির্বাচন করুন।
  2. অ্যাট্রিবিউটস প্যানেলের ডিপ লিঙ্কস সেকশনে থাকা + চিহ্নে ক্লিক করুন।
  3. প্রদর্শিত 'অ্যাড ডিপ লিঙ্ক' ডায়ালগ বক্সে আপনার ডিপ লিঙ্কের তথ্য প্রবেশ করান।

    নিম্নলিখিত বিষয়গুলো লক্ষ্য করুন:

    • স্কিম ছাড়া URI-গুলোকে http অথবা https হিসেবে ধরে নেওয়া হয়। উদাহরণস্বরূপ, www.google.com , http://www.google.com এবং https://www.google.com উভয়ের সাথেই মেলে।
    • {placeholder_name} ফর্মের পাথ প্যারামিটার প্লেসহোল্ডারগুলো এক বা একাধিক অক্ষরের সাথে মেলে। উদাহরণস্বরূপ, http://www.example.com/users/{id} সাথে http://www.example.com/users/4 মেলে। নেভিগেশন কম্পোনেন্টটি ডিপ লিঙ্কের গন্তব্যের জন্য সংজ্ঞায়িত আর্গুমেন্টগুলোর সাথে প্লেসহোল্ডারের নাম মিলিয়ে প্লেসহোল্ডার ভ্যালুগুলোকে উপযুক্ত টাইপে পার্স করার চেষ্টা করে। যদি একই নামের কোনো আর্গুমেন্ট সংজ্ঞায়িত না থাকে, তাহলে আর্গুমেন্ট ভ্যালুর জন্য একটি ডিফল্ট String টাইপ ব্যবহার করা হয়। আপনি ০ বা তার বেশি অক্ষর মেলানোর জন্য .* ওয়াইল্ডকার্ড ব্যবহার করতে পারেন।
    • কোয়েরি প্যারামিটার প্লেসহোল্ডারগুলো পাথ প্যারামিটারের পরিবর্তে অথবা এর সাথে একত্রে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, http://www.example.com/users/{id}?myarg={myarg} লিঙ্কটি http://www.example.com/users/4?myarg=28 সাথে মিলে যায়।
    • ডিফল্ট বা নাল (nullable) মান দিয়ে সংজ্ঞায়িত ভেরিয়েবলের জন্য কোয়েরি প্যারামিটার প্লেসহোল্ডারগুলো মেলানোর প্রয়োজন নেই। উদাহরণস্বরূপ, http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} http://www.example.com/users/4?arg2=28 অথবা http://www.example.com/users/4?arg1=7 সাথে মেলে। পাথ প্যারামিটারের ক্ষেত্রে বিষয়টি এমন নয়। উদাহরণস্বরূপ, http://www.example.com/users?arg1=7&arg2=28 উপরের প্যাটার্নটির সাথে মেলে না, কারণ প্রয়োজনীয় পাথ প্যারামিটারটি সরবরাহ করা হয়নি।
    • অপ্রয়োজনীয় কোয়েরি প্যারামিটার ডিপ লিঙ্ক URI ম্যাচিংকে প্রভাবিত করে না। উদাহরণস্বরূপ, http://www.example.com/users/{id} লিঙ্কটি http://www.example.com/users/4?extraneousParam=7 সাথে মিলে যায়, যদিও URI প্যাটার্নে extraneousParam সংজ্ঞায়িত করা নেই।
  4. (ঐচ্ছিক) আপনিই যে URI-টির মালিক, তা Google-কে দিয়ে যাচাই করানোর জন্য 'অটো ভেরিফাই' বিকল্পটি চেক করুন। আরও তথ্যের জন্য, 'অ্যান্ড্রয়েড অ্যাপ লিঙ্ক যাচাই করুন' দেখুন।

  5. যোগ করুন -এ ক্লিক করুন। একটি লিঙ্ক আইকন। নির্বাচিত গন্তব্যটির উপরে এটি প্রদর্শিত হয়, যা নির্দেশ করে যে সেই গন্তব্যটিতে একটি ডিপ লিঙ্ক রয়েছে।

  6. XML ভিউতে যেতে কোড ট্যাবে ক্লিক করুন। গন্তব্যে একটি নেস্টেড <deepLink> এলিমেন্ট যোগ করা হয়েছে:

    <deepLink app:uri="https://www.google.com" />
    

XML-ভিত্তিক গ্রাফের জন্য ইমপ্লিসিট ডিপ লিঙ্কিং সক্রিয় করতে, আপনাকে আপনার অ্যাপের manifest.xml ফাইলে কিছু সংযোজন করতে হবে। একটি অ্যাক্টিভিটিতে একটিমাত্র <nav-graph> এলিমেন্ট যোগ করুন যা একটি বিদ্যমান নেভিগেশন গ্রাফকে নির্দেশ করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application ... >

        <activity name=".MainActivity" ...>
            ...

            <nav-graph android:value="@navigation/nav_graph" />

            ...

        </activity>
    </application>
</manifest>

আপনার প্রজেক্ট বিল্ড করার সময়, নেভিগেশন কম্পোনেন্টটি নেভিগেশন গ্রাফের সমস্ত ডিপ লিঙ্কের সাথে মেলানোর জন্য <nav-graph> এলিমেন্টটিকে জেনারেটেড <intent-filter> এলিমেন্ট দিয়ে প্রতিস্থাপন করে।

অন্তর্নিহিত গভীর লিঙ্ক এবং ব্যাক স্ট্যাক

একটি ইমপ্লিসিট ডিপ লিঙ্ক ট্রিগার করার সময়, ব্যাক স্ট্যাকের অবস্থা নির্ভর করে ইমপ্লিসিট Intent Intent.FLAG_ACTIVITY_NEW_TASK ফ্ল্যাগ দিয়ে চালু করা হয়েছিল কিনা তার উপর:

  • যদি ফ্ল্যাগটি সেট করা থাকে, তাহলে টাস্ক ব্যাক স্ট্যাকটি খালি হয়ে যায় এবং এর জায়গায় ডিপ লিঙ্ক ডেস্টিনেশনটি যুক্ত হয়। সুস্পষ্ট ডিপ লিঙ্কিং- এর মতোই, গ্রাফ নেস্ট করার সময়, নেস্টিং-এর প্রতিটি স্তরের শুরুর ডেস্টিনেশন—অর্থাৎ, হায়ারার্কির প্রতিটি <navigation> এলিমেন্টের শুরুর ডেস্টিনেশন—স্ট্যাকে যুক্ত হয়। এর মানে হলো, যখন কোনো ব্যবহারকারী একটি ডিপ লিঙ্ক ডেস্টিনেশন থেকে ব্যাক বাটন চাপেন, তখন তিনি নেভিগেশন স্ট্যাকের ওপরের দিকে ঠিক সেভাবেই ফিরে যান, যেন তিনি আপনার অ্যাপের এন্ট্রি পয়েন্ট থেকে প্রবেশ করেছেন।
  • যদি ফ্ল্যাগটি সেট করা না থাকে, তাহলে আপনি পূর্ববর্তী অ্যাপের টাস্ক স্ট্যাকেই থেকে যাবেন, যেখান থেকে ইমপ্লিসিট ডিপ লিঙ্কটি ট্রিগার হয়েছিল। এক্ষেত্রে, 'ব্যাক' বাটনটি আপনাকে পূর্ববর্তী অ্যাপে ফিরিয়ে নিয়ে যায়, আর 'আপ' বাটনটি আপনার নেভিগেশন গ্রাফের মধ্যে থাকা হায়ারারকিক্যাল প্যারেন্ট ডেস্টিনেশনে আপনার অ্যাপের টাস্কটি চালু করে।

গভীর লিঙ্কগুলি পরিচালনা করুন

নেভিগেশন ব্যবহার করার সময় সর্বদা ডিফল্ট launchMode ' standard ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করা হয়। standard লঞ্চমোড ব্যবহার করার সময়, নেভিগেশন স্বয়ংক্রিয়ভাবে Intent মধ্যে থাকা যেকোনো সুস্পষ্ট বা অন্তর্নিহিত ডিপ লিঙ্ক প্রক্রিয়া করার জন্য handleDeepLink() কল করে। তবে, singleTop মতো কোনো বিকল্প launchMode ব্যবহার করার সময় যদি Activity পুনরায় ব্যবহার করা হয়, তাহলে এটি স্বয়ংক্রিয়ভাবে ঘটে না। এই ক্ষেত্রে, onNewIntent() -এ ম্যানুয়ালি handleDeepLink() কল করা প্রয়োজন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    navController.handleDeepLink(intent)
}

জাভা

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    navController.handleDeepLink(intent);
}