ऐप्लिकेशन के कॉन्टेंट के डीप लिंक बनाना

जब क्लिक किए गए लिंक या प्रोग्राम के हिसाब से किए गए अनुरोध से वेब यूआरआई इंटेंट शुरू होता है, तो Android सिस्टम यहां दी गई कार्रवाइयों को क्रम से तब तक करता है, जब तक अनुरोध पूरा नहीं हो जाता:

  1. अगर उपयोगकर्ता ने कोई ऐप्लिकेशन चुना है, तो उस ऐप्लिकेशन को खोलें.
  2. URI को मैनेज करने वाला सिर्फ़ एक ऐप्लिकेशन खोलें.
  3. इससे उपयोगकर्ता को डायलॉग से कोई ऐप्लिकेशन चुनने की अनुमति मिलती है.

अपने कॉन्टेंट के लिंक बनाने और उनकी जांच करने के लिए, यह तरीका अपनाएं. Android ऐप्लिकेशन के लिंक जोड़ने के लिए, Android Studio में ऐप्लिकेशन लिंक असिस्टेंट का इस्तेमाल भी किया जा सकता है.

ध्यान दें: Android 12 (एपीआई लेवल 31) से, सामान्य वेब इंटेंट को आपके ऐप्लिकेशन में मौजूद गतिविधि के तौर पर सिर्फ़ तब हल किया जाता है, जब आपके ऐप्लिकेशन को उस वेब इंटेंट में शामिल किए गए डोमेन के लिए मंज़ूरी मिली हो. अगर आपके ऐप्लिकेशन को डोमेन के लिए मंज़ूरी नहीं मिली है, तो वेब इंटेंट, उपयोगकर्ता के डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन पर रीडायरेक्ट हो जाएगा.

आने वाले लिंक के लिए इंटेंट फ़िल्टर जोड़ना

अपने ऐप्लिकेशन के कॉन्टेंट का लिंक बनाने के लिए, एक इंटेंट फ़िल्टर जोड़ें. इसमें ये एलिमेंट और एट्रिब्यूट वैल्यू आपके मेनिफ़ेस्ट में शामिल हों:

<action>
ACTION_VIEW इंटेंट ऐक्शन तय करें, ताकि इंटेंट फ़िल्टर को Google Search से ऐक्सेस किया जा सके.
<data>
एक या उससे ज़्यादा <data> टैग जोड़ें. इनमें से हर टैग, यूआरआई फ़ॉर्मैट को दिखाता है, जो गतिविधि पर ले जाता है. कम से कम, <data> टैग में android:scheme एट्रिब्यूट शामिल होना चाहिए.

गतिविधि के लिए स्वीकार किए जाने वाले यूआरआई के टाइप को और बेहतर बनाने के लिए, ज़्यादा एट्रिब्यूट जोड़े जा सकते हैं. उदाहरण के लिए, आपके पास ऐसी कई गतिविधियां हो सकती हैं जो एक जैसे यूआरआई स्वीकार करती हैं. हालांकि, वे सिर्फ़ पाथ के नाम के आधार पर अलग-अलग होती हैं. ऐसे में, android:path एट्रिब्यूट या इसके pathPattern या pathPrefix वैरिएंट का इस्तेमाल करके यह तय करें कि सिस्टम को अलग-अलग यूआरआई पाथ के लिए कौनसी गतिविधि खोलनी चाहिए.

<category>
BROWSABLE कैटगरी शामिल करें. इसकी ज़रूरत इसलिए होती है, ताकि वेब ब्राउज़र से इंटेंट फ़िल्टर को ऐक्सेस किया जा सके. इसके बिना, ब्राउज़र में किसी लिंक पर क्लिक करने से आपका ऐप्लिकेशन नहीं खुलेगा.

DEFAULT कैटगरी भी शामिल करें. इससे आपका ऐप्लिकेशन, इंप्लिसिट इंटेंट का जवाब दे पाता है. इसके बिना, गतिविधि सिर्फ़ तब शुरू की जा सकती है, जब इंटेंट में आपके ऐप्लिकेशन कॉम्पोनेंट का नाम दिया गया हो.

यहां दिए गए एक्सएमएल स्निपेट में, डीप लिंकिंग के लिए मेनिफ़ेस्ट में इंटेंट फ़िल्टर तय करने का तरीका बताया गया है. यूआरआई “example://gizmos” और “http://www.example.com/gizmos”, दोनों इस गतिविधि पर रीडायरेक्ट करते हैं.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

ध्यान दें कि दोनों इंटेंट फ़िल्टर में सिर्फ़ <data> एलिमेंट का अंतर है. हालांकि, एक ही फ़िल्टर में कई <data> एलिमेंट शामिल किए जा सकते हैं, लेकिन अगर आपको यूनीक यूआरएल (जैसे कि scheme और host का कोई खास कॉम्बिनेशन) के बारे में बताना है, तो अलग-अलग फ़िल्टर बनाएं. ऐसा इसलिए, क्योंकि एक ही इंटेंट फ़िल्टर में मौजूद कई <data> एलिमेंट को एक साथ मर्ज कर दिया जाता है, ताकि उनके कंबाइंड एट्रिब्यूट के सभी वर्शन को शामिल किया जा सके. उदाहरण के लिए, यहां दिए गए तरीके अपनाएं:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

