उपयोगकर्ता को किसी अन्य ऐप्लिकेशन पर भेजना

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

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

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

इंप्लिसिट इंटेंट बनाएं

इंप्लिसिट इंटेंट, शुरू करने के लिए कॉम्पोनेंट के क्लास नाम का एलान नहीं करते, बल्कि करने के लिए कार्रवाई. यह कार्रवाई वह तय करती है जिसे आप करना चाहते हैं, जैसे कि view, कुछ बदलाव करें, भेजें या पाएं.

इंटेंट से जुड़ी कार्रवाइयों को डेटा से जोड़ें

इंटेंट में अक्सर उससे जुड़ा डेटा भी शामिल होता है से संबंधित कार्रवाई के साथ, जैसे कि वह पता जिसे आप देखना चाहते हैं या वह ईमेल संदेश जिसे आप भेजना चाहते हैं. आपको जो इंटेंट बनाना है उसके आधार पर, डेटा Uri हो सकता है. डेटा टाइप में से किसी एक को चुनें या हो सकता है इंटेंट के हिसाब से डेटा की ज़रूरत ही न हो.

अगर आपका डेटा Uri है, तो यहां एक सामान्य Intent() कंस्ट्रक्टर है, जिसका इस्तेमाल करके ऐक्शन तय किया जा सकता है और डेटा शामिल है.

उदाहरण के लिए, टेलीफ़ोन नंबर बताने के लिए Uri डेटा का इस्तेमाल करके, फ़ोन कॉल शुरू करने के लिए इंटेंट बनाने का तरीका यहां बताया गया है:

Kotlin

val callIntent: Intent = Uri.parse("tel:5551234").let { number ->
    Intent(Intent.ACTION_DIAL, number)
}

Java

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

जब आपका ऐप्लिकेशन startActivity() को कॉल करके इस इंटेंट को शुरू करता है, तो फ़ोन ऐप्लिकेशन दिए गए फ़ोन नंबर पर कॉल शुरू कर देता है.

यहां कुछ अन्य इंटेंट, उनकी कार्रवाई और Uri का डेटा दिया गया है जोड़े:

मैप देखें

Kotlin

// Map point based on address
val mapIntent: Intent = Uri.parse(
        "geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"
).let { location ->
    // Or map point based on latitude/longitude
    // val location: Uri = Uri.parse("geo:37.422219,-122.08364?z=14") // z param is zoom level
    Intent(Intent.ACTION_VIEW, location)
}

Java

// Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

कोई वेब पेज देखें

Kotlin

val webIntent: Intent = Uri.parse("https://www.android.com").let { webpage ->
    Intent(Intent.ACTION_VIEW, webpage)
}

Java

Uri webpage = Uri.parse("https://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

किसी इंटेंट में ज़्यादा चीज़ें जोड़ना

अन्य तरह के इंप्लिसिट इंटेंट के लिए "अतिरिक्त" की ज़रूरत होती है डेटा जो अलग-अलग तरह का डेटा देता है, जैसे कि स्ट्रिंग. putExtra() के अलग-अलग तरीकों का इस्तेमाल करके, एक या एक से ज़्यादा अतिरिक्त डेटा जोड़ा जा सकता है.

डिफ़ॉल्ट रूप से, सिस्टम इस आधार पर एक इंटेंट के लिए ज़रूरी MIME टाइप तय करता है Uri का डेटा शामिल है. अगर आप Uri को इंटेंट के आधार पर, आपको आम तौर पर टाइप बताने के लिए setType() का इस्तेमाल करना चाहिए इंटेंट से जुड़े डेटा का. MIME टाइप को सेट करने से यह तय होता है कि किस तरह के गतिविधियों को इंटेंट मिलना चाहिए.

यहां कुछ और इंटेंट दिए गए हैं जो मनचाही कार्रवाई तय करने के लिए अतिरिक्त डेटा जोड़ते हैं:

अटैचमेंट के साथ ईमेल भेजना

Kotlin

Intent(Intent.ACTION_SEND).apply {
    // The intent does not have a URI, so declare the "text/plain" MIME type
    type = "text/plain"
    putExtra(Intent.EXTRA_EMAIL, arrayOf("jan@example.com")) // recipients
    putExtra(Intent.EXTRA_SUBJECT, "Email subject")
    putExtra(Intent.EXTRA_TEXT, "Email message text")
    putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"))
    // You can also attach multiple items by passing an ArrayList of Uris
}

Java

Intent emailIntent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jan@example.com"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris

कोई कैलेंडर इवेंट बनाना

ध्यान दें: कैलेंडर इवेंट के लिए यह इंटेंट, सिर्फ़ एपीआई के साथ काम करता है लेवल 14 और उससे ऊपर का लेवल.

Kotlin

// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM.
Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply {
    val beginTime: Calendar = Calendar.getInstance().apply {
        set(2021, 0, 23, 7, 30)
    }
    val endTime = Calendar.getInstance().apply {
        set(2021, 0, 23, 10, 30)
    }
    putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.timeInMillis)
    putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.timeInMillis)
    putExtra(Events.TITLE, "Ninja class")
    putExtra(Events.EVENT_LOCATION, "Secret dojo")
}

Java

// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM.
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance();
beginTime.set(2021, 0, 23, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2021, 0, 23, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

ध्यान दें: यह ज़रूरी है कि आप अपने Intent को ज़्यादा से ज़्यादा सटीक बनाएं. उदाहरण के लिए, अगर आपको Google Ads में ACTION_VIEW इंटेंट का इस्तेमाल करके, आपको MIME टाइप image/*. इससे उन ऐप्लिकेशन को रोका जाता है जो "देख" सकते हैं अन्य प्रकार के डेटा (जैसे कि मैप ऐप्लिकेशन) को इंटेंट से ट्रिगर हुआ हो.

इंटेंट के साथ कोई गतिविधि शुरू करें

अपना Intent बनाने और अतिरिक्त जानकारी सेट करने के बाद, startActivity() को कॉल करके उसे सिस्टम को भेजें:

Kotlin

startActivity(intent)

Java

startActivity(intent);

ऐसी स्थिति को मैनेज करें जिसमें किसी ऐप्लिकेशन को इंटेंट न मिले

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

Kotlin

try {
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // Define what your app should do if no activity can handle the intent.
}

Java

try {
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // Define what your app should do if no activity can handle the intent.
}

इस अपवाद को पहचानने के बाद, तय करें कि आपके ऐप्लिकेशन को आगे क्या करना चाहिए. यह अगला चरण उस इंटेंट की विशिष्ट विशेषताओं पर निर्भर करता है जिसका आपने प्रयास किया था शुरू करना. उदाहरण के लिए, अगर आपको किसी ऐसे ऐप्लिकेशन के बारे में पता है जो इंटेंट को मैनेज कर सकता है, उपयोगकर्ता को ऐप्लिकेशन डाउनलोड करने के लिए लिंक दें. जानें कि Google Play पर अपने प्रॉडक्ट से लिंक करें.

साफ़ तौर पर जानकारी देने वाला डायलॉग बॉक्स

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

एक पैनल दिखेगा
  मिलते-जुलते लेखों की हेडलाइन रखें. इस पैनल में उन अलग-अलग ऐप्लिकेशन की सूची होती है जो
  इंटेंट को हैंडल करें.

पहला डायग्राम. चुने गए विकल्प का उदाहरण यह डायलॉग बॉक्स तब दिखता है, जब एक से ज़्यादा ऐप्लिकेशन, इंटेंट को हैंडल कर सकते हैं.

पूरा उदाहरण

यहां एक पूरा उदाहरण दिया गया है, जो मैप को देखने के लिए इंटेंट बनाने का तरीका दिखाता है. साथ ही, पुष्टि करें कि ऐप्लिकेशन मौजूद है, तो इंटेंट को हैंडल करें, फिर इसे शुरू करें:

Kotlin

// Build the intent.
val location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California")
val mapIntent = Intent(Intent.ACTION_VIEW, location)

// Try to invoke the intent.
try {
    startActivity(mapIntent)
} catch (e: ActivityNotFoundException) {
    // Define what your app should do if no activity can handle the intent.
}

Java

// Build the intent.
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Try to invoke the intent.
try {
    startActivity(mapIntent);
} catch (ActivityNotFoundException e) {
    // Define what your app should do if no activity can handle the intent.
}

ऐप्लिकेशन चुनने का टूल दिखाएं

दूसरा डायग्राम. चुनने के लिए डायलॉग बॉक्स.

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

हालांकि, अगर की जाने वाली कार्रवाई को कई ऐप्लिकेशन मैनेज कर सकते हैं और उपयोगकर्ता को हर बार किसी दूसरे ऐप्लिकेशन को पसंद करते हैं, जैसे कि "शेयर करना" कार्रवाई होती है, जिसके लिए उपयोगकर्ता के पास कई ऐसे ऐप्लिकेशन जिनके ज़रिए वे किसी आइटम को शेयर कर सकते हैं—आपको साफ़ तौर पर चुनने के लिए डायलॉग बॉक्स दिखाना चाहिए जैसा कि दूसरी इमेज में दिखाया गया है. चुनने वाले का डायलॉग बॉक्स उपयोगकर्ता को हर बार यह चुनने के लिए मजबूर करता है कि कार्रवाई के लिए किस ऐप्लिकेशन का इस्तेमाल करना है (उपयोगकर्ता डिफ़ॉल्ट ऐप्लिकेशन).

चुनने वाले को दिखाने के लिए, createChooser() का इस्तेमाल करके Intent बनाएं और उसे startActivity() को पास करें. उदाहरण के लिए:

Kotlin

val intent = Intent(Intent.ACTION_SEND)

// Create intent to show chooser
val chooser = Intent.createChooser(intent, /* title */ null)

// Try to invoke the intent.
try {
    startActivity(chooser)
} catch (e: ActivityNotFoundException) {
    // Define what your app should do if no activity can handle the intent.
}

Java

Intent intent = new Intent(Intent.ACTION_SEND);

// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, /* title */ null);

// Try to invoke the intent.
try {
    startActivity(chooser);
} catch (ActivityNotFoundException e) {
    // Define what your app should do if no activity can handle the intent.
}

ऐसा करने पर, ऐप्लिकेशन की सूची के साथ एक डायलॉग दिखता है. इसमें, पास किए गए इंटेंट के हिसाब से काम करने वाले ऐप्लिकेशन की सूची होती है createChooser() तरीके में. title पैरामीटर अगर कार्रवाई ACTION_SEND या ACTION_SEND_MULTIPLE नहीं है, तो दी गई होगी