टास्क, ऐसी गतिविधियों का कलेक्शन होता है जिनसे उपयोगकर्ता आपके ऐप्लिकेशन में कुछ करने की कोशिश करते समय इंटरैक्ट करते हैं. इन गतिविधियों को एक स्टैक में व्यवस्थित किया जाता है. इसे बैक स्टैक कहा जाता है. इसमें हर गतिविधि को खोले जाने के क्रम में व्यवस्थित किया जाता है.
उदाहरण के लिए, किसी ईमेल ऐप्लिकेशन में नए मैसेज की सूची दिखाने के लिए, एक गतिविधि हो सकती है. जब उपयोगकर्ता कोई मैसेज चुनता है, तो उस मैसेज को देखने के लिए एक नई गतिविधि खुलती है. यह नई गतिविधि, पिछली गतिविधियों की सूची में जुड़ जाती है. इसके बाद, जब उपयोगकर्ता 'वापस जाएं' बटन पर टैप करता है या जेस्चर का इस्तेमाल करता है, तो वह नई गतिविधि बंद हो जाती है और स्टैक से हट जाती है.
किसी टास्क की लाइफ़साइकल और उसकी पिछली गतिविधियां
डिवाइस की होम स्क्रीन से ही ज़्यादातर टास्क शुरू किए जाते हैं. जब कोई उपयोगकर्ता ऐप्लिकेशन लॉन्चर या होम स्क्रीन पर किसी ऐप्लिकेशन या शॉर्टकट के आइकॉन पर टैप करता है, तो उस ऐप्लिकेशन का टास्क फ़ोरग्राउंड में आ जाता है. अगर ऐप्लिकेशन के लिए कोई टास्क मौजूद नहीं है, तो एक नया टास्क बनाया जाता है. साथ ही, उस ऐप्लिकेशन की मुख्य गतिविधि, स्टैक में रूट गतिविधि के तौर पर खुलती है.
जब मौजूदा गतिविधि कोई दूसरी गतिविधि शुरू करती है, तो नई गतिविधि को स्टैक में सबसे ऊपर पुश किया जाता है और उस पर फ़ोकस किया जाता है. पिछली गतिविधि स्टैक में बनी रहती है, लेकिन उसे रोक दिया जाता है. जब कोई गतिविधि रोकी जाती है, तो सिस्टम उसके यूज़र इंटरफ़ेस की मौजूदा स्थिति को बनाए रखता है. जब उपयोगकर्ता वापस जाने की कार्रवाई करता है, तो मौजूदा गतिविधि को स्टैक के सबसे ऊपर से हटा दिया जाता है और उसे खत्म कर दिया जाता है. पिछली गतिविधि फिर से शुरू हो जाती है और उसके यूज़र इंटरफ़ेस (यूआई) की पिछली स्थिति वापस आ जाती है.
स्टैक में मौजूद गतिविधियों को कभी भी फिर से व्यवस्थित नहीं किया जाता. उन्हें सिर्फ़ तब पुश किया जाता है, जब वे शुरू होती हैं. साथ ही, 'वापस जाएं' बटन या जेस्चर का इस्तेमाल करके खारिज किए जाने पर, उन्हें पॉप किया जाता है. इसलिए, पिछली गतिविधियां लास्ट इन, फ़र्स्ट आउट स्ट्रक्चर के तौर पर काम करती हैं, जैसा कि पहली इमेज में दिखाया गया है.
जब उपयोगकर्ता, बैक बटन पर टैप करता है या जेस्चर का इस्तेमाल करता है, तो स्टैक में मौजूद हर गतिविधि पॉप-ऑफ़ हो जाती है. इससे पिछली गतिविधि दिखती है. ऐसा तब तक होता है, जब तक उपयोगकर्ता होम स्क्रीन पर वापस नहीं आ जाता या उस गतिविधि पर वापस नहीं आ जाता जो टास्क शुरू होने पर चल रही थी. जब स्टैक से सभी गतिविधियां हटा दी जाती हैं, तो टास्क मौजूद नहीं रहता.
रूट लॉन्चर की गतिविधियों के लिए, बैक टैप का व्यवहार
रूट लॉन्चर ऐक्टिविटी ऐसी ऐक्टिविटी होती हैं जो ACTION_MAIN और CATEGORY_LAUNCHER, दोनों के साथ इंटेंट फ़िल्टर का एलान करती हैं. ये गतिविधियां खास होती हैं, क्योंकि ये ऐप्लिकेशन लॉन्चर से आपके ऐप्लिकेशन में एंट्री पॉइंट के तौर पर काम करती हैं. साथ ही, इनका इस्तेमाल किसी टास्क को शुरू करने के लिए किया जाता है.
जब कोई उपयोगकर्ता रूट लॉन्चर गतिविधि से वापस जाने के लिए टैप करता है या जेस्चर का इस्तेमाल करता है, तो सिस्टम इवेंट को अलग तरीके से मैनेज करता है. यह इस बात पर निर्भर करता है कि डिवाइस पर Android का कौनसा वर्शन चल रहा है.
- Android 11 और इससे पहले के वर्शन पर सिस्टम के काम करने का तरीका
- सिस्टम, गतिविधि को पूरा करता है.
- Android 12 और इसके बाद के वर्शन पर सिस्टम का काम करने का तरीका
सिस्टम, गतिविधि को खत्म करने के बजाय, गतिविधि और उसके टास्क को बैकग्राउंड में ले जाता है. यह व्यवहार, होम बटन या जेस्चर का इस्तेमाल करके किसी ऐप्लिकेशन से बाहर निकलने पर, सिस्टम के डिफ़ॉल्ट व्यवहार से मेल खाता है.
ज़्यादातर मामलों में, इस व्यवहार का मतलब है कि उपयोगकर्ता आपके ऐप्लिकेशन को कोल्ड स्टेट से पूरी तरह से रीस्टार्ट करने के बजाय, वॉर्म स्टेट से ज़्यादा तेज़ी से फिर से शुरू कर सकते हैं.
अगर आपको कस्टम पीछे जाने की प्रोसेस उपलब्ध करानी है, तो हमारा सुझाव है कि आप
onBackPressed()को बदलने के बजाय, AndroidX ऐक्टिविटी एपीआई का इस्तेमाल करें. अगर सिस्टम के बैक टैप को इंटरसेप्ट करने वाला कोई कॉम्पोनेंट नहीं है, तो AndroidX Activity API अपने-आप सही सिस्टम व्यवहार को लागू कर देते हैं.हालांकि, अगर आपका ऐप्लिकेशन बैक नेविगेशन को हैंडल करने और गतिविधि को पूरा करने के लिए,
onBackPressed()को बदल देता है, तो अपने लागू करने के तरीके को अपडेट करें, ताकि गतिविधि को पूरा करने के बजायsuper.onBackPressed()को कॉल किया जा सके.super.onBackPressed()को कॉल करने से, ज़रूरत पड़ने पर गतिविधि और उसके टास्क को बैकग्राउंड में ले जाया जाता है. साथ ही, इससे उपयोगकर्ताओं को सभी ऐप्लिकेशन में नेविगेशन का बेहतर अनुभव मिलता है.
बैकग्राउंड और फ़ोरग्राउंड टास्क
टास्क, एक जैसी गतिविधियों का ग्रुप होता है. जब कोई उपयोगकर्ता नया टास्क शुरू करता है या होम स्क्रीन पर जाता है, तो मौजूदा टास्क बैकग्राउंड में चला जाता है. बैकग्राउंड में होने पर, टास्क की सभी गतिविधियां रुक जाती हैं. हालांकि, टास्क के लिए पिछली गतिविधियां सेव रहती हैं. टास्क का फ़ोकस हट जाता है और दूसरा टास्क शुरू हो जाता है, जैसा कि इमेज 2 में दिखाया गया है. इसके बाद, टास्क को फ़ोरग्राउंड पर वापस लाया जा सकता है, ताकि उपयोगकर्ता वहीं से शुरू कर सकें जहां उन्होंने छोड़ा था.
मौजूदा टास्क A के लिए, यहां दिए गए टास्क फ़्लो पर गौर करें. इसके स्टैक में तीन गतिविधियां हैं. इनमें से दो गतिविधियां, मौजूदा गतिविधि के तहत आती हैं:
उपयोगकर्ता, होम बटन या जेस्चर का इस्तेमाल करता है. इसके बाद, ऐप्लिकेशन लॉन्चर से कोई नया ऐप्लिकेशन चालू करता है.
होम स्क्रीन दिखने पर, टास्क A बैकग्राउंड में चला जाता है. जब नया ऐप्लिकेशन शुरू होता है, तो सिस्टम उस ऐप्लिकेशन के लिए एक टास्क (टास्क B) शुरू करता है. इसमें गतिविधियों का अपना स्टैक होता है.
उस ऐप्लिकेशन से इंटरैक्ट करने के बाद, उपयोगकर्ता फिर से होम स्क्रीन पर वापस आता है और उस ऐप्लिकेशन को चुनता है जिससे टास्क A शुरू हुआ था.
अब, टास्क A फ़ोरग्राउंड में आ जाता है. इसके स्टैक में मौजूद तीनों गतिविधियां पहले जैसी ही रहती हैं. साथ ही, स्टैक में सबसे ऊपर मौजूद गतिविधि फिर से शुरू हो जाती है. इस समय, उपयोगकर्ता होम पर जाकर और उस टास्क को शुरू करने वाले ऐप्लिकेशन आइकॉन को चुनकर या हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की स्क्रीन से ऐप्लिकेशन के टास्क को चुनकर, टास्क B पर वापस जा सकता है.
एक से ज़्यादा गतिविधि इंस्टेंस
पिछली गतिविधियों के स्टैक में मौजूद गतिविधियों को कभी भी फिर से व्यवस्थित नहीं किया जाता. इसलिए, अगर आपका ऐप्लिकेशन उपयोगकर्ताओं को एक से ज़्यादा गतिविधियों से कोई खास गतिविधि शुरू करने की अनुमति देता है, तो उस गतिविधि का एक नया इंस्टेंस बनाया जाता है और उसे स्टैक में पुश किया जाता है. ऐसा करने पर, गतिविधि के किसी भी पिछले इंस्टेंस को सबसे ऊपर नहीं लाया जाता. इस वजह से, आपके ऐप्लिकेशन में मौजूद किसी गतिविधि को कई बार इंस्टैंशिएट किया जा सकता है. भले ही, वह गतिविधि अलग-अलग टास्क से जुड़ी हो. जैसा कि इमेज 3 में दिखाया गया है.
अगर उपयोगकर्ता, 'वापस जाएं' बटन या जेस्चर का इस्तेमाल करके पीछे की ओर नेविगेट करता है, तो गतिविधि के इंस्टेंस उसी क्रम में दिखते हैं जिस क्रम में वे खोले गए थे. हर इंस्टेंस की अपनी यूआई स्थिति होती है. हालांकि, अगर आपको किसी गतिविधि को एक से ज़्यादा बार इंस्टैंशिएट नहीं करना है, तो इस व्यवहार में बदलाव किया जा सकता है. ज़्यादा जानकारी के लिए, टास्क मैनेज करना लेख पढ़ें.
मल्टी-विंडो एनवायरमेंट
जब ऐप्लिकेशन, मल्टी-विंडो एनवायरमेंट में एक साथ काम करते हैं, तो सिस्टम हर विंडो के लिए टास्क को अलग-अलग मैनेज करता है. यह सुविधा, Android 7.0 (एपीआई लेवल 24) और इसके बाद के वर्शन पर काम करती है. हर विंडो में कई टास्क हो सकते हैं. Chromebook पर चलने वाले Android ऐप्लिकेशन के लिए भी यही बात लागू होती है: सिस्टम, हर विंडो के हिसाब से टास्क या टास्क के ग्रुप मैनेज करता है.
लाइफ़साइकल का रीकैप
गतिविधियों और टास्क के लिए डिफ़ॉल्ट ऐक्शन और सेटिंग की खास जानकारी:
जब गतिविधि A, गतिविधि B को शुरू करती है, तो गतिविधि A रुक जाती है. हालांकि, सिस्टम उसकी स्थिति को बनाए रखता है. जैसे, स्क्रोल करने की पोज़िशन और फ़ॉर्म में डाला गया कोई भी टेक्स्ट. अगर उपयोगकर्ता गतिविधि B में रहते हुए, टैप करता है या बैक जेस्चर का इस्तेमाल करता है, तो गतिविधि A अपनी पहले वाली स्थिति में फिर से शुरू हो जाती है.
जब उपयोगकर्ता होम बटन या जेस्चर का इस्तेमाल करके किसी टास्क को छोड़ता है, तो मौजूदा गतिविधि बंद हो जाती है और उसका टास्क बैकग्राउंड में चला जाता है. सिस्टम, टास्क में मौजूद हर गतिविधि की स्थिति को सेव रखता है. अगर उपयोगकर्ता बाद में टास्क शुरू करने वाले लॉन्चर आइकॉन को चुनकर टास्क को फिर से शुरू करता है, तो टास्क फ़ोरग्राउंड में आ जाता है. साथ ही, स्टैक में सबसे ऊपर मौजूद गतिविधि फिर से शुरू हो जाती है.
अगर उपयोगकर्ता 'वापस जाएं' बटन पर टैप करता है या जेस्चर का इस्तेमाल करता है, तो मौजूदा गतिविधि को स्टैक से हटा दिया जाता है और उसे बंद कर दिया जाता है. स्टैक में मौजूद पिछली गतिविधि फिर से शुरू हो जाती है. जब कोई गतिविधि बंद हो जाती है, तो सिस्टम उसकी स्थिति को सेव नहीं करता.
Android 12 (एपीआई लेवल 31) और इसके बाद के वर्शन पर, रूट लॉन्चर ऐक्टिविटी के लिए यह तरीका अलग होता है.
गतिविधियों को कई बार इंस्टैंशिएट किया जा सकता है. यहां तक कि अन्य टास्क से भी.
कार्य प्रबंधित करना
Android, टास्क और पिछली गतिविधियों को मैनेज करता है. इसके लिए, वह एक ही टास्क में शुरू की गई सभी गतिविधियों को एक के बाद एक, लास्ट इन, फ़र्स्ट आउट स्टैक में रखता है. यह ज़्यादातर ऐप्लिकेशन के लिए बहुत अच्छा काम करता है. आम तौर पर, आपको इस बात की चिंता करने की ज़रूरत नहीं होती कि आपकी गतिविधियां, टास्क से कैसे जुड़ी हैं या वे पिछली गतिविधियों में कैसे मौजूद हैं.
हालांकि, आपके पास सामान्य व्यवहार में रुकावट डालने का विकल्प होता है. उदाहरण के लिए, हो सकता है कि आप अपने ऐप्लिकेशन में किसी गतिविधि को मौजूदा टास्क में रखने के बजाय, शुरू होने पर एक नया टास्क शुरू करना चाहें. इसके अलावा, कोई गतिविधि शुरू करते समय, हो सकता है कि आपको पिछली गतिविधियों के सबसे ऊपर नया इंस्टेंस बनाने के बजाय, उसका कोई मौजूदा इंस्टेंस आगे लाना हो. इसके अलावा, ऐसा भी हो सकता है कि जब उपयोगकर्ता टास्क को छोड़े, तो आपको पिछली गतिविधियों की सूची से रूट गतिविधि को छोड़कर, सभी गतिविधियों को हटाना हो.
<activity> मेनिफ़ेस्ट एलिमेंट में एट्रिब्यूट और startActivity() को पास किए जाने वाले इंटेंट में फ़्लैग का इस्तेमाल करके, ये और अन्य काम किए जा सकते हैं.
ये मुख्य <activity> एट्रिब्यूट हैं. इनका इस्तेमाल करके, टास्क मैनेज किए जा सकते हैं:
taskAffinitylaunchModeallowTaskReparentingclearTaskOnLaunchalwaysRetainTaskStatefinishOnTaskLaunch
इन इंटेंट फ़्लैग का इस्तेमाल किया जा सकता है:
यहां दिए गए सेक्शन में, मेनिफ़ेस्ट एट्रिब्यूट और इंटेंट फ़्लैग इस्तेमाल करने का तरीका बताया गया है. इससे यह तय किया जा सकता है कि गतिविधियां, टास्क से कैसे जुड़ती हैं और पिछली गतिविधियों में वे कैसे काम करती हैं.
यहां दिए गए सेक्शन में यह भी बताया गया है कि सिस्टम, हाल ही की स्क्रीन में टास्क और गतिविधियों को कैसे दिखाता और मैनेज करता है. आम तौर पर, सिस्टम यह तय करता है कि हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की स्क्रीन पर, आपके टास्क और गतिविधियां कैसे दिखें. आपको इस सेटिंग में बदलाव करने की ज़रूरत नहीं होती. ज़्यादा जानकारी के लिए, हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की स्क्रीन देखें.
लॉन्च मोड तय करना
लॉन्च मोड की मदद से, यह तय किया जा सकता है कि किसी गतिविधि का नया इंस्टेंस, मौजूदा टास्क से कैसे जुड़ा है. लॉन्च मोड को दो तरीकों से तय किया जा सकता है. इनके बारे में यहां बताया गया है:
मेनिफ़ेस्ट फ़ाइल का इस्तेमाल करना
मेनिफ़ेस्ट फ़ाइल में किसी गतिविधि के बारे में बताते समय, यह तय किया जा सकता है कि गतिविधि शुरू होने पर, वह टास्क से कैसे जुड़ेगी.
इंटेंट फ़्लैग का इस्तेमाल करना
startActivity()को कॉल करते समय,Intentमें एक फ़्लैग शामिल किया जा सकता है. इससे यह पता चलता है कि नई गतिविधि, मौजूदा टास्क से कैसे जुड़ी है या जुड़ी है भी या नहीं.
इसलिए, अगर ऐक्टिविटी A, ऐक्टिविटी B को शुरू करती है, तो ऐक्टिविटी B अपने मेनिफ़ेस्ट में यह तय कर सकती है कि वह मौजूदा टास्क से कैसे जुड़ेगी. साथ ही, ऐक्टिविटी A, इंटेंट फ़्लैग का इस्तेमाल करके यह अनुरोध कर सकती है कि ऐक्टिविटी B, मौजूदा टास्क से कैसे जुड़ सकती है.
अगर दोनों गतिविधियां यह तय करती हैं कि गतिविधि B किसी टास्क से कैसे जुड़ी है, तो इंटेंट में तय किए गए गतिविधि A के अनुरोध को, गतिविधि B के मेनिफ़ेस्ट में तय किए गए अनुरोध के मुकाबले ज़्यादा प्राथमिकता दी जाती है.
मेनिफ़ेस्ट फ़ाइल का इस्तेमाल करके लॉन्च मोड तय करना
अपनी मेनिफ़ेस्ट फ़ाइल में किसी गतिविधि के बारे में बताते समय, यह तय किया जा सकता है कि वह गतिविधि किसी टास्क से कैसे जुड़ी है. इसके लिए, <activity> एलिमेंट के launchMode एट्रिब्यूट का इस्तेमाल करें.
launchMode एट्रिब्यूट को पांच लॉन्च मोड असाइन किए जा सकते हैं:
"standard"- डिफ़ॉल्ट मोड. सिस्टम, उस टास्क में गतिविधि का एक नया इंस्टेंस बनाता है जिससे इसे शुरू किया गया था. साथ ही, इंटेंट को उस पर रूट करता है. गतिविधि को कई बार इंस्टैंशिएट किया जा सकता है. हर इंस्टेंस अलग-अलग टास्क से जुड़ा हो सकता है. साथ ही, एक टास्क के कई इंस्टेंस हो सकते हैं.
"singleTop"- अगर मौजूदा टास्क के सबसे ऊपर, गतिविधि का कोई इंस्टेंस पहले से मौजूद है, तो सिस्टम इंटेंट को उस इंस्टेंस पर भेजता है. इसके लिए, वह गतिविधि का नया इंस्टेंस बनाने के बजाय,
onNewIntent()तरीके को कॉल करता है. गतिविधि को कई बार इंस्टैंशिएट किया जाता है. हर इंस्टेंस अलग-अलग टास्क से जुड़ा हो सकता है. साथ ही, एक टास्क में कई इंस्टेंस हो सकते हैं. हालांकि, ऐसा सिर्फ़ तब होता है, जब पिछली गतिविधियों के सबसे ऊपर मौजूद गतिविधि, गतिविधि का कोई मौजूदा इंस्टेंस न हो.
उदाहरण के लिए, मान लें कि किसी टास्क की पिछली गतिविधियों में रूट गतिविधि A के ऊपर गतिविधि B, C, और D हैं. इसलिए, स्टैक A-B-C-D है और D सबसे ऊपर है. D टाइप की गतिविधि के लिए, एक इंटेंट आता है. अगर D का लॉन्च मोड डिफ़ॉल्ट
"standard"है, तो क्लास का एक नया इंस्टेंस लॉन्च होता है और स्टैक A-B-C-D-D बन जाता है. हालांकि, अगर D का लॉन्च मोड"singleTop"है, तो D के मौजूदा इंस्टेंस कोonNewIntent()के ज़रिए इंटेंट मिलता है. ऐसा इसलिए होता है, क्योंकि यह स्टैक में सबसे ऊपर होता है और स्टैक A-B-C-D ही रहता है. वहीं, अगर टाइप B की किसी गतिविधि के लिए इंटेंट आता है, तो स्टैक में B का एक नया इंस्टेंस जोड़ दिया जाता है. भले ही, उसका लॉन्च मोड"singleTop"हो."singleTask"- सिस्टम, किसी नए टास्क के रूट पर गतिविधि बनाता है या एक जैसी अफ़िनिटी वाले किसी मौजूदा टास्क पर गतिविधि का पता लगाता है. अगर गतिविधि का कोई इंस्टेंस पहले से मौजूद है, तो सिस्टम इंटेंट को नए इंस्टेंस बनाने के बजाय,
onNewIntent()तरीके को कॉल करके मौजूदा इंस्टेंस पर रूट करता है. इस दौरान, इसके ऊपर मौजूद अन्य सभी गतिविधियां बंद हो जाती हैं.
"singleInstance"- इसका व्यवहार
"singleTask"जैसा ही होता है. हालांकि, सिस्टम उस टास्क में कोई अन्य गतिविधि लॉन्च नहीं करता जिसमें इंस्टेंस मौजूद होता है. गतिविधि, हमेशा अपने टास्क का एकमात्र सदस्य होती है. इस गतिविधि से शुरू की गई कोई भी गतिविधि, एक अलग टास्क में खुलती है.
"singleInstancePerTask"- गतिविधि को सिर्फ़ टास्क की रूट गतिविधि के तौर पर चलाया जा सकता है. यह टास्क बनाने वाली पहली गतिविधि होती है. इसलिए, किसी टास्क में इस गतिविधि का सिर्फ़ एक इंस्टेंस हो सकता है.
singleTaskलॉन्च मोड के उलट, इस गतिविधि को अलग-अलग टास्क में कई इंस्टेंस में शुरू किया जा सकता है. इसके लिए,FLAG_ACTIVITY_MULTIPLE_TASKयाFLAG_ACTIVITY_NEW_DOCUMENTफ़्लैग सेट होना चाहिए.
उदाहरण के लिए, Android ब्राउज़र, <activity> में singleTask तय करता है, ताकि इसकी गतिविधि आपके ऐप्लिकेशन के टास्क में न रखी जाए. इसके बजाय, ब्राउज़र के लिए कोई नया टास्क शुरू होता है या ब्राउज़र का कोई मौजूदा बैकग्राउंड टास्क सामने आता है.
इससे कोई फ़र्क़ नहीं पड़ता कि कोई गतिविधि किसी नए टास्क में शुरू होती है या उसी टास्क में शुरू होती है जिसमें उसे शुरू करने वाली गतिविधि शुरू हुई थी. 'वापस जाएं' बटन और जेस्चर, उपयोगकर्ता को हमेशा पिछली गतिविधि पर ले जाते हैं. हालांकि, अगर आपने कोई ऐसी गतिविधि शुरू की है जिसमें singleTask लॉन्च मोड के बारे में बताया गया है और उस गतिविधि का कोई इंस्टेंस बैकग्राउंड टास्क में मौजूद है, तो वह पूरा टास्क फ़ोरग्राउंड में आ जाता है. इस समय, पिछली गतिविधियों में वे सभी गतिविधियां शामिल होती हैं जो स्टैक में सबसे ऊपर मौजूद टास्क से जुड़ी होती हैं. चौथी इमेज में इस तरह की स्थिति दिखाई गई है.
"singleTask" वाली गतिविधि को पिछली गतिविधियों में जोड़ने का तरीका. अगर गतिविधि पहले से ही किसी बैकग्राउंड टास्क का हिस्सा है और उसका अपना बैक स्टैक है, तो वह पूरा बैक स्टैक भी मौजूदा टास्क के ऊपर आ जाता है.मेनिफ़ेस्ट फ़ाइल में लॉन्च मोड इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, <activity> एलिमेंट का दस्तावेज़ देखें.
इंटेंट फ़्लैग का इस्तेमाल करके लॉन्च मोड तय करना
कोई गतिविधि शुरू करते समय, उस गतिविधि के टास्क के साथ डिफ़ॉल्ट असोसिएशन में बदलाव किया जा सकता है. इसके लिए, आपको startActivity() को डिलीवर किए जाने वाले इंटेंट में फ़्लैग शामिल करने होंगे. डिफ़ॉल्ट ऐक्शन और सेटिंग में बदलाव करने के लिए, इन फ़्लैग का इस्तेमाल किया जा सकता है:
FLAG_ACTIVITY_NEW_TASKसिस्टम, गतिविधि को नए टास्क में शुरू करता है. अगर शुरू की जा रही गतिविधि के लिए कोई टास्क पहले से चल रहा है, तो उस टास्क को फ़ोरग्राउंड में लाया जाता है और उसकी पिछली स्थिति को वापस लाया जाता है. साथ ही, गतिविधि को
onNewIntent()में नया इंटेंट मिलता है.इससे वही नतीजा मिलता है जो पिछले सेक्शन में बताई गई
"singleTask"launchModeवैल्यू से मिलता है.FLAG_ACTIVITY_SINGLE_TOPअगर शुरू की जा रही गतिविधि, पिछली गतिविधियों के सबसे ऊपर मौजूद मौजूदा गतिविधि है, तो मौजूदा इंस्टेंस को
onNewIntent()पर कॉल मिलता है. ऐसा गतिविधि का नया इंस्टेंस बनाने के बजाय होता है.इससे वही व्यवहार होता है जो पिछले सेक्शन में बताई गई
"singleTop"launchModeवैल्यू से होता है.FLAG_ACTIVITY_CLEAR_TOPअगर शुरू की जा रही गतिविधि, मौजूदा टास्क में पहले से चल रही है, तो सिस्टम उस गतिविधि का नया इंस्टेंस लॉन्च करने के बजाय, उसके ऊपर मौजूद अन्य सभी गतिविधियों को खत्म कर देता है. इंटेंट को
onNewIntent()के ज़रिए, गतिविधि के फिर से शुरू किए गए इंस्टेंस पर डिलीवर किया जाता है. यह इंस्टेंस अब सबसे ऊपर है.launchModeएट्रिब्यूट के लिए ऐसी कोई वैल्यू नहीं है जिससे यह गड़बड़ी हो.FLAG_ACTIVITY_CLEAR_TOPका इस्तेमाल, ज़्यादातरFLAG_ACTIVITY_NEW_TASKके साथ किया जाता है. एक साथ इस्तेमाल किए जाने पर, ये फ़्लैग किसी दूसरे टास्क में मौजूद गतिविधि का पता लगाते हैं और उसे ऐसी जगह पर रखते हैं जहां वह इंटेंट का जवाब दे सके.
अफ़िनिटी मैनेज करना
अफ़िनिटी से पता चलता है कि कोई गतिविधि किस टास्क से "जुड़ना" चाहती है. डिफ़ॉल्ट रूप से, एक ही ऐप्लिकेशन की सभी गतिविधियां एक-दूसरे से जुड़ी होती हैं: वे एक ही टास्क में रहना "पसंद" करती हैं.
हालांकि, किसी गतिविधि के लिए डिफ़ॉल्ट अफ़िनिटी में बदलाव किया जा सकता है. अलग-अलग ऐप्लिकेशन में तय की गई गतिविधियां, अफ़िनिटी शेयर कर सकती हैं. साथ ही, एक ही ऐप्लिकेशन में तय की गई गतिविधियों को अलग-अलग टास्क अफ़िनिटी असाइन की जा सकती हैं.
<activity> एलिमेंट के taskAffinity एट्रिब्यूट का इस्तेमाल करके, किसी गतिविधि के अफ़िनिटी मोड में बदलाव किया जा सकता है.
taskAffinity एट्रिब्यूट में स्ट्रिंग वैल्यू का इस्तेमाल किया जाता है. यह वैल्यू, <manifest> एलिमेंट में बताए गए पैकेज के डिफ़ॉल्ट नाम से अलग होनी चाहिए. ऐसा इसलिए, क्योंकि सिस्टम उस नाम का इस्तेमाल करके, ऐप्लिकेशन के लिए डिफ़ॉल्ट टास्क अफ़िनिटी की पहचान करता है.
अफ़िनिटी दो स्थितियों में काम करती है:
जब किसी गतिविधि को लॉन्च करने वाले इंटेंट में
FLAG_ACTIVITY_NEW_TASKफ़्लैग शामिल हो.डिफ़ॉल्ट रूप से, नई गतिविधि को उस गतिविधि के टास्क में लॉन्च किया जाता है जिसने
startActivity()को कॉल किया है. इसे कॉलर की तरह ही पिछली गतिविधियों में पुश किया जाता है.हालांकि, अगर
startActivity()को पास किए गए इंटेंट मेंFLAG_ACTIVITY_NEW_TASKफ़्लैग शामिल है, तो सिस्टम नई गतिविधि को रखने के लिए कोई दूसरा टास्क ढूंढता है. अक्सर, यह एक नया टास्क होता है. हालांकि, ऐसा होना ज़रूरी नहीं है. अगर कोई मौजूदा टास्क, नई गतिविधि के अफ़िनिटी के जैसा है, तो गतिविधि को उस टास्क में लॉन्च किया जाता है. अगर ऐसा नहीं है, तो यह एक नया टास्क शुरू करता है.अगर इस फ़्लैग की वजह से कोई गतिविधि नया टास्क शुरू करती है और उपयोगकर्ता उसे छोड़ने के लिए होम बटन या जेस्चर का इस्तेमाल करता है, तो उपयोगकर्ता के पास टास्क पर वापस जाने का कोई तरीका होना चाहिए. कुछ इकाइयां, जैसे कि सूचना मैनेजर, हमेशा किसी बाहरी टास्क में गतिविधियां शुरू करती हैं, न कि अपने टास्क के हिस्से के तौर पर. इसलिए, वे
startActivity()को पास किए जाने वाले इंटेंट में हमेशाFLAG_ACTIVITY_NEW_TASKको शामिल करती हैं.अगर कोई बाहरी इकाई इस फ़्लैग की मदद से आपकी गतिविधि को शुरू कर सकती है, तो उपयोगकर्ताओं को वापस जाने का एक अलग तरीका दें. जैसे, टास्क की रूट गतिविधि पर
CATEGORY_LAUNCHERफ़िल्टर से लॉन्चर आइकॉन. ज़्यादा जानकारी के लिए, कोई टास्क शुरू करना लेख पढ़ें.जब किसी गतिविधि के
allowTaskReparentingएट्रिब्यूट को"true"पर सेट किया जाता है.इस मामले में, गतिविधि को उस टास्क से हटाया जा सकता है जिसमें वह शुरू होती है. इसके बाद, उसे उस टास्क में ले जाया जा सकता है जिससे वह जुड़ी है. ऐसा तब होता है, जब वह टास्क फ़ोरग्राउंड में आता है.
उदाहरण के लिए, मान लें कि चुने गए शहरों में मौसम की स्थिति की जानकारी देने वाली गतिविधि को, यात्रा से जुड़े किसी ऐप्लिकेशन के हिस्से के तौर पर तय किया गया है. इसकी अफ़िनिटी, उसी ऐप्लिकेशन में मौजूद अन्य गतिविधियों की अफ़िनिटी के जैसी ही होती है. यह डिफ़ॉल्ट ऐप्लिकेशन अफ़िनिटी होती है. साथ ही, इस एट्रिब्यूट की मदद से, इसे फिर से पैरंट किया जा सकता है.
जब आपकी कोई गतिविधि, मौसम की जानकारी देने वाली गतिविधि को शुरू करती है, तो शुरुआत में यह आपकी गतिविधि के टास्क से जुड़ी होती है. हालांकि, जब यात्रा से जुड़े ऐप्लिकेशन का टास्क फ़ोरग्राउंड में आता है, तो मौसम की जानकारी देने वाली गतिविधि को उस टास्क को फिर से असाइन किया जाता है और उसमें दिखाया जाता है.
पिछली गतिविधियां मिटाना
अगर उपयोगकर्ता किसी टास्क को लंबे समय तक नहीं करता है, तो सिस्टम उस टास्क की सभी गतिविधियों को हटा देता है. हालांकि, रूट गतिविधि को नहीं हटाया जाता. जब उपयोगकर्ता टास्क पर वापस आता है, तो सिर्फ़ रूट गतिविधि को वापस लाया जाता है. सिस्टम इस तरह से काम करता है, क्योंकि यह माना जाता है कि लंबे समय के बाद, उपयोगकर्ता पहले किए जा रहे काम को छोड़ देते हैं और कुछ नया शुरू करने के लिए टास्क पर वापस आते हैं.
गतिविधि के कुछ एट्रिब्यूट का इस्तेमाल करके, इस व्यवहार में बदलाव किया जा सकता है:
alwaysRetainTaskState- जब किसी टास्क की रूट गतिविधि में इस एट्रिब्यूट को
"true"पर सेट किया जाता है, तो ऊपर बताया गया डिफ़ॉल्ट ऐक्शन और सेटिंग लागू नहीं होती. टास्क, लंबे समय के बाद भी अपने स्टैक में सभी गतिविधियां सेव रखता है. clearTaskOnLaunchजब किसी टास्क की रूट गतिविधि में इस एट्रिब्यूट को
"true"पर सेट किया जाता है, तो जब भी उपयोगकर्ता टास्क को छोड़कर वापस आता है, तब टास्क को रूट गतिविधि तक हटा दिया जाता है. दूसरे शब्दों में, यहalwaysRetainTaskStateके उलट है. टास्क को कुछ समय के लिए छोड़ने के बाद भी, उपयोगकर्ता हमेशा टास्क की शुरुआती स्थिति में वापस आ जाता है.finishOnTaskLaunchयह एट्रिब्यूट
clearTaskOnLaunchकी तरह है, लेकिन यह पूरे टास्क के बजाय सिर्फ़ एक गतिविधि पर काम करता है. इसकी वजह से, रूट ऐक्टिविटी को छोड़कर कोई भी ऐक्टिविटी खत्म हो सकती है."true"पर सेट होने पर, गतिविधि सिर्फ़ मौजूदा सेशन के लिए टास्क का हिस्सा बनी रहती है. अगर उपयोगकर्ता टास्क को छोड़कर वापस आता है, तो वह टास्क मौजूद नहीं रहता.
कोई टास्क शुरू करना
किसी गतिविधि को टास्क के एंट्री पॉइंट के तौर पर सेट अप किया जा सकता है. इसके लिए, उसे इंटेंट फ़िल्टर देना होगा. इसमें "android.intent.action.MAIN" को तय की गई कार्रवाई और "android.intent.category.LAUNCHER" को तय की गई कैटगरी के तौर पर सेट करना होगा:
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
यह इंटेंट फ़िल्टर, ऐप्लिकेशन लॉन्चर में गतिविधि के लिए एक आइकॉन और लेबल दिखाता है. इससे उपयोगकर्ताओं को गतिविधि लॉन्च करने और उससे जुड़े टास्क पर वापस जाने का विकल्प मिलता है.
यह दूसरी क्षमता अहम है. उपयोगकर्ताओं को किसी टास्क को छोड़ने और फिर इस ऐक्टिविटी लॉन्चर का इस्तेमाल करके, बाद में उस पर वापस आने की सुविधा मिलनी चाहिए. इस वजह से, सिर्फ़ उन दो लॉन्च मोड का इस्तेमाल करें जो गतिविधियों को हमेशा टास्क शुरू करने के तौर पर मार्क करते हैं. ये मोड हैं: "singleTask" और "singleInstance". इनका इस्तेमाल तब करें, जब गतिविधि में ACTION_MAIN और CATEGORY_LAUNCHER फ़िल्टर हो.
उदाहरण के लिए, मान लें कि अगर फ़िल्टर मौजूद नहीं है, तो क्या हो सकता है: इंटेंट, "singleTask" गतिविधि को लॉन्च करता है और एक नया टास्क शुरू करता है. इसके बाद, उपयोगकर्ता उस टास्क में कुछ समय बिताता है. इसके बाद, उपयोगकर्ता होम बटन या जेस्चर का इस्तेमाल करता है. टास्क को अब बैकग्राउंड में भेज दिया गया है और यह नहीं दिख रहा है. अब उपयोगकर्ता के पास टास्क पर वापस जाने का कोई तरीका नहीं है, क्योंकि इसे ऐप्लिकेशन लॉन्चर में नहीं दिखाया गया है.
अगर आपको किसी उपयोगकर्ता को किसी गतिविधि पर वापस जाने से रोकना है, तो <activity> एलिमेंट के finishOnTaskLaunch को "true" पर सेट करें. ज़्यादा जानकारी के लिए, पिछली गतिविधियां मिटाना लेख पढ़ें.
हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की स्क्रीन पर, टास्क और गतिविधियों को दिखाने और मैनेज करने के तरीके के बारे में ज़्यादा जानने के लिए, हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की स्क्रीन देखें.