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

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

  1. अगर उपयोगकर्ता ने कोई ऐप्लिकेशन चुना है, तो यूआरआई को हैंडल करने वाला वह ऐप्लिकेशन खोलें.
  2. सिर्फ़ वह ऐप्लिकेशन खोलें जो यूआरआई को मैनेज कर सकता है.
  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

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

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