अगर आपका ऐप्लिकेशन ऐसी कार्रवाई कर सकता है जो किसी दूसरे ऐप्लिकेशन के लिए काम की हो सकती है, तो उसे कार्रवाई के अनुरोधों का जवाब देने के लिए तैयार करें. इसके लिए, अपनी ऐक्टिविटी में सही इंटेंट फ़िल्टर तय करें.
उदाहरण के लिए, अगर आपने कोई ऐसा सोशल ऐप्लिकेशन बनाया है जिससे उपयोगकर्ता के दोस्तों के साथ मैसेज या फ़ोटो शेयर किए जा सकते हैं, तो ACTION_SEND इंटेंट को सपोर्ट करें.
इसके बाद, जब उपयोगकर्ता किसी दूसरे ऐप्लिकेशन से "शेयर करें" कार्रवाई शुरू करते हैं, तो आपका ऐप्लिकेशन, चुनने के लिए उपलब्ध विकल्पों वाले डायलॉग में दिखता है. इसे डिसऐंबिग्युएशन डायलॉग भी कहा जाता है. पहली इमेज में दिखाया गया है कि यह डायलॉग कैसा दिखता है.
पहली इमेज. चुनने के लिए उपलब्ध विकल्पों वाला डायलॉग.
अन्य ऐप्लिकेशन को इस तरह आपकी ऐक्टिविटी शुरू करने की अनुमति देने के लिए, आपको अपनी मेनिफ़ेस्ट फ़ाइल में, उससे जुड़े <activity> एलिमेंट के लिए एक <intent-filter>
एलिमेंट जोड़ना होगा.
जब आपका ऐप्लिकेशन किसी डिवाइस पर इंस्टॉल किया जाता है, तो सिस्टम आपके इंटेंट फ़िल्टर की पहचान करता है और जानकारी को इंस्टॉल किए गए सभी ऐप्लिकेशन के इंटेंट के इंटरनल कैटलॉग में जोड़ता है.
जब कोई ऐप्लिकेशन, इंप्लिसिट इंटेंट के साथ startActivity() या startActivityForResult() को कॉल करता है, तो सिस्टम उन ऐक्टिविटी की जांच करता है जो इंटेंट का जवाब दे सकती हैं.
इंटेंट फ़िल्टर जोड़ना
यह तय करने के लिए कि आपकी ऐक्टिविटी किन इंटेंट को हैंडल कर सकती है, जोड़े गए हर इंटेंट फ़िल्टर को, कार्रवाई के टाइप और ऐक्टिविटी के स्वीकार किए जाने वाले डेटा के हिसाब से ज़्यादा से ज़्यादा खास बनाएं.
सिस्टम, किसी दी गई Intent को किसी ऐक्टिविटी पर भेज सकता है. हालांकि, इसके लिए ज़रूरी है कि उस ऐक्टिविटी में
ऐसा इंटेंट फ़िल्टर हो जो Intent ऑब्जेक्ट की इन शर्तों को पूरा करता हो:
- कार्रवाई
- कार्रवाई का नाम बताने वाली स्ट्रिंग. आम तौर पर, यह प्लैटफ़ॉर्म की तय की गई वैल्यू में से कोई एक होती है. जैसे,
ACTION_SENDयाACTION_VIEW.इसे अपने इंटेंट फ़िल्टर में,
<action>एलिमेंट के साथ तय करें. इस एलिमेंट में तय की गई वैल्यू, कार्रवाई के लिए पूरी स्ट्रिंग का नाम होनी चाहिए. यह एपीआई कॉन्स्टैंट नहीं होनी चाहिए. इस पेज पर दिए गए उदाहरणों में यह दिखाया गया है. - डेटा
- इंटेंट से जुड़े डेटा का ब्यौरा.
इसे अपने इंटेंट फ़िल्टर में,
<data>एलिमेंट के साथ तय करें. इस एलिमेंट में एक या उससे ज़्यादा एट्रिब्यूट का इस्तेमाल करके, एमआईएमई टाइप, यूआरआई प्रीफ़िक्स, यूआरआई स्कीम या इनमें से किसी एक और अन्य एट्रिब्यूट का कॉम्बिनेशन तय किया जा सकता है. इससे यह पता चलता है कि किस तरह का डेटा स्वीकार किया जाता है.ध्यान दें: अगर आपको डेटा
Uriके बारे में खास जानकारी देने की ज़रूरत नहीं है, तो सिर्फ़android:mimeTypeएट्रिब्यूट तय करें. जैसे, अगर आपकी ऐक्टिविटी, यूआरआई के बजाय "एक्स्ट्रा" डेटा के किसी अन्य टाइप को हैंडल करती है. इससे यह तय किया जा सकेगा कि आपकी ऐक्टिविटी किस तरह का डेटा हैंडल करती है. जैसे,text/plainयाimage/jpeg. - कैटगरी
- इंटेंट को हैंडल करने वाली ऐक्टिविटी की जानकारी देने का एक और तरीका. आम तौर पर, यह उपयोगकर्ता के जेस्चर या उस जगह से जुड़ी होती है जहां से इसे शुरू किया गया है. सिस्टम, कई अलग-अलग कैटगरी को सपोर्ट करता है. हालांकि, इनमें से ज़्यादातर का इस्तेमाल बहुत कम किया जाता है. हालांकि, सभी इंप्लिसिट इंटेंट, डिफ़ॉल्ट रूप से
CATEGORY_DEFAULTके साथ तय किए जाते हैं.इसे अपने इंटेंट फ़िल्टर में,
<category>एलिमेंट के साथ तय करें.
अपने इंटेंट फ़िल्टर में, यह तय किया जा सकता है कि आपकी ऐक्टिविटी किन शर्तों को स्वीकार करती है
इसके लिए, हर शर्त को <intent-filter>
एलिमेंट में नेस्ट किए गए, उससे जुड़े एक्सएमएल एलिमेंट के साथ तय करें.
उदाहरण के लिए, यहां एक ऐसी ऐक्टिविटी दी गई है जिसमें एक इंटेंट फ़िल्टर है. यह इंटेंट फ़िल्टर, ACTION_SEND इंटेंट को तब हैंडल करता है, जब डेटा का टाइप टेक्स्ट या इमेज होता है:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
सलाह: अगर आपको चुनने के लिए उपलब्ध विकल्पों वाले डायलॉग में दिखने वाला आइकॉन, आपकी ऐक्टिविटी के डिफ़ॉल्ट आइकॉन से अलग चाहिए,
तो android:icon को <intent-filter>
एलिमेंट में जोड़ें.
हर आने वाले इंटेंट में सिर्फ़ एक कार्रवाई और एक डेटा टाइप तय किया जाता है. हालांकि, हर
<intent-filter> में <action>, <category> और <data> एलिमेंट के कई
इंस्टेंस तय किए जा सकते हैं.
अगर कार्रवाई और डेटा की कोई दो जोड़ी, एक-दूसरे से अलग हैं, तो अलग-अलग इंटेंट फ़िल्टर बनाएं. इससे यह तय किया जा सकेगा कि किस डेटा टाइप के साथ कौनसी कार्रवाइयां स्वीकार की जा सकती हैं.
उदाहरण के लिए, मान लें कि आपकी ऐक्टिविटी, ACTION_SEND और ACTION_SENDTO इंटेंट, दोनों के लिए टेक्स्ट और इमेज, दोनों को हैंडल करती है. ऐसे में, आपको दोनों कार्रवाइयों के लिए दो अलग-अलग
इंटेंट फ़िल्टर तय करने होंगे. ऐसा इसलिए, क्योंकि ACTION_SENDTO इंटेंट को, send या sendto यूआरआई स्कीम का इस्तेमाल करके, पाने वाले का पता तय करने के लिए, डेटा Uri का इस्तेमाल करना होगा. इसे यहां दिए गए उदाहरण में दिखाया गया है:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
ध्यान दें: इंप्लिसिट इंटेंट पाने के लिए, आपको इंटेंट फ़िल्टर में CATEGORY_DEFAULT कैटगरी शामिल करनी होगी. startActivity() और startActivityForResult() तरीके, सभी इंटेंट को ऐसे मानते हैं जैसे उनमें CATEGORY_DEFAULT कैटगरी तय की गई हो. अगर आपने इसे अपने इंटेंट फ़िल्टर में तय नहीं किया है, तो कोई भी इंप्लिसिट इंटेंट आपकी ऐक्टिविटी पर रिज़ॉल्व नहीं होगा.
सोशल शेयरिंग की कार्रवाइयां करने वाले ACTION_SEND
इंटेंट भेजने और पाने के बारे में ज़्यादा जानने के लिए, अन्य ऐप्लिकेशन से सामान्य डेटा पाना लेख पढ़ें.
सामान्य डेटा शेयर करना और
फ़ाइलें शेयर करना लेखों में, डेटा शेयर करने के बारे में काम की जानकारी भी देखी जा सकती है.
अपनी ऐक्टिविटी में इंटेंट को हैंडल करना
अपनी ऐक्टिविटी में कौनसी कार्रवाई करनी है, यह तय करने के लिए, उसे शुरू करने के लिए इस्तेमाल किए गए Intent को पढ़ें.
अपनी ऐक्टिविटी शुरू होने पर, उसे शुरू करने वाले
Intent को वापस पाने के लिए, getIntent() को कॉल करें. ऐसा ऐक्टिविटी के लाइफ़साइकल के दौरान कभी भी किया जा सकता है. हालांकि, आम तौर पर ऐसा शुरुआती कॉलबैक के दौरान किया जाता है. जैसे, onCreate() या onStart().
इसे यहां दिए गए उदाहरण में दिखाया गया है:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
नतीजा दिखाना
अगर आपको उस ऐक्टिविटी को कोई नतीजा दिखाना है जिसने आपकी ऐक्टिविटी को शुरू किया है, तो नतीजा कोड और नतीजा Intent तय करने के लिए, setResult() को कॉल करें. जब आपकी कार्रवाई पूरी हो जाती है और उपयोगकर्ता, ओरिजनल ऐक्टिविटी पर वापस आ जाता है, तो अपनी ऐक्टिविटी को बंद करने और खत्म करने के लिए, finish() को कॉल करें. इसे यहां दिए गए उदाहरण में दिखाया गया है:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
नतीजे के साथ, नतीजा कोड हमेशा तय करना ज़रूरी है. आम तौर पर, यह RESULT_OK या RESULT_CANCELED होता है. इसके बाद, ज़रूरत के हिसाब से Intent के साथ अतिरिक्त डेटा दिया जा सकता है.
ध्यान दें: नतीजा, डिफ़ॉल्ट रूप से RESULT_CANCELED पर सेट होता है. इसलिए, अगर उपयोगकर्ता कार्रवाई पूरी करने से पहले और नतीजा सेट करने से पहले, 'वापस जाएं' बटन पर टैप करता है, तो ओरिजनल ऐक्टिविटी को "रद्द किया गया" नतीजा मिलता है.
अगर आपको सिर्फ़ एक ऐसा पूर्णांक दिखाना है जो नतीजे के कई विकल्पों में से किसी एक को दिखाता है, तो नतीजा कोड को 0 से ज़्यादा कोई भी वैल्यू पर सेट किया जा सकता है. अगर नतीजा कोड का इस्तेमाल, पूर्णांक दिखाने के लिए किया जाता है और आपको Intent शामिल करने की ज़रूरत नहीं है, तो setResult() को कॉल किया जा सकता है और सिर्फ़ नतीजा कोड पास किया जा सकता है:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
इस मामले में, नतीजे के कुछ ही विकल्प हो सकते हैं. इसलिए, नतीजा कोड, स्थानीय तौर पर तय किया गया पूर्णांक (0 से ज़्यादा) होता है. यह तब काम करता है, जब अपने ऐप्लिकेशन में किसी ऐक्टिविटी को नतीजा दिखाया जाता है. ऐसा इसलिए, क्योंकि नतीजा पाने वाली ऐक्टिविटी, नतीजा कोड की वैल्यू तय करने के लिए, सार्वजनिक कॉन्स्टैंट का रेफ़रंस दे सकती है.
ध्यान दें: यह जांचने की ज़रूरत नहीं है कि आपकी ऐक्टिविटी, startActivity() या startActivityForResult() से शुरू की गई थी या नहीं. अगर आपकी ऐक्टिविटी को शुरू करने वाले इंटेंट को किसी नतीजे की उम्मीद हो सकती है, तो सिर्फ़ setResult() को कॉल करें. अगर ओरिजनल ऐक्टिविटी ने startActivityForResult() को कॉल किया है, तो सिस्टम, setResult() को दिया गया नतीजा उसे डिलीवर करता है. ऐसा न होने पर, नतीजे को अनदेखा कर दिया जाता है.