ऐसा लग सकता है कि यह सिर्फ़ https://www.example.com और app://open.my.app के साथ काम करता है. हालांकि, यह इन दोनों के साथ-साथ इन पर भी काम करता है: app://www.example.com और https://open.my.app.

चेतावनी: अगर कई गतिविधियों में ऐसे इंटेंट फ़िल्टर शामिल हैं जो पुष्टि किए गए एक ही Android ऐप्लिकेशन लिंक पर ले जाते हैं, तो इस बात की कोई गारंटी नहीं है कि लिंक को कौनसी गतिविधि हैंडल करेगी.

ऐप्लिकेशन मेनिफ़ेस्ट में, गतिविधि के कॉन्टेंट के लिए यूआरआई वाले इंटेंट फ़िल्टर जोड़ने के बाद, Android किसी भी Intent को रनटाइम में आपके ऐप्लिकेशन पर रीडायरेक्ट कर सकता है. इसके लिए, यूआरआई का मेल खाना ज़रूरी है.

इंटेंट फ़िल्टर तय करने के बारे में ज़्यादा जानने के लिए, अन्य ऐप्लिकेशन को आपकी गतिविधि शुरू करने की अनुमति देना लेख पढ़ें.

आने वाले इंटेंट का डेटा पढ़ना

सिस्टम, इंटेंट फ़िल्टर के ज़रिए आपकी गतिविधि शुरू करता है. इसके बाद, आपको Intent से मिले डेटा का इस्तेमाल करके यह तय करना होता है कि आपको क्या रेंडर करना है. इनकमिंग Intent से जुड़े डेटा और कार्रवाई को वापस पाने के लिए, getData() और getAction() तरीकों को कॉल करें. गतिविधि की लाइफ़साइकल के दौरान, इन तरीकों को कभी भी कॉल किया जा सकता है. हालांकि, आपको आम तौर पर ऐसा शुरुआती कॉलबैक के दौरान करना चाहिए. जैसे, onCreate() या onStart().

यहां एक स्निपेट दिया गया है, जिसमें Intent से डेटा वापस पाने का तरीका बताया गया है:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

उपयोगकर्ता को बेहतर अनुभव देने के लिए, इन सबसे सही तरीकों का पालन करें:

  • डीप लिंक ऐसा होना चाहिए जो उपयोगकर्ताओं को सीधे कॉन्टेंट पर ले जाए. इसके लिए, किसी प्रॉम्प्ट, इंटरस्टीशियल पेज या लॉगिन की ज़रूरत नहीं होनी चाहिए. पक्का करें कि उपयोगकर्ताओं को ऐप्लिकेशन का कॉन्टेंट दिखे, भले ही उन्होंने पहले कभी ऐप्लिकेशन न खोला हो. उपयोगकर्ताओं को बाद के इंटरैक्शन पर या लॉन्चर से ऐप्लिकेशन खोलने पर प्रॉम्प्ट किया जा सकता है.
  • बैक और अप बटन की मदद से नेविगेशन में बताए गए डिज़ाइन के दिशा-निर्देशों का पालन करें. इससे, डीप लिंक के ज़रिए आपके ऐप्लिकेशन में आने के बाद, उपयोगकर्ताओं को बैकवर्ड नेविगेशन के लिए वही अनुभव मिलेगा जो वे चाहते हैं.

अपने डीप लिंक की जांच करना

Android Debug Bridge को ऐक्टिविटी मैनेजर (am) टूल के साथ इस्तेमाल किया जा सकता है. इससे यह जांच की जा सकती है कि डीप लिंकिंग के लिए तय किए गए इंटेंट फ़िल्टर यूआरआई, ऐप्लिकेशन की सही ऐक्टिविटी पर ले जाते हैं या नहीं. किसी डिवाइस या एम्युलेटर के लिए, adb कमांड का इस्तेमाल किया जा सकता है.

adb की मदद से, इंटेंट फ़िल्टर यूआरआई की जांच करने का सामान्य सिंटैक्स यह है:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

उदाहरण के लिए, नीचे दिया गया निर्देश, टारगेट ऐप्लिकेशन की उस गतिविधि को देखने की कोशिश करता है जो दिए गए यूआरआई से जुड़ी है.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

मेनिफ़ेस्ट में किए गए एलान और ऊपर सेट किए गए इंटेंट हैंडलर से, आपके ऐप्लिकेशन और किसी वेबसाइट के बीच कनेक्शन तय होता है. साथ ही, यह भी तय होता है कि आने वाले लिंक का क्या करना है. हालांकि, अगर आपको सिस्टम से यह अनुरोध करना है कि वह आपके ऐप्लिकेशन को यूआरआई के किसी सेट के लिए डिफ़ॉल्ट हैंडलर के तौर पर इस्तेमाल करे, तो आपको यह भी अनुरोध करना होगा कि सिस्टम इस कनेक्शन की पुष्टि करे. अगले लेख में, पुष्टि करने का तरीका बताया गया है.

इंटेंट और ऐप्लिकेशन लिंक के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें: