डेस्टिनेशन के लिए डीप लिंक बनाना

Android में, डीप लिंक एक ऐसा लिंक होता है जो आपको सीधे किसी ऐप्लिकेशन के किसी खास डेस्टिनेशन पर ले जाता है.

नेविगेशन कॉम्पोनेंट की मदद से, दो तरह के डीप लिंक बनाए जा सकते हैं: एक्सप्लिसिट और इंप्लिसिट.

एक्सप्लिसिट डीप लिंक बनाना

साफ़ तौर पर दिखने वाला डीप लिंक, डीप लिंक का एक उदाहरण है. यह उपयोगकर्ताओं को आपके ऐप्लिकेशन के किसी खास हिस्से पर ले जाने के लिए, PendingIntent का इस्तेमाल करता है. उदाहरण के लिए, किसी सूचना या ऐप्लिकेशन विजेट के हिस्से के तौर पर साफ़ तौर पर दिखने वाला डीप लिंक दिखाया जा सकता है.

जब कोई उपयोगकर्ता साफ़ तौर पर दिए गए डीप लिंक से आपका ऐप्लिकेशन खोलता है, तो टास्क बैक स्टैक को हटा दिया जाता है और उसे डीप लिंक डेस्टिनेशन से बदल दिया जाता है. ग्राफ़ को नेस्ट करने पर, नेस्टिंग के हर लेवल से शुरू होने का डेस्टिनेशन भी स्टैक में जोड़ दिया जाता है. इसका मतलब है कि हैरारकी में मौजूद हर <navigation> एलिमेंट से शुरू होने का डेस्टिनेशन भी स्टैक में जोड़ दिया जाता है. इसका मतलब है कि जब कोई उपयोगकर्ता डीप लिंक डेस्टिनेशन से 'वापस जाएं' बटन दबाता है, तो वह नेविगेशन स्टैक पर वापस उसी तरह से जाता है जैसे कि वह आपके ऐप्लिकेशन में उसके एंट्री पॉइंट से आया हो.

PendingIntent बनाने के लिए, NavDeepLinkBuilder क्लास का इस्तेमाल किया जा सकता है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है. ध्यान दें कि अगर दिया गया कॉन्टेक्स्ट Activity नहीं है, तो कंस्ट्रक्टर, डिफ़ॉल्ट गतिविधि के तौर पर PackageManager.getLaunchIntentForPackage() का इस्तेमाल करता है. हालांकि, ऐसा तब ही होता है, जब PackageManager.getLaunchIntentForPackage() उपलब्ध हो.

Kotlin

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

Java

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

Java

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

Java

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 आपके ऐप्लिकेशन को उस डेस्टिनेशन पर खोल सकता है.

डीप लिंक को यूआरआई, इंटेंट ऐक्शन, और एमआईएम टाइप के हिसाब से मैच किया जा सकता है. किसी एक डीप लिंक के लिए, कई मैच टाइप तय किए जा सकते हैं. हालांकि, ध्यान दें कि यूआरआई आर्ग्युमेंट मैचिंग को प्राथमिकता दी जाती है. इसके बाद, ऐक्शन और फिर एमआईएमई टाइप को प्राथमिकता दी जाती है.

यहां डीप लिंक का एक उदाहरण दिया गया है, जिसमें यूआरआई, ऐक्शन, और एमआईएम टाइप शामिल है:

<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. इसके बाद, डीप लिंक जोड़ें डायलॉग बॉक्स में, अपने डीप लिंक की जानकारी डालें.

    यहां दी गई बातों का ध्यान रखें:

    • बिना स्कीम वाले यूआरआई को एचटीटीपी या एचटीटीपीएस माना जाता है. उदाहरण के लिए, 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 ऊपर दिए गए पैटर्न से मेल नहीं खाता, क्योंकि ज़रूरी पाथ पैरामीटर नहीं दिया गया है.
    • अतिरिक्त क्वेरी पैरामीटर से, डीप लिंक यूआरआई के मैच होने पर कोई असर नहीं पड़ता. उदाहरण के लिए, http://www.example.com/users/{id}, http://www.example.com/users/4?extraneousParam=7 से मैच करता है, भले ही extraneousParam को यूआरआई पैटर्न में तय न किया गया हो.
  4. (ज़रूरी नहीं) Google से यह पुष्टि करने के लिए कहें कि आप यूआरआई के मालिक हैं. इसके लिए, अपने-आप पुष्टि करें को चुनें. ज़्यादा जानकारी के लिए, Android ऐप्लिकेशन के लिंक की पुष्टि करना लेख पढ़ें.

  5. जोड़ें पर क्लिक करें. चुने गए डेस्टिनेशन के ऊपर एक लिंक आइकॉन दिखता है. इससे पता चलता है कि डेस्टिनेशन में डीप लिंक है.

  6. एक्सएमएल व्यू पर टॉगल करने के लिए, कोड टैब पर क्लिक करें. डेस्टिनेशन में नेस्ट किया गया <deepLink> एलिमेंट जोड़ा गया है:

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

इंप्लिसिट डीप लिंकिंग की सुविधा चालू करने के लिए, आपको अपने ऐप्लिकेशन की 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> एलिमेंट का स्टार्ट डेस्टिनेशन भी स्टैक में जोड़ दिया जाता है. इसका मतलब है कि जब कोई उपयोगकर्ता डीप लिंक डेस्टिनेशन से 'वापस जाएं' बटन दबाता है, तो वह नेविगेशन स्टैक पर वापस उसी तरह से नेविगेट करता है जैसे कि वह आपके ऐप्लिकेशन में उसके एंट्री पॉइंट से आया हो.
  • अगर फ़्लैग सेट नहीं है, तो आप उस पिछले ऐप्लिकेशन के टास्क स्टैक पर बने रहेंगे जहां इंप्लिसिट डीप लिंक ट्रिगर हुआ था. इस मामले में, 'वापस जाएं' बटन आपको पिछले ऐप्लिकेशन पर ले जाता है. वहीं, 'अप' बटन, नेविगेशन ग्राफ़ में हैरारकी वाले पैरंट डेस्टिनेशन पर आपके ऐप्लिकेशन का टास्क शुरू करता है.

डीप लिंक मैनेज करना

हमारा सुझाव है कि नेविगेशन का इस्तेमाल करते समय, standard के लिए हमेशा डिफ़ॉल्ट launchMode का इस्तेमाल करें. standard लॉन्च मोड का इस्तेमाल करने पर, नेविगेशन Intent में मौजूद किसी भी एक्सप्लिसिट या इंप्लिसिट डीप लिंक को प्रोसेस करने के लिए, handleDeepLink() को कॉल करके, डीप लिंक को अपने-आप मैनेज करता है. हालांकि, अगर singleTop जैसे किसी अन्य launchMode का इस्तेमाल करते समय, Activity का फिर से इस्तेमाल किया जाता है, तो यह अपने-आप नहीं होता. इस मामले में, onNewIntent() में handleDeepLink() को मैन्युअल तरीके से कॉल करना ज़रूरी है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:

Kotlin

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

Java

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

अन्य संसाधन

नेविगेशन के बारे में ज़्यादा जानने के लिए, यहां दिए गए लेख पढ़ें.

कोडलैब

वीडियो