গন্তব্যের জন্য ডিপ লিংক তৈরি করুন

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

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

এক্সপ্লিসিট ডিপ লিংক তৈরি করা

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

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

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

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

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)
}

XML গ্রাফ

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

Kotlin

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 অন্য কোনও অ্যাক্টিভিটিতে থাকলে, ডিপ লিঙ্ক বিল্ডার তৈরি করার সময় আপনাকে অবশ্যই এর কম্পোনেন্টের নাম উল্লেখ করতে হবে:

Kotlin

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 থাকলে, আপনি সরাসরি বিল্ডারকে এটি পাস করতে পারবেন:

Kotlin

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() ব্যবহার করে ডিপ লিঙ্কও তৈরি করতে পারবেন।

ইমপ্লিসিট ডিপ লিংক তৈরি করা

ইমপ্লিসিট ডিপ লিংক কোনও অ্যাপের নির্দিষ্ট গন্তব্যকে বোঝায়। ডিপ লিংক চালু করা হলে—যেমন, ব্যবহারকারী কোনও লিংকে ক্লিক করলে—Android তখন আপনার অ্যাপের সংশ্লিষ্ট গন্তব্য খুলতে পারে।

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

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

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

লিখুন

Navigation Compose-এ, আপনি deepLinks প্যারামিটার ব্যবহার করে composable() ডেস্টিনেশন বিল্ডারের অংশ হিসেবে ডিপ লিঙ্ক নির্ধারণ করতে পারবেন। এটি 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

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>

XML গ্রাফ

XML-ভিত্তিক গ্রাফে ইমপ্লিসিট ডিপ লিঙ্ক তৈরি করতে, আপনি সরাসরি XML-এ <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 ম্যাচ করে।
    • ডিফল্ট বা নালেবেল ভ্যালু সহ সংজ্ঞায়িত ভেরিয়েবলের জন্য কোয়েরি প্যারামিটার প্লেসহোল্ডার মিলতে হবে এমন কোনও বাধ্যবাধকতা নেই। যেমন, 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 মিলে যায়, যদিও extraneousParam URI প্যাটার্নে উল্লেখ করা নেই।
  4. (ঐচ্ছিক) আপনিই যে URI-এর মালিক তা Google-কে দিয়ে যাচাই করিয়ে নিতে অটোমেটিক যাচাই করুন বিকল্পে টিকচিহ্ন দিন। আরও তথ্যের জন্য, Android অ্যাপ লিঙ্ক যাচাই করুন নিবন্ধটি দেখুন।

  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() ম্যানুয়ালি কল করা প্রয়োজন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

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

জাভা

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