Intent
एक मैसेजिंग ऑब्जेक्ट है. इसका इस्तेमाल, किसी अन्य ऐप्लिकेशन कॉम्पोनेंट से किसी ऐक्शन का अनुरोध करने के लिए किया जा सकता है.
इंटेंट, कॉम्पोनेंट के बीच कई तरीकों से कम्यूनिकेशन की सुविधा देते हैं, लेकिन तीन तरीके हैं
बुनियादी इस्तेमाल के उदाहरण:
- गतिविधि शुरू करना
Activity
, किसी ऐप्लिकेशन की एक स्क्रीन को दिखाता है. आप एक नई मीटिंग शुरू कर सकते हैंIntent
पास करकेActivity
का इंस्टेंसstartActivity()
तक.Intent
शुरू करने से जुड़ी गतिविधि की जानकारी देती है. साथ ही, ज़रूरी डेटा को भी शामिल करती है.अगर आपको गतिविधि पूरी होने पर नतीजा चाहिए, तो
startActivityForResult()
पर कॉल करें. आपकी गतिविधि का नतीजा मिलता है अपनी गतिविधि केonActivityResult()
कॉलबैक में, एक अलगIntent
ऑब्जेक्ट के तौर पर. ज़्यादा जानकारी के लिए, गतिविधियां गाइड देखें. - सेवा शुरू करना
Service
एक ऐसा कॉम्पोनेंट है जो बैकग्राउंड में कार्रवाइयां करता है का इस्तेमाल किया जा सकता है. Android 5.0 (एपीआई लेवल 21) और इसके बाद के वर्शन के साथ, सेवा शुरू की जा सकती हैJobScheduler
के साथ. Reader Revenue Manager को सेट अप करने के बारे मेंJobScheduler
के बारे में है. इसकी जानकारी देखेंAPI-reference documentation
.Android 5.0 (एपीआई लेवल 21) से पहले के वर्शन के लिए, सेवा शुरू करने के लिए
Service
क्लास के तरीके. कोई सेवा चालू की जा सकती है एक बार के काम करने के लिएIntent
पास करके (जैसे कि कोई फ़ाइल डाउनलोड करना)startService()
तक.Intent
सेवा को शुरू करने और ज़रूरत के मुताबिक डेटा ले जाने की जानकारी देती है.अगर सेवा को क्लाइंट-सर्वर इंटरफ़ेस की मदद से डिज़ाइन किया गया है, तो उस सेवा को बाइंड किया जा सकता है. किसी दूसरे कॉम्पोनेंट से,
bindService()
मेंIntent
पास करके. ज़्यादा जानकारी के लिए, सेवाएं गाइड देखें. - ब्रॉडकास्ट डिलीवर करना
ब्रॉडकास्ट, ऐसा मैसेज है जिसे कोई भी ऐप्लिकेशन पा सकता है. सिस्टम, सिस्टम इवेंट के लिए कई ब्रॉडकास्ट डिलीवर करता है. जैसे, जब सिस्टम बूट होता है या डिवाइस चार्ज होना शुरू होता है.
Intent
कोsendBroadcast()
याsendOrderedBroadcast()
पर भेजकर, दूसरे ऐप्लिकेशन पर ब्रॉडकास्ट किया जा सकता है.
इस पेज के बाकी हिस्से में बताया गया है कि इंटेंट कैसे काम करते हैं और उन्हें कैसे इस्तेमाल किया जा सकता है. इससे जुड़ी जानकारी के लिए, इसे देखें अन्य ऐप्लिकेशन के साथ इंटरैक्ट करना और कॉन्टेंट शेयर करना शामिल है.
इंटेंट के टाइप
इंटेंट दो तरह के होते हैं:
- एक्सप्लिसिट इंटेंट पूरा
ComponentName
तय करके यह तय करते हैं कि ऐप्लिकेशन का कौनसा कॉम्पोनेंट इंटेंट को पूरा करेगा. आपको आम तौर पर, कॉम्पोनेंट को शुरू करने के लिए, साफ़ तौर पर अपना ऐप्लिकेशन बनाना होगा, क्योंकि आपको उस गतिविधि या सेवा की क्लास का नाम पता है जिसे शुरू करना है. इसके लिए उदाहरण के लिए, उपयोगकर्ता की किसी कार्रवाई के जवाब में, आपके ऐप्लिकेशन में कोई नई गतिविधि शुरू की जा सकती है या बैकग्राउंड में फ़ाइल डाउनलोड करने की सेवा. - इंप्लिसिट इंटेंट किसी खास कॉम्पोनेंट का नाम नहीं बताते. इसके बजाय, वे किसी सामान्य ऐक्शन को करने का एलान करते हैं. इससे किसी दूसरे ऐप्लिकेशन के कॉम्पोनेंट को उसे हैंडल करने की अनुमति मिलती है. उदाहरण के लिए, अगर आपको उपयोगकर्ता को मैप पर कोई जगह दिखानी है, तो किसी ऐसे ऐप्लिकेशन से अनुरोध करने के लिए, इंप्लिसिट इंटेंट का इस्तेमाल किया जा सकता है जो मैप पर कोई जगह दिखा सकता है.
पहली इमेज में दिखाया गया है कि किसी गतिविधि को शुरू करते समय, इंटेंट का इस्तेमाल कैसे किया जाता है. जब Intent
ऑब्जेक्ट किसी खास गतिविधि कॉम्पोनेंट का नाम साफ़ तौर पर बताता है, तो सिस्टम उस कॉम्पोनेंट को तुरंत शुरू कर देता है.
इंप्लिसिट इंटेंट का इस्तेमाल करने पर, Android सिस्टम शुरू करने के लिए सही कॉम्पोनेंट ढूंढ लेता है
इसके लिए, इंटेंट के कॉन्टेंट की तुलना मेनिफ़ेस्ट फ़ाइल में बताए गए इंटेंट फ़िल्टर से अन्य ऐप्लिकेशन की
डिवाइस. अगर इंटेंट किसी इंटेंट फ़िल्टर से मेल खाता है, तो सिस्टम उस कॉम्पोनेंट को शुरू करके उसे डिलीवर करता है
Intent
ऑब्जेक्ट. अगर कई इंटेंट फ़िल्टर संगत हैं, तो सिस्टम
एक डायलॉग बॉक्स दिखता है, ताकि उपयोगकर्ता यह चुन सके कि उसे किस ऐप्लिकेशन का इस्तेमाल करना है.
इंटेंट फ़िल्टर, किसी ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में मौजूद एक एक्सप्रेशन होता है, जो ऐसे इंटेंट के बारे में बताता है जिसे कॉम्पोनेंट पाना चाहता है. उदाहरण के लिए, किसी गतिविधि के लिए इंटेंट फ़िल्टर का एलान करके, आपकी गतिविधि से अन्य ऐप्लिकेशन के लिए, एक खास तरह के इंटेंट के साथ सीधे आपकी गतिविधि शुरू करना मुमकिन हो जाता है. इसी तरह, अगर किसी गतिविधि के लिए किसी भी इंटेंट फ़िल्टर का एलान नहीं किया जाता है, तो कैंपेन शुरू किया जा सकता है. ध्यान रखें.
चेतावनी: यह पक्का करने के लिए कि आपका ऐप्लिकेशन सुरक्षित है, हमेशा
किसी अश्लील
इंटेंट तय करते समय Service
को शुरू करें और
अपनी सेवाओं के लिए इंटेंट फ़िल्टर का एलान करें. किसी सेवा को शुरू करने के लिए, इंप्लिसिट इंटेंट का इस्तेमाल करना, सुरक्षा के लिहाज़ से खतरनाक हो सकता है. ऐसा इसलिए, क्योंकि यह पक्का नहीं किया जा सकता कि इंटेंट का जवाब कौनसी सेवा देगी. साथ ही, उपयोगकर्ता यह भी नहीं देख सकता कि कौनसी सेवा शुरू हुई है. Android 5.0 (एपीआई लेवल 21) और इसके बाद के वर्शन में, सिस्टम
bindService()
को कॉल करने पर अपवाद दिखता है
इंप्लिसिट इंटेंट से.
इंटेंट बनाना
Intent
ऑब्जेक्ट, वह जानकारी ले जाता है जिसका इस्तेमाल Android सिस्टम करता है
यह तय करने के लिए कि कौनसा कॉम्पोनेंट शुरू करना है (जैसे कि कॉम्पोनेंट का सटीक नाम या कॉम्पोनेंट
वह कैटगरी जिसे इंटेंट चाहिए), साथ ही वह जानकारी जिसमें मैसेज पाने वाला कॉम्पोनेंट इस्तेमाल करता है
कार्रवाई करने के लिए ज़रूरी है. उदाहरण के लिए, कार्रवाई और डेटा जिस पर कार्रवाई की जानी है.
Intent
में यह मुख्य जानकारी शामिल होती है:
- कॉम्पोनेंट का नाम
- शुरू किए जाने वाले कॉम्पोनेंट का नाम.
यह जानकारी देना ज़रूरी नहीं है. हालांकि, यह जानकारी साफ़ तौर पर इंटेंट के बारे में बताती है. इसका मतलब है कि इंटेंट को सिर्फ़ उस ऐप्लिकेशन कॉम्पोनेंट को डिलीवर किया जाना चाहिए जिसे कॉम्पोनेंट के नाम से तय किया गया है. कॉम्पोनेंट के नाम के बिना, इंटेंट इंप्लिसिट होता है और सिस्टम यह तय करता है कि इंटेंट की अन्य जानकारी के आधार पर किस कॉम्पोनेंट को इंटेंट मिलना चाहिए (जैसे कि कार्रवाई, डेटा, और कैटगरी—नीचे बताया गया है). अगर आपको कोई ख़ास प्रोग्राम शुरू करना है, कॉम्पोनेंट का नाम है, तो आपको कॉम्पोनेंट का नाम बताना होगा.
ध्यान दें:
Service
को शुरू करने पर, कॉम्पोनेंट का नाम हमेशा तय करता है. ऐसा न करने पर, आपको पक्के तौर पर नहीं पता चलेगा कि कौनसी सेवा इंटेंट पर जवाब देगा और उपयोगकर्ता यह नहीं देख सकेगा कि कौनसी सेवा शुरू होती है.Intent
का यह फ़ील्डComponentName
ऑब्जेक्ट दिया गया है, जिसे पूरी तरह से इस्तेमाल करके तय किया जा सकता है टारगेट कॉम्पोनेंट की क्वालिफ़ाइड क्लास का नाम, जिसमें ऐप्लिकेशन का पैकेज नाम भी शामिल होगा. उदाहरण के लिए,com.example.ExampleActivity
. कॉम्पोनेंट का नाम,setComponent()
,setClass()
,setClassName()
याIntent
कन्स्ट्रक्टर के साथ सेट किया जा सकता है. - कार्रवाई
- ऐसी स्ट्रिंग जो की जाने वाली सामान्य कार्रवाई के बारे में बताती है (जैसे कि view या चुनें).
ब्रॉडकास्ट इंटेंट के मामले में, यह कार्रवाई की गई है और उसकी रिपोर्ट की जा रही है. यह कार्रवाई काफ़ी हद तक यह तय करती है कि जवाब के बाकी हिस्से का स्ट्रक्चर कैसे तय किया गया है—खास तौर पर डेटा और अतिरिक्त चीज़ों में शामिल जानकारी.
आपके पास अपने ऐप्लिकेशन में इंटेंट के हिसाब से या दूसरे कामों के लिए इस्तेमाल करने के लिए, अपनी खुद की कार्रवाइयां तय करने का विकल्प होता है तो आपके ऐप्लिकेशन में कॉम्पोनेंट को शुरू करने के लिए होता है, लेकिन आप आम तौर पर ऐक्शन कॉन्सटेंट तय करते हैं
Intent
क्लास या अन्य फ़्रेमवर्क क्लास से तय किए जाते हैं. गतिविधि शुरू करने के लिए, यहां कुछ सामान्य कार्रवाइयां दी गई हैं:ACTION_VIEW
- जब आपके पास ऐसी कुछ जानकारी हो, तो
startActivity()
के साथ इंटेंट में इस कार्रवाई का इस्तेमाल करें कोई गतिविधि उपयोगकर्ता को दिखाई जा सकती है, जैसे किसी गैलरी ऐप्लिकेशन में देखी जाने वाली फ़ोटो या मैप ऐप्लिकेशन में देखें. ACTION_SEND
- इसे शेयर करें इंटेंट भी कहा जाता है. इसका इस्तेमाल
startActivity()
के साथ किसी इंटेंट में तब करना चाहिए, जब आपके पास ऐसा डेटा हो जिसे उपयोगकर्ता किसी दूसरे ऐप्लिकेशन, जैसे कि ईमेल ऐप्लिकेशन या सोशल मीडिया ऐप्लिकेशन के ज़रिए शेयर कर सकता हो.
ज़्यादा जानकारी के लिए,
Intent
क्लास का रेफ़रंस देखें कॉन्सटेंट जो सामान्य कार्रवाइयों के बारे में बताते हैं. अन्य कार्रवाइयां तय की गई हैं जो Android फ़्रेमवर्क में कहीं और मौजूद हैं, जैसे कि कार्रवाइयों के लिएSettings
में जो सिस्टम के सेटिंग ऐप्लिकेशन में खास स्क्रीन खोलते हैं.setAction()
याIntent
कंस्ट्रक्टर की मदद से, किसी इंटेंट के लिए कार्रवाई तय की जा सकती है.अगर आप अपनी कार्रवाइयां तय करते हैं, तो अपने ऐप्लिकेशन के पैकेज का नाम शामिल करना न भूलें जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- डेटा
- यूआरआई (
Uri
ऑब्जेक्ट), जो उस डेटा का रेफ़रंस देता है जिस पर कार्रवाई की जानी है और/या उस डेटा का MIME टाइप. आम तौर पर, किस तरह का डेटा डिलीवर किया जाता है, यह इंटेंट की कार्रवाई से तय होता है. इसके लिए उदाहरण के लिए, अगर कार्रवाईACTION_EDIT
है, तो डेटा में बदलाव करने के लिए दस्तावेज़ का यूआरआई.इंटेंट बनाते समय, इसके यूआरआई के अलावा, डेटा के टाइप (इसके MIME टाइप) के बारे में बताना अक्सर ज़रूरी होता है. उदाहरण के लिए, ऐसी गतिविधि जो इमेज दिखा सकती है, हो सकता है कि वह कोई ऑडियो फ़ाइल चलाने के लिए, भले ही यूआरआई फ़ॉर्मैट एक जैसे हों. अपने डेटा का MIME टाइप तय करने से, Android को सिस्टम आपके इंटेंट के लिए सबसे अच्छा कॉम्पोनेंट ढूंढता है. हालांकि, कभी-कभी MIME टाइप का अनुमान यूआरआई से लगाया जा सकता है—खास तौर पर तब, जब डेटा
content:
यूआरआई.content:
यूआरआई से पता चलता है कि डेटा, डिवाइस में मौजूद है और इसकी मदद से कंट्रोलContentProvider
, जिससे सिस्टम को डेटा MIME टाइप दिखता है.सिर्फ़ डेटा यूआरआई सेट करने के लिए,
setData()
को कॉल करें. सिर्फ़ MIME टाइप सेट करने के लिए,setType()
पर कॉल करें. अगर ज़रूरी हो, तोsetDataAndType()
के साथ दोनों को स्पष्ट रूप से सेट कर सकता है.चेतावनी: अगर आपको यूआरआई और एमआईएमई टाइप, दोनों को सेट करना है, तो
setData()
को कॉल न करें औरsetType()
की वजह से किसी दूसरे की वैल्यू शून्य हो जाती है. दोनों को सेट करने के लिए, हमेशाsetDataAndType()
का इस्तेमाल करें यूआरआई और MIME टाइप. - कैटगरी
- कॉम्पोनेंट के प्रकार के बारे में अतिरिक्त जानकारी वाली एक स्ट्रिंग
जो इंटेंट को हैंडल कर सके. कितनी भी कैटगरी के ब्यौरे
इंटेंट में रखा गया है, लेकिन ज़्यादातर इंटेंट के लिए कैटगरी की ज़रूरत नहीं होती.
यहां कुछ सामान्य कैटगरी दी गई हैं:
CATEGORY_BROWSABLE
- टारगेट गतिविधि, वेब ब्राउज़र से डेटा दिखाने के लिए खुद को शुरू करने की अनुमति देती है जिनका इस्तेमाल किसी लिंक से किया जाता है, जैसे कि इमेज या ईमेल मैसेज.
CATEGORY_LAUNCHER
- गतिविधि, किसी टास्क की शुरुआती गतिविधि है और इसे इस सूची में शामिल किया गया है सिस्टम के ऐप्लिकेशन लॉन्चर.
इनकी पूरी सूची के लिए,
Intent
क्लास का ब्यौरा देखें श्रेणियां.addCategory()
की मदद से, कोई कैटगरी दी जा सकती है.
ऊपर सूची में दी गई ये प्रॉपर्टी (कॉम्पोनेंट का नाम, कार्रवाई, डेटा, और कैटगरी) इंटेंट की विशेषताएं बताएं. इन गुणों को पढ़कर, Android सिस्टम को यह रिज़ॉल्व कर सकता है कि उसे कौनसा ऐप्लिकेशन कॉम्पोनेंट शुरू करना चाहिए. हालांकि, इंटेंट अतिरिक्त जानकारी, जो आपकी कंपनी पर किसी ऐप्लिकेशन कॉम्पोनेंट में उसका रिज़ॉल्व करने का तरीका क्या है. इंटेंट में यह जानकारी भी दी जा सकती है:
- अतिरिक्त सुविधाएं
- की-वैल्यू पेयर जिनमें पूरा करने के लिए ज़रूरी अतिरिक्त जानकारी होती है
अनुरोध किया गया है.
जिस तरह कुछ कार्रवाइयों में खास तरह के डेटा यूआरआई का इस्तेमाल किया जाता है, उसी तरह कुछ कार्रवाइयों में भी खास तरह के डेटा का इस्तेमाल किया जाता है.
putExtra()
के अलग-अलग तरीकों से अतिरिक्त डेटा जोड़ा जा सकता है. हर तरीका दो पैरामीटर स्वीकार करता है: कुंजी का नाम और वैल्यू. आप ज़रूरत से ज़्यादा डेटा डालकर,Bundle
ऑब्जेक्ट भी बना सकते हैं. इसके बाद, यह ऑब्जेक्ट को जोड़ सकते हैंIntent
में,putExtras()
के साथBundle
.उदाहरण के लिए, ईमेल भेजने का इंटेंट बनाते समय,
ACTION_SEND
, तो आप पाने वाले पाने वाले के बारे मेंEXTRA_EMAIL
बटन दबाएं और विषयEXTRA_SUBJECT
बटन.Intent
क्लास, स्टैंडर्ड डेटा टाइप के लिए कईEXTRA_*
कॉन्स्टेंट तय करती है. अगर आपको अपनी अतिरिक्त कुंजियों का एलान करना है (ऐसे इंटेंट के लिए आपके ऐप्लिकेशन को मिलता है), तो अपने ऐप्लिकेशन के पैकेज का नाम शामिल करना न भूलें जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
चेतावनी:
Parcelable
या आपकी उम्मीद के मुताबिक इंटेंट भेजते समयSerializable
डेटा किसी अन्य ऐप्लिकेशन का इस्तेमाल करें. अगर कोई ऐप्लिकेशनBundle
ऑब्जेक्ट में डेटा को ऐक्सेस करने की कोशिश करता है, लेकिन उसके पास पार्सल की गई या सीरियलाइज़ की गई क्लास का ऐक्सेस नहीं है, तो सिस्टम एकRuntimeException
दिखाता है. - फ़्लैग
- फ़्लैग
Intent
क्लास में परिभाषित किए गए हैं, जो इंटेंट. फ़्लैग Android सिस्टम को कोई गतिविधि लॉन्च करने का तरीका बता सकते हैं (उदाहरण के लिए, टास्क गतिविधि संबंधित होनी चाहिए के लिए) और इसके लॉन्च होने के बाद इसका उपयोग कैसे किया जाए (उदाहरण के लिए, क्या वह नवीनतम गतिविधियां).ज़्यादा जानकारी के लिए,
setFlags()
तरीका देखें.
एक्सप्लिसिट इंटेंट का उदाहरण
एक्सप्लिसिट इंटेंट उसे कहते हैं जिसका इस्तेमाल किसी खास ऐप्लिकेशन कॉम्पोनेंट को लॉन्च करने के लिए किया जाता है, जैसे कि
आपके ऐप्लिकेशन में कोई खास गतिविधि या सेवा हुई है. एक्सप्लिसिट इंटेंट बनाने के लिए,
Intent
ऑब्जेक्ट के लिए कॉम्पोनेंट का नाम—सभी
अन्य इंटेंट प्रॉपर्टी ज़रूरी नहीं हैं.
उदाहरण के लिए, अगर आपने अपने ऐप्लिकेशन में DownloadService
नाम की कोई सेवा बनाई है,
को वेब से कोई फ़ाइल डाउनलोड करने के लिए डिज़ाइन किया गया है, तो आप इसे इस कोड से शुरू कर सकते हैं:
Kotlin
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png" val downloadIntent = Intent(this, DownloadService::class.java).apply { data =Uri.parse
(fileUrl) } startService(downloadIntent)
Java
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png" Intent downloadIntent = new Intent(this, DownloadService.class); downloadIntent.setData(Uri.parse
(fileUrl)); startService(downloadIntent);
Intent(Context, Class)
कंस्ट्रक्टर, ऐप्लिकेशन Context
और
Class
ऑब्जेक्ट कॉम्पोनेंट को जोड़ना. इसलिए, यह इंटेंट ऐप्लिकेशन में DownloadService
क्लास को साफ़ तौर पर शुरू करता है.
कोई सेवा बनाने और उसे शुरू करने के बारे में ज़्यादा जानकारी के लिए, देखें सेवाएँ गाइड.
इंप्लिसिट इंटेंट का उदाहरण
इंप्लिसिट इंटेंट से किसी ऐसी कार्रवाई के बारे में पता चलता है जिसे डिवाइस पर मौजूद कोई भी ऐप्लिकेशन, कार्रवाई करने के लिए ट्रिगर कर सकता है. इंप्लिसिट इंटेंट का इस्तेमाल तब फ़ायदेमंद होता है, जब आपका ऐप्लिकेशन कार्रवाई कर सकते हैं, लेकिन अन्य ऐप्लिकेशन शायद कर सकते हों और आप चाहते हों कि उपयोगकर्ता को वह ऐप्लिकेशन चुनने का विकल्प मिले जिसका उपयोग करना है.
उदाहरण के लिए, अगर आपके पास ऐसा कॉन्टेंट है जिसे उपयोगकर्ता को अन्य लोगों के साथ शेयर करना है,
एक इंटेंट बनाएं
ACTION_SEND
कार्रवाई के साथ
और ऐसी अतिरिक्त चीज़ें जोड़ें जो शेयर किए जाने वाले कॉन्टेंट के बारे में बताएं. आपके कॉल करने पर
startActivity()
इस इंटेंट के साथ, उपयोगकर्ता यह कर सकता है:
वह ऐप्लिकेशन चुनें जिसके ज़रिए आपको कॉन्टेंट शेयर करना है.
Kotlin
// Create the text message with a string. val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Try to invoke the intent. try { startActivity(sendIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
startActivity()
को कॉल करने पर, सिस्टम
यह तय करने के लिए इंस्टॉल किए गए सभी ऐप्लिकेशन की जांच करता है कि इस तरह के इंटेंट को कौन मैनेज कर सकता है (
इंटेंट के साथ ACTION_SEND
कार्रवाई और जिसमें "टेक्स्ट/सादा" शामिल है
डेटा). अगर कोई एक ऐप्लिकेशन है जो इसे हैंडल कर सकता है, तो वह ऐप्लिकेशन तुरंत खुल जाता है और उसे
इंटेंट. अगर कोई दूसरा ऐप्लिकेशन इसे मैनेज नहीं कर सकता, तो आपका ऐप्लिकेशन
ActivityNotFoundException
होता है. अगर कई गतिविधियां इंटेंट को स्वीकार करती हैं, तो सिस्टम
यह एक डायलॉग दिखाता है, जैसा कि दूसरी इमेज में दिखाया गया है. इससे उपयोगकर्ता यह चुन सकता है कि उसे किस ऐप्लिकेशन का इस्तेमाल करना है.
गाइड में अन्य ऐप्लिकेशन लॉन्च करने के बारे में भी ज़्यादा जानकारी दी गई है इसके बारे में उपयोगकर्ता को कोई दूसरा ऐप्लिकेशन.
ऐप्लिकेशन चुनने की सुविधा को ज़बरदस्ती चालू करना
अगर आपके इंप्लिसिट इंटेंट का जवाब देने वाला एक से ज़्यादा ऐप्लिकेशन है, तो उपयोगकर्ता यह चुन सकता है कि किस ऐप्लिकेशन का इस्तेमाल करना है. साथ ही, उस ऐप्लिकेशन को कार्रवाई के लिए डिफ़ॉल्ट विकल्प भी बनाया जा सकता है. डिफ़ॉल्ट विकल्प चुनने की सुविधा तब मददगार होती है, जब उपयोगकर्ता ऐसी कार्रवाई कर रहा हो शायद हर बार एक ही ऐप्लिकेशन का इस्तेमाल करना चाहे, जैसे कि वेब पेज खोलते समय (उपयोगकर्ता अक्सर एक वेब ब्राउज़र पसंद करते हैं).
हालांकि, अगर कई ऐप्लिकेशन इस इंटेंट के हिसाब से काम कर सकते हैं और उपयोगकर्ता किसी दूसरे ऐप्लिकेशन का इस्तेमाल करना चाहेगा,
ऐप्लिकेशन हर बार दिखाई देता है, तो आपको साफ़ तौर पर एक चुनने वाला डायलॉग दिखाना चाहिए. चुनने वाले डायलॉग बॉक्स में
उपयोगकर्ता को यह चुनने का विकल्प मिलता है कि कार्रवाई के लिए किस ऐप्लिकेशन का इस्तेमाल करना है (उपयोगकर्ता इन कामों के लिए डिफ़ॉल्ट ऐप्लिकेशन नहीं चुन सकता
कार्रवाई). उदाहरण के लिए, जब आपका ऐप्लिकेशन "शेयर" की सुविधा इस्तेमाल करता है ACTION_SEND
कार्रवाई का इस्तेमाल करके, उपयोगकर्ता किसी अन्य ऐप्लिकेशन का इस्तेमाल करके शेयर कर सकते हैं.
चुनने के लिए कहें, तो आपको हमेशा सिलेक्टर डायलॉग का इस्तेमाल करना चाहिए, जैसा कि इमेज 2 में दिखाया गया है.
चुनने वाले को दिखाने के लिए, createChooser()
का इस्तेमाल करके Intent
बनाएं और उसे startActivity()
को पास करें, जैसा कि इस उदाहरण में दिखाया गया है.
इस उदाहरण में, ऐप्लिकेशन की सूची के साथ एक डायलॉग दिखाया गया है. यह डायलॉग बॉक्स, createChooser()
तरीके को दिए गए इंटेंट के हिसाब से काम करता है. साथ ही, दिए गए टेक्स्ट को
डायलॉग टाइटल.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) ... // Always use string resources for UI text. // This says something like "Share this photo with" val title: String = resources.getString(R.string.chooser_title) // Create intent to show the chooser dialog val chooser: Intent = Intent.createChooser(sendIntent, title) // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(chooser) }
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
असुरक्षित इंटेंट लॉन्च का पता लगाना
आपका ऐप्लिकेशन, आपके ऐप्लिकेशन के अंदर कॉम्पोनेंट के बीच नेविगेट करने के लिए इंटेंट लॉन्च कर सकता है, या किसी अन्य ऐप्लिकेशन की ओर से कोई कार्रवाई करें. प्लैटफ़ॉर्म की सुरक्षा को बेहतर बनाने के लिए, Android 12 (एपीआई लेवल 31) और उसके बाद वाले वर्शन में, डीबग करने की एक सुविधा मिलती है जो आपको चेतावनी देती है अगर आपका ऐप्लिकेशन किसी इंटेंट को असुरक्षित तरीके से लॉन्च करता है. उदाहरण के लिए, आपका ऐप्लिकेशन किसी नेस्ट किए गए इंटेंट को असुरक्षित तरीके से लॉन्च करते हैं, जो कि पास किया जा चुका इंटेंट होता है एक अन्य इंटेंट में एक अतिरिक्त के तौर पर.
अगर आपका ऐप्लिकेशन नीचे दी गई दोनों कार्रवाइयां करता है, तो सिस्टम इंटेंट लॉन्च और StrictMode के उल्लंघन के साथ होता है:
- आपका ऐप्लिकेशन, डिलीवर किए गए इंटेंट के अतिरिक्त हिस्सों में से नेस्ट किए गए इंटेंट को पार्स करता है.
- आपका ऐप्लिकेशन, नेस्ट किए गए उस इंटेंट का इस्तेमाल करके तुरंत ऐप्लिकेशन कॉम्पोनेंट शुरू कर देता है. जैसे, इंटेंट को
startActivity()
,startService()
याbindService()
में पास करना.
इस स्थिति का पता लगाने और अपने ऐप्लिकेशन में बदलाव करने के बारे में ज़्यादा जानकारी के लिए, Android Nesting के बारे में ब्लॉग पोस्ट पढ़ो इंटेंट मीडियम पर.
असुरक्षित इंटेंट लॉन्च होने की जांच करना
अपने ऐप्लिकेशन में असुरक्षित इंटेंट लॉन्च होने का पता लगाने के लिए,
detectUnsafeIntentLaunch()
जब आप अपना VmPolicy
कॉन्फ़िगर करते हैं, जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है. अगर आपने
जब आपके ऐप्लिकेशन को StrictMode उल्लंघन का पता चलता है, तो आपको शायद
संभावित संवेदनशील जानकारी को सुरक्षित रखा जा सकता है.
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()) }
Java
protected void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()); }
इंटेंट का ज़्यादा ज़िम्मेदारी से इस्तेमाल करना
असुरक्षित इंटेंट लॉन्च की संभावना और StrictMode के उल्लंघन की संभावना को कम करने के लिए, ये सबसे सही तरीके अपनाएं.
इंटेंट के अंदर सिर्फ़ ज़रूरी अतिरिक्त चीज़ों को कॉपी करें और ज़रूरी काम करें
साफ़-सफ़ाई और पुष्टि के तरीके. आपका ऐप्लिकेशन एक इंटेंट से अतिरिक्त चीज़ों को कॉपी कर सकता है
एक अन्य इंटेंट जिसका इस्तेमाल नया कॉम्पोनेंट लॉन्च करने के लिए किया जाता है. ऐसा तब होता है, जब आपके
ऐप्लिकेशन कॉल
putExtras(Intent)
या
putExtras(Bundle)
.
अगर आपका ऐप्लिकेशन इनमें से कोई एक कार्रवाई करता है, तो सिर्फ़ उन अतिरिक्त एलिमेंट को कॉपी करें जिनकी ज़रूरत, रिसीव करने वाले कॉम्पोनेंट को है. अगर अन्य इंटेंट (जिस पर कॉपी मिलती है)
कोई ऐसा कॉम्पोनेंट लॉन्च करता है जो
एक्सपोर्ट करना, इन सभी चीज़ों को साफ़ करना, और
अतिरिक्त चीज़ों को उस इंटेंट पर कॉपी करने से पहले पुष्टि करें जो
कॉम्पोनेंट.
अपने ऐप्लिकेशन के कॉम्पोनेंट को बेवजह एक्सपोर्ट न करें. उदाहरण के लिए, अगर
एक इंटरनल नेस्ट किए गए इंटेंट का इस्तेमाल करके, ऐप्लिकेशन कॉम्पोनेंट लॉन्च करने के लिए सेट करें.
कॉम्पोनेंट का android:exported
एट्रिब्यूट false
के लिए इस्तेमाल किया जाता है.
इसके बजाय PendingIntent
का इस्तेमाल करें
नेस्ट किए गए इंटेंट. इस तरह, जब कोई दूसरा ऐप्लिकेशन इसके PendingIntent
को पार्स नहीं करता
जिसमें Intent
शामिल है, तो दूसरा ऐप्लिकेशन इसका इस्तेमाल करके PendingIntent
को लॉन्च कर सकता है:
पहचान कर सकता है. यह कॉन्फ़िगरेशन अन्य ऐप्लिकेशन को सुरक्षित तरीके से लॉन्च करने में मदद करता है
अपने ऐप्लिकेशन में किसी भी कॉम्पोनेंट के साथ-साथ ऐसा कॉम्पोनेंट भी शामिल करें जिसे एक्सपोर्ट नहीं किया गया हो.
दूसरी इमेज में दिखाया गया डायग्राम दिखाता है कि सिस्टम आपके (क्लाइंट) से कंट्रोल कैसे पास करता है ऐप को किसी दूसरे (सेवा) ऐप से और वापस अपने ऐप पर:
- आपका ऐप्लिकेशन एक ऐसा इंटेंट बनाता है जो दूसरे ऐप्लिकेशन में किसी गतिविधि को शुरू करता है. इतने समय में
इस इंटेंट के हिसाब से, आपको
PendingIntent
ऑब्जेक्ट को अतिरिक्त के तौर पर जोड़ना होता है. यह इंटेंट बाकी है आपके ऐप्लिकेशन में किसी कॉम्पोनेंट को शुरू करता हो; इस कॉम्पोनेंट को एक्सपोर्ट नहीं किया जाता. - आपके ऐप्लिकेशन का इंटेंट मिलने पर, दूसरा ऐप्लिकेशन नेस्ट किए गए
PendingIntent
ऑब्जेक्ट. - कोई अन्य ऐप्लिकेशन,
PendingIntent
ऑब्जेक्ट परsend()
तरीका शुरू करता है. - आपके ऐप्लिकेशन पर कंट्रोल वापस पास करने के बाद, सिस्टम 'मंज़ूरी बाकी' को वापस शुरू करता है के संदर्भ का उपयोग कर रहे हैं.
दूसरा डायग्राम. नेस्ट किए गए, पूरे नहीं किए गए इंटेंट का इस्तेमाल करते समय, एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन के बीच होने वाले कम्यूनिकेशन का डायग्राम.
इंप्लिसिट इंटेंट पाना
विज्ञापन देने के लिए कि आपके ऐप्लिकेशन को कौनसे इंप्लिसिट इंटेंट मिल सकते हैं, उसके लिए एक या ज़्यादा इंटेंट फ़िल्टर का एलान करें
<intent-filter>
के साथ आपके ऐप्लिकेशन के हर कॉम्पोनेंट
आपकी मेनिफ़ेस्ट फ़ाइल में एलिमेंट शामिल है.
हर इंटेंट फ़िल्टर, इंटेंट की कार्रवाई के आधार पर स्वीकार किए जाने वाले इंटेंट के बारे में बताता है,
डेटा, और कैटगरी. सिस्टम आपके ऐप्लिकेशन कॉम्पोनेंट को इंप्लिसिट इंटेंट सिर्फ़ तब डिलीवर करता है, जब
इंटेंट आपके किसी एक इंटेंट फ़िल्टर से होकर गुज़र सकता है.
ध्यान दें: एक्सप्लिसिट इंटेंट हमेशा अपने टारगेट को डिलीवर किया जाता है. भले ही, कॉम्पोनेंट ने किसी भी इंटेंट फ़िल्टर का एलान किया हो.
ऐप्लिकेशन कॉम्पोनेंट को हर यूनीक जॉब के लिए, अलग-अलग फ़िल्टर बनाने चाहिए.
उदाहरण के लिए, किसी इमेज गैलरी ऐप्लिकेशन की एक गतिविधि में दो फ़िल्टर हो सकते हैं: एक फ़िल्टर
किसी इमेज को देखने के लिए, और दूसरा फ़िल्टर इस्तेमाल करके इमेज में बदलाव करें. गतिविधि शुरू होने पर,
यह Intent
की जांच करता है और जानकारी के आधार पर तय करता है कि कैसे काम करना है
Intent
में (जैसे, एडिटर के कंट्रोल दिखाए या नहीं).
हर इंटेंट फ़िल्टर को <intent-filter>
से तय किया जाता है
ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में मौजूद एलिमेंट को, संबंधित ऐप्लिकेशन कॉम्पोनेंट में नेस्ट किया गया होगा (जैसे
<activity>
के तौर पर
एलिमेंट).
<intent-filter>
एलिमेंट वाले हर ऐप्लिकेशन कॉम्पोनेंट में,
स्पष्ट रूप से
android:exported
.
इस एट्रिब्यूट से पता चलता है कि ऐप्लिकेशन कॉम्पोनेंट को दूसरे ऐप्लिकेशन ऐक्सेस कर सकते हैं या नहीं. कुछ
उदाहरण के लिए, ऐसी गतिविधियां जिनके इंटेंट फ़िल्टर में
LAUNCHER
कैटगरी है, तो इस एट्रिब्यूट को true
पर सेट करना मददगार होता है. या फिर,
इस एट्रिब्यूट को false
पर सेट करना सुरक्षित है.
चेतावनी: अगर कोई गतिविधि, सेवा या ब्रॉडकास्ट
आपके ऐप्लिकेशन में मौजूद रिसीवर, इंटेंट फ़िल्टर का इस्तेमाल करता है और वैल्यू के लिए साफ़ तौर पर कोई वैल्यू सेट नहीं करता है
android:exported
के लिए, आपका ऐप्लिकेशन ऐसे डिवाइस पर इंस्टॉल नहीं किया जा सकता जिसे
जो Android 12 या इसके बाद वाले वर्शन पर काम करता हो.
<intent-filter>
के अंदर,
एक या एक से ज़्यादा प्रॉम्प्ट का इस्तेमाल करके, यह तय किया जा सकता है कि किस तरह के इंटेंट स्वीकार किए जाएं
ये तीन एलिमेंट मौजूद होते हैं:
<action>
name
एट्रिब्यूट में स्वीकार की गई इंटेंट कार्रवाई के बारे में बताता है. वैल्यू, किसी ऐक्शन की लिटरल स्ट्रिंग वैल्यू होनी चाहिए, न कि क्लास कॉन्स्टेंट.<data>
- स्वीकार किए जाने वाले डेटा के टाइप की जानकारी देता है. इसके लिए, एक या एक से ज़्यादा एट्रिब्यूट इस्तेमाल किए जाते हैं. साथ ही, कई एट्रिब्यूट के बारे में बताया जाता है
डेटा यूआरआई (
scheme
,host
,port
,path
) और MIME टाइप शामिल हैं. <category>
name
एट्रिब्यूट में स्वीकार की गई इंटेंट कैटगरी के बारे में बताता है. वैल्यू, किसी ऐक्शन की लिटरल स्ट्रिंग वैल्यू होनी चाहिए, न कि क्लास कॉन्स्टेंट.ध्यान दें: इंप्लिसिट इंटेंट पाने के लिए, आपको इसे शामिल करना ज़रूरी है इंटेंट फ़िल्टर में
CATEGORY_DEFAULT
कैटगरी. तरीकेstartActivity()
औरstartActivityForResult()
सभी इंटेंट का इस्तेमाल करता है जैसे कि उन्होंनेCATEGORY_DEFAULT
कैटगरी का एलान किया हो. अगर आपने इंटेंट फ़िल्टर में इस कैटगरी का एलान नहीं किया है, तो कोई इंप्लिसिट इंटेंट आपकी गतिविधि.
उदाहरण के लिए, यहां गतिविधि के बारे में एलान दिया गया है. इसमें इंटेंट फ़िल्टर को भी शामिल किया गया है, ताकि
डेटा टाइप, टेक्स्ट होने पर ACTION_SEND
इंटेंट:
<activity android:name="ShareActivity" android:exported="false"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
ऐसा फ़िल्टर बनाया जा सकता है जिसमें
<action>
<data>
या
<category>
.
अगर ऐसा किया जाता है, तो आपको यह पक्का करना होगा कि कॉम्पोनेंट इनमें से किसी एक या सभी को हैंडल कर सकता है
इन फ़िल्टर एलिमेंट का एक साथ इस्तेमाल किया जा सकता है.
जब आपको कई तरह के इंटेंट को हैंडल करना हो, लेकिन सिर्फ़ कुछ खास कॉम्बिनेशन में ही कार्रवाई, डेटा, और कैटगरी टाइप जोड़ते हैं, तो आपको कई इंटेंट फ़िल्टर बनाने होंगे.
इंप्लिसिट इंटेंट के आधार पर फ़िल्टर की जांच करने के लिए, तीन एलिमेंट शामिल होते हैं. कॉम्पोनेंट को डिलीवर करने के लिए, इंटेंट को तीनों जांचों को पास करना ज़रूरी है. अगर यह इनमें से किसी भी एक भी मैच नहीं कर पाता है, तो Android सिस्टम कॉम्पोनेंट. हालांकि, किसी कॉम्पोनेंट में कई इंटेंट फ़िल्टर हो सकते हैं, इसलिए एक ऐसा इंटेंट अगर कॉम्पोनेंट का फ़िल्टर किसी दूसरे फ़िल्टर से न गुज़रे, तो हो सकता है कि वह दूसरे फ़िल्टर से भी गुज़र जाए. इंटेंट रिज़ॉल्यूशन सेक्शन में, इस बारे में ज़्यादा जानकारी दी गई है कि सिस्टम, इंटेंट को कैसे हल करता है.
चेतावनी: अन्य ऐप्लिकेशन को शुरू होने से रोकने के लिए इंटेंट फ़िल्टर का इस्तेमाल करना सुरक्षित तरीका नहीं है
आपके कॉम्पोनेंट. हालांकि, इंटेंट फ़िल्टर किसी कॉम्पोनेंट को सिर्फ़
कुछ खास तरह के इंप्लिसिट इंटेंट, दूसरा ऐप्लिकेशन आपके ऐप्लिकेशन कॉम्पोनेंट को चालू कर सकता है
अगर डेवलपर आपके कॉम्पोनेंट के नाम तय करता है, तो एक्सप्लिसिट इंटेंट का इस्तेमाल भी किया जा सकता है.
अगर आपके लिए यह ज़रूरी है कि सिर्फ़ आपका ऐप्लिकेशन आपके किसी कॉम्पोनेंट को शुरू कर सके, तो अपने मेनिफ़ेस्ट में इंटेंट फ़िल्टर का एलान न करें. इसके बजाय,
exported
एट्रिब्यूट
"false"
पर सेट करें.
इसी तरह, अनजाने में किसी दूसरे ऐप्लिकेशन का
Service
, अपनी सेवा शुरू करने के लिए, हमेशा साफ़ तौर पर इंटेंट का इस्तेमाल करें.
ध्यान दें:
सभी गतिविधियों के लिए, आपको मेनिफ़ेस्ट फ़ाइल में अपने इंटेंट फ़िल्टर का एलान करना होगा.
हालांकि, ब्रॉडकास्ट रिसीवर के लिए कॉल करके, फ़िल्टर डाइनैमिक तौर पर रजिस्टर किए जा सकते हैं
registerReceiver()
. इसके बाद, unregisterReceiver()
से पैसे पाने वाले व्यक्ति का रजिस्ट्रेशन रद्द किया जा सकता है. ऐसा करने से, आपके ऐप्लिकेशन को
का इस्तेमाल, अपने ऐप्लिकेशन के दौरान किसी खास समयावधि के दौरान चुनिंदा ब्रॉडकास्ट को सुनने के लिए करें
चल रहा है.
फ़िल्टर के उदाहरण
इंटेंट फ़िल्टर के कुछ व्यवहार दिखाने के लिए, यहां एक उदाहरण दिया गया है सोशल-शेयरिंग ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल से:
<activity android:name="MainActivity" android:exported="true"> <!-- This activity is the main entry, should appear in app launcher --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ShareActivity" android:exported="false"> <!-- This activity handles "SEND" actions with text data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <action android:name="android.intent.action.SEND_MULTIPLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.google.panorama360+jpg"/> <data android:mimeType="image/*"/> <data android:mimeType="video/*"/> </intent-filter> </activity>
पहली गतिविधि, MainActivity
, ऐप्लिकेशन का मुख्य एंट्री पॉइंट है—वह गतिविधि
तब खुलता है, जब उपयोगकर्ता शुरुआत में लॉन्चर आइकॉन के साथ ऐप्लिकेशन लॉन्च करता है:
ACTION_MAIN
कार्रवाई से पता चलता है कि यह मुख्य एंट्री पॉइंट है और इसमें किसी इंटेंट डेटा की ज़रूरत नहीं होती.CATEGORY_LAUNCHER
कैटगरी से पता चलता है कि इस गतिविधि का आइकॉन, सिस्टम के ऐप्लिकेशन लॉन्चर में रखा जाना चाहिए. अगर<activity>
एलिमेंटicon
वाले आइकॉन के बारे में नहीं बताता है. इसके बाद, सिस्टम<application>
से आइकॉन का इस्तेमाल करता है एलिमेंट.
ऐप्लिकेशन लॉन्चर में गतिविधि दिखे, इसके लिए इन दोनों को एक साथ जोड़ा जाना चाहिए.
दूसरी गतिविधि, ShareActivity
का मकसद टेक्स्ट और मीडिया कॉन्टेंट शेयर करना है. उपयोगकर्ता, MainActivity
से इस गतिविधि पर जाकर इसमें शामिल हो सकते हैं. हालांकि, वे सीधे किसी दूसरे ऐप्लिकेशन से भी ShareActivity
में शामिल हो सकते हैं. यह ऐप्लिकेशन, दो इंटेंट फ़िल्टर में से किसी एक से मैच करने वाला इंप्लिसिट इंटेंट जारी करता है.
ध्यान दें: MIME टाइप,
application/vnd.google.panorama360+jpg
, एक ऐसा खास डेटा टाइप है जिससे पता चलता है कि
पैनोरामिक फ़ोटो, जिन्हें आप Google
पैनोरामा API.
इंटेंट को अन्य ऐप्लिकेशन के इंटेंट फ़िल्टर से मैच करना
अगर कोई अन्य ऐप्लिकेशन, Android 13 (एपीआई लेवल 33) या उसके बाद के वर्शन को टारगेट करता है, तो वह
ऐप्लिकेशन का इंटेंट सिर्फ़ तब होगा, जब आपका इंटेंट किसी कार्रवाई और कैटगरी से मेल खाता हो
दूसरे ऐप्लिकेशन में <intent-filter>
एलिमेंट होना चाहिए. अगर सिस्टम को
मैच करता है, तो यह
ActivityNotFoundException
.
ईमेल भेजने वाले ऐप्लिकेशन को इसे मैनेज करना होगा
यह अपवाद.
इसी तरह, अगर आपने अपने ऐप्लिकेशन को अपडेट किया है, ताकि वह Android 13 को टारगेट करे
या ज़्यादा, बाहरी ऐप्लिकेशन से जनरेट होने वाले सभी इंटेंट
आपके ऐप्लिकेशन का एक्सपोर्ट किया गया कॉम्पोनेंट सिर्फ़ तब ही होगा, जब वह इंटेंट कार्रवाइयों से मेल खाता हो और
<intent-filter>
एलिमेंट की ऐसी कैटगरी जिनके बारे में आपका ऐप्लिकेशन एलान करता है. यह व्यवहार
इसलिए, मैसेज भेजने वाले ऐप्लिकेशन के टारगेट किए गए SDK टूल का वर्शन चाहे जो भी हो.
इन मामलों में, इंटेंट मैचिंग को लागू नहीं किया जाता:
- ऐसे कॉम्पोनेंट को डिलीवर किए गए इंटेंट जो किसी भी इंटेंट फ़िल्टर का एलान नहीं करते हैं.
- एक ही ऐप्लिकेशन में मौजूद इंटेंट.
- सिस्टम से मिलने वाले इंटेंट; यानी, इंटेंट
"सिस्टम का यूआईडी" (uid=1000) है. सिस्टम ऐप्लिकेशन में
system_server
और सेट किए गए ऐप्लिकेशन शामिल हैंandroid.uid.system
के लिएandroid:sharedUserId
. - रूट से आने वाले इंटेंट.
इंटेंट मैचिंग के बारे में ज़्यादा जानें.
लंबित इंटेंट का इस्तेमाल करना
PendingIntent
ऑब्जेक्ट, Intent
ऑब्जेक्ट के चारों ओर एक रैपर होता है. PendingIntent
का मुख्य मकसद, किसी दूसरे ऐप्लिकेशन को उसमें मौजूद Intent
का इस्तेमाल करने की अनुमति देना है. ऐसा करने पर, यह ऐसा लगता है कि Intent
को आपके ऐप्लिकेशन की प्रोसेस से ही चलाया जा रहा है.
जिन इंटेंट को मंज़ूरी मिलना बाकी है उनके लिए, इस्तेमाल के ये मुख्य उदाहरण यहां दिए गए हैं:
- जब उपयोगकर्ता आपकी सूचना के ज़रिए कोई कार्रवाई करता है, तब उसे लागू करने के लिए इंटेंट का एलान करना (Android सिस्टम का
NotificationManager
Intent
को लागू करता है). - जब उपयोगकर्ता आपकी
ऐप्लिकेशन विजेट
(होम स्क्रीन ऐप्लिकेशन
Intent
को चलाता है). - तय किए गए समय पर लागू किए जाने वाले इंटेंट का एलान करना (Android
सिस्टम का
AlarmManager
,Intent
को लागू करता है).
जैसे कि हर Intent
ऑब्जेक्ट को किसी खास कंपनी या संगठन के मैनेज करने के लिए डिज़ाइन किया गया है
ऐप्लिकेशन कॉम्पोनेंट का टाइप (Activity
, Service
या
एक BroadcastReceiver
), इसलिए भी PendingIntent
होना चाहिए
बनाने में भी मदद मिलती है. अगर किसी पेंडिंग इंटेंट का इस्तेमाल किया जाता है, तो आपका ऐप्लिकेशन startActivity()
जैसे कॉल के साथ इंटेंट को लागू नहीं करता. इसके बजाय, आपको
PendingIntent
को क्रिएटर तरीके से कॉल करने के लिए यह तरीका अपनाएं:
PendingIntent.getActivity()
Activity
को शुरू करने वालाIntent
.Intent
से शुरू होने वालेService
के लिएPendingIntent.getService()
.PendingIntent.getBroadcast()
BroadcastReceiver
शुरू करने वालाIntent
.
जब तक कि आपका ऐप्लिकेशन अन्य ऐप्लिकेशन से रुके हुए इंटेंट पाने न ले रहा हो,
PendingIntent
बनाने के लिए ऊपर दिए गए तरीके शायद
PendingIntent
तरीकों की ज़रूरत पड़ेगी.
हर तरीके के लिए मौजूदा ऐप्लिकेशन Context
का इस्तेमाल किया जाता है,
Intent
जिसे रैप करना है और एक या एक से ज़्यादा फ़्लैग
इंटेंट का इस्तेमाल कैसे किया जाना चाहिए (जैसे, इंटेंट का एक से ज़्यादा बार इस्तेमाल किया जा सकता है या नहीं).
जिन इंटेंट को मंज़ूरी नहीं मिली है उनके इस्तेमाल के बारे में ज़्यादा जानकारी के लिए, हर इंटेंट के लिए दस्तावेज़ देखें इस्तेमाल के उदाहरणों के बारे में बताएं, जैसे कि सूचनाएं और ऐप्लिकेशन विजेट एपीआई गाइड.
म्यूटेबिलिटी की जानकारी दें
अगर आपका ऐप्लिकेशन Android 12 या इसके बाद वाले वर्शन को टारगेट करता है, तो आपको
आपके ऐप्लिकेशन के बनाए गए हर PendingIntent
ऑब्जेक्ट की म्यूटेबिलिटी. यह एलान करने के लिए
दिया गया PendingIntent
ऑब्जेक्ट बदला जा सकता है या नहीं बदला जा सकता, इसलिए
PendingIntent.FLAG_MUTABLE
या
PendingIntent.FLAG_IMMUTABLE
फ़्लैग का इस्तेमाल करें.
अगर आपका ऐप्लिकेशन, PendingIntent
ऑब्जेक्ट बनाने की कोशिश करता है
म्यूटेबिलिटी फ़्लैग सेट किए बिना, सिस्टम
IllegalArgumentException
, और
Logcat में यह मैसेज दिखता है:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
जब भी मुमकिन हो, तब ऐसे इंटेंट बनाएं जिन्हें बदला नहीं जा सकता
ज़्यादातर मामलों में, आपके ऐप्लिकेशन को ऐसे PendingIntent
ऑब्जेक्ट बनाने चाहिए जिन्हें बदला न जा सके. इन ऑब्जेक्ट के बारे में, यहां दिए गए कोड स्निपेट में बताया गया है. अगर PendingIntent
ऑब्जेक्ट में बदलाव नहीं किया जा सकता, तो
तो अन्य ऐप्लिकेशन,
इंटेंट.
Kotlin
val pendingIntent = PendingIntent.getActivity(applicationContext, REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE);
हालांकि, इस्तेमाल के कुछ मामलों में, बदले जा सकने वाले PendingIntent
ऑब्जेक्ट की ज़रूरत होती है:
- सीधे जवाब देने की कार्रवाइयों में मदद करना
सूचनाएं पर टैप करें. कॉन्टेंट बनाने
सीधे तौर पर जवाब देने के लिए, PendingIntent ऑब्जेक्ट के क्लिप डेटा में बदलाव करना ज़रूरी है
जो जवाब से जुड़ा हो. आम तौर पर, इस बदलाव का अनुरोध करने के लिए,
fillIn()
तरीके के लिएFILL_IN_CLIP_DATA
को फ़्लैग के तौर पर पास किया जाता है. - इन इंस्टेंस का इस्तेमाल करके, सूचनाओं को Android Auto फ़्रेमवर्क से जोड़ना
CarAppExtender
. - इंस्टेंस का इस्तेमाल करके बबल्स में बातचीत डालना
PendingIntent
महीने में से. बदलाव किया जा सकने वालाPendingIntent
ऑब्जेक्ट, सिस्टम को लागू करने की अनुमति देता है सही फ़्लैग, जैसे किFLAG_ACTIVITY_MULTIPLE_TASK
औरFLAG_ACTIVITY_NEW_DOCUMENT
. - कॉल करके डिवाइस की जगह की जानकारी मांगी जा रही है
requestLocationUpdates()
का इस्तेमाल किया जा सकता है. बदलाव किए जा सकने वालेPendingIntent
ऑब्जेक्ट की मदद से, सिस्टम में ऐसे इंटेंट एक्सट्रा जोड़े जा सकते हैं जो जगह की जानकारी के लाइफ़साइकल इवेंट दिखाते हैं. इन इवेंट में शामिल है: जगह में बदलाव और सेवा देने वाली कंपनी का उपलब्ध होना. AlarmManager
का इस्तेमाल करके, अलार्म शेड्यूल किए जा रहे हैं. बदला जा सकने वालाPendingIntent
ऑब्जेक्ट, सिस्टम कोEXTRA_ALARM_COUNT
एक से ज़्यादा इंटेंट पर क्लिक करें. इससे पता चलता है कि एक ही अलार्म को कितनी बार दोहराया गया है ट्रिगर हो गया है. इसमें अतिरिक्त जानकारी शामिल करने पर, उपयोगकर्ताओं को सूचना भेजी जा सकती है दोहराए जाने वाले अलार्म को कई बार ट्रिगर किया जाना चाहिए या नहीं, यह तय करने के लिए ऐप्लिकेशन. उदाहरण के लिए, जब डिवाइस स्लीप मोड में था.
अगर आपका ऐप्लिकेशन, बदला जा सकने वाला PendingIntent
ऑब्जेक्ट बनाता है, तो हमारा सुझाव है कि
साफ़ तौर पर किया गया हो और अतिरिक्त जानकारी के साथ,
ComponentName
. इस तरह, जब भी
कोई दूसरा ऐप्लिकेशन PendingIntent
को शुरू करता है और कंट्रोल को फिर से आपके ऐप्लिकेशन पर पास कर देता है,
आपके ऐप्लिकेशन में एक ही कॉम्पोनेंट हमेशा शुरू होता है.
जिन इंटेंट को मंज़ूरी नहीं मिली है उनमें अश्लील इंटेंट का इस्तेमाल करना
यह बेहतर तरीके से तय करने के लिए कि दूसरे ऐप्लिकेशन, आपके ऐप्लिकेशन के वे इंटेंट कैसे इस्तेमाल कर सकते हैं जिन्हें अभी तक प्रोसेस नहीं किया गया है, हमेशा किसी साफ़ तौर पर बताए गए इंटेंट के साथ वे इंटेंट रैप करें. इस सबसे सही तरीके को अपनाने के लिए, यहां दिया गया तरीका अपनाएं:
- पक्का करें कि बेस इंटेंट की कार्रवाई, पैकेज, और कॉम्पोनेंट फ़ील्ड हों सेट हैं.
-
FLAG_IMMUTABLE
का इस्तेमाल करें, लंबित इंटेंट बनाने के लिए, Android 6.0 (एपीआई लेवल 23) में जोड़ा गया. यह फ़्लैग इससे उन ऐप्लिकेशन को रोका जाता है जिन्हेंPendingIntent
भरने से रोका जाता है ऐसी प्रॉपर्टी जिनमें अपने-आप भरी गई जानकारी मौजूद नहीं है. अगर आपके ऐप्लिकेशन काminSdkVersion
है22
या इससे कम का विकल्प चुनने पर, आपके पास एक साथ सुरक्षा और साथ काम करने की सुविधा देने का विकल्प है इस कोड का इस्तेमाल करें:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
इंटेंट रिज़ॉल्यूशन
जब सिस्टम को किसी गतिविधि को शुरू करने के लिए, इंटेंट के बारे में जानकारी मिलती है, तो वह इंटेंट के लिए सबसे अच्छी गतिविधि खोजता है. इसके लिए, वह इंटेंट की तुलना तीन चीज़ों के आधार पर इंटेंट फ़िल्टर से करता है:
- ऐक्शन.
- डेटा (यूआरआई और डेटा टाइप दोनों).
- श्रेणी.
नीचे दिए गए सेक्शन में बताया गया है कि किसी ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में इंटेंट फ़िल्टर के एलान के हिसाब से, इंटेंट को सही कॉम्पोनेंट से कैसे मैच किया जाता है.
कार्रवाई की जांच
स्वीकार की गई इंटेंट कार्रवाइयों की जानकारी देने के लिए, इंटेंट फ़िल्टर शून्य या उससे ज़्यादा के लिए एलान कर सकता है
<action>
एलिमेंट, जैसा कि इस उदाहरण में दिखाया गया है:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
इस फ़िल्टर को पास करने के लिए, Intent
में बताई गई कार्रवाई
फ़िल्टर में दी गई किसी एक कार्रवाई से मेल खाना चाहिए.
अगर फ़िल्टर में किसी भी कार्रवाई को सूची में शामिल नहीं किया गया है, तो
इंटेंट का इस्तेमाल करें, ताकि सभी इंटेंट टेस्ट में फ़ेल हो जाएं. हालांकि, अगर Intent
किसी कार्रवाई के बारे में नहीं बताता है. यह टेस्ट में तब तक पास होता है, जब तक फ़िल्टर
कम से कम एक कार्रवाई शामिल हो.
कैटगरी टेस्ट
स्वीकार की गई इंटेंट कैटगरी की जानकारी देने के लिए, इंटेंट फ़िल्टर में शून्य या एक से ज़्यादा <category>
एलिमेंट शामिल किए जा सकते हैं. उदाहरण के लिए:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
कैटगरी टेस्ट में पास होने के लिए, Intent
में मौजूद हर कैटगरी
फ़िल्टर की किसी श्रेणी से मेल खाना चाहिए. इसके लिए उलट करना ज़रूरी नहीं है— इंटेंट फ़िल्टर हो सकता है
Intent
और
Intent
अब भी पास हो गया है. इसलिए, बिना किसी कैटगरी वाला इंटेंट
हमेशा इस टेस्ट को पास कर लेता है, भले ही फ़िल्टर में किसी भी कैटगरी का एलान किया गया हो.
ध्यान दें:
Android अपने-आप CATEGORY_DEFAULT
कैटगरी लागू कर देता है
startActivity()
और startActivityForResult()
को पास किए गए सभी इंप्लिसिट इंटेंट के साथ.
अगर आपको अपनी गतिविधि में इंप्लिसिट इंटेंट चाहिए, तो उसे
"android.intent.category.DEFAULT"
के लिए, उसके इंटेंट फ़िल्टर में कैटगरी शामिल करें, जैसे कि
पिछले <intent-filter>
उदाहरण में दिखाई गई है.
डेटा टेस्ट
स्वीकार किए गए इंटेंट डेटा की जानकारी देने के लिए, इंटेंट फ़िल्टर शून्य या उससे ज़्यादा का एलान कर सकता है
<data>
एलिमेंट, जैसा कि इस उदाहरण में दिखाया गया है:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
हर <data>
एलिमेंट, यूआरआई स्ट्रक्चर और डेटा टाइप (एमआईएमई मीडिया टाइप) के बारे में बता सकता है.
यूआरआई का हर हिस्सा एक अलग
एट्रिब्यूट: scheme
, host
, port
,
और path
:
<scheme>://<host>:<port>/<path>
यहां दिए गए उदाहरण में, इन एट्रिब्यूट के लिए संभावित वैल्यू दिखाई गई हैं:
content://com.example.project:200/folder/subfolder/etc
इस यूआरआई में, स्कीम content
है और होस्ट com.example.project
है,
पोर्ट 200
है और पाथ folder/subfolder/etc
है.
<data>
एलिमेंट में, इनमें से किसी भी एट्रिब्यूट को शामिल करना ज़रूरी नहीं है. हालांकि, इनमें लीनियर डिपेंडेंसी होती है:
- अगर कोई स्कीम तय नहीं की गई है, तो होस्ट को अनदेखा कर दिया जाता है.
- अगर कोई होस्ट नहीं बताया गया है, तो पोर्ट को अनदेखा कर दिया जाता है.
- अगर स्कीम और होस्ट, दोनों की जानकारी नहीं दी गई हो, तो पाथ को अनदेखा कर दिया जाता है.
जब किसी इंटेंट के यूआरआई की तुलना किसी फ़िल्टर के यूआरआई की खास बातों से की जाती है, तो इसकी तुलना सिर्फ़ फ़िल्टर में शामिल यूआरआई के हिस्सों से की जाती है. उदाहरण के लिए:
- अगर कोई फ़िल्टर सिर्फ़ किसी स्कीम के बारे में बताता है, तो उस स्कीम के सभी यूआरआई मेल खाते हैं फ़िल्टर.
- अगर कोई फ़िल्टर किसी स्कीम और संस्था के बारे में बताता है, लेकिन पाथ नहीं, तो सभी यूआरआई एक ही स्कीम और अधिकार से, फ़िल्टर को पास किया जाता है, भले ही उनका पाथ कुछ भी हो.
- अगर किसी फ़िल्टर में स्कीम, अथॉरिटी, और पाथ की जानकारी दी गई है, तो सिर्फ़ उसी स्कीम, अथॉरिटी, और पाथ वाले यूआरआई ही फ़िल्टर को पास करते हैं.
ध्यान दें: पाथ स्पेसिफ़िकेशन से एक वाइल्डकार्ड तारा चिह्न (*) होना चाहिए, जिसके लिए पथ के नाम का केवल आंशिक मिलान आवश्यक हो.
डेटा टेस्ट, इंटेंट में यूआरआई और एमआईएमई टाइप, दोनों की तुलना यूआरआई से करता है और MIME प्रकार भी दिया होता है. इसके नियम यहां दिए गए हैं:
- ऐसा इंटेंट जिसमें न तो कोई यूआरआई होता है और न ही MIME टाइप जांच केवल तभी करें, जब फ़िल्टर कोई यूआरआई या MIME प्रकार निर्दिष्ट न करे.
- ऐसा इंटेंट जिसमें यूआरआई शामिल हो, लेकिन MIME टाइप मौजूद न हो (न तो साफ़ तौर पर और न ही अनुमान से जुड़ा यूआरआई) जांच में सिर्फ़ तब पास होती है, जब इसका यूआरआई, फ़िल्टर के यूआरआई फ़ॉर्मैट से मेल खाता है और इसी तरह फ़िल्टर MIME टाइप तय नहीं करता.
- ऐसा इंटेंट जिसमें MIME टाइप होता है, लेकिन यूआरआई शामिल नहीं होता सिर्फ़ तब, जब फ़िल्टर में एक ही एमआईएमई टाइप की सूची हो और यूआरआई फ़ॉर्मैट तय न किया गया हो.
- ऐसा इंटेंट जिसमें एक यूआरआई और एमआईएमई टाइप, दोनों शामिल होते हैं. ऐसा इंटेंट
यूआरआई) जांच का MIME टाइप वाला हिस्सा सिर्फ़ तब पास करता है, जब वह
प्रकार, फ़िल्टर में दिए गए किसी टाइप से मेल खाता है. यह जांच के यूआरआई वाले हिस्से में पास हो जाता है
अगर इसका यूआरआई, फ़िल्टर के यूआरआई से मेल खाता है या फिर उसमें
content:
है याfile:
यूआरआई और फ़िल्टर यूआरआई के बारे में नहीं बताता. दूसरे शब्दों में, यह माना जाता है कि कॉम्पोनेंटcontent:
औरfile:
डेटा के साथ काम करेगा, अगर इसके फ़िल्टर में सिर्फ़ MIME टाइप मौजूद होता है.
ध्यान दें: अगर कोई इंटेंट यूआरआई या MIME टाइप तय करता है, तो डेटा टेस्ट
अगर <intent-filter>
में कोई <data>
एलिमेंट नहीं है, तो फ़ेल हो जाएगा.
यह आखिरी नियम, नियम (d), उम्मीद के बारे में बताता है
ये कॉम्पोनेंट किसी फ़ाइल या कॉन्टेंट देने वाले से लोकल डेटा ले सकते हैं.
इसलिए, उनके फ़िल्टर में सिर्फ़ डेटा टाइप शामिल किया जा सकता है. इन फ़िल्टर की मदद से,
content:
और file:
स्कीम का नाम रखें.
नीचे दिए गए उदाहरण में, एक सामान्य केस दिखाया गया है, जिसमें <data>
एलिमेंट शामिल है
Android को बताता है कि यह कॉम्पोनेंट किसी कॉन्टेंट से इमेज डेटा ले सकता है
कंपनी और इसे दिखाएं:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
ऐसे फ़िल्टर डेटा टाइप बताएं, लेकिन यूआरआई नहीं है, क्योंकि ज़्यादातर उपलब्ध हैं डेटा को कॉन्टेंट उपलब्ध कराने वालों से बांटा जाता है.
दूसरा सामान्य कॉन्फ़िगरेशन, स्कीम और डेटा टाइप वाला फ़िल्टर है. उदाहरण के लिए, यहां दिए गए <data>
एलिमेंट से Android को पता चलता है कि कार्रवाई करने के लिए, कॉम्पोनेंट नेटवर्क से वीडियो डेटा हासिल कर सकता है:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
इंटेंट मैचिंग
इंटेंट को इंटेंट फ़िल्टर से मैच किया जाता है, न सिर्फ़ टारगेट को खोजने के लिए
चलाने के लिए, लेकिन साथ ही सामग्री के सेट के बारे में कुछ
कॉम्पोनेंट भी जोड़े जा सकते हैं. उदाहरण के लिए, Home ऐप्लिकेशन, ऐप्लिकेशन लॉन्चर में ACTION_MAIN
कार्रवाई और CATEGORY_LAUNCHER
कैटगरी की जानकारी देने वाले इंटेंट फ़िल्टर की मदद से, सभी गतिविधियों को ढूंढता है.
मैच सिर्फ़ तब सफल होता है, जब इंटेंट में मौजूद कार्रवाइयों और कैटगरी का मैच हो
IntentFilter
के दस्तावेज़ में बताए गए तरीके से फ़िल्टर करें
क्लास.
आपका ऐप्लिकेशन, इंटेंट मैचिंग का इस्तेमाल उसी तरह कर सकता है जिस तरह Home ऐप्लिकेशन करता है.
PackageManager
में query...()
तरीकों का एक सेट होता है, जो किसी खास इंटेंट को स्वीकार करने वाले सभी कॉम्पोनेंट दिखाता है. साथ ही, resolve...()
तरीकों की एक ऐसी ही सीरीज़ होती है जो किसी इंटेंट का जवाब देने के लिए सबसे अच्छा कॉम्पोनेंट तय करती है. उदाहरण के लिए,
queryIntentActivities()
उन सभी गतिविधियों की सूची दिखाता है जो आर्ग्युमेंट के तौर पर पास किए गए इंटेंट को पूरा कर सकती हैं. वहीं, queryIntentServices()
सेवाओं की एक जैसी सूची दिखाता है.
इनमें से कोई भी तरीका, कॉम्पोनेंट को चालू नहीं करता. ये सिर्फ़ उन कॉम्पोनेंट की सूची बनाते हैं जो जवाब दे सकते हैं. ब्रॉडकास्ट रिसीवर के लिए भी एक मिलता-जुलता तरीका है,
queryBroadcastReceivers()
.