टास्क और पिछली गतिविधियां

टास्क, गतिविधियों का एक कलेक्शन है. उपयोगकर्ता ये गतिविधियां करते समय इंटरैक्ट करते हैं अपने ऐप्लिकेशन में कुछ करें. इन गतिविधियों को ऐसी स्थिति में व्यवस्थित किया जाता है जिसे बैक स्टैक को टास्क में बदलें. इसमें हर गतिविधि को खोलने का क्रम तय किया जाता है.

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

किसी टास्क की लाइफ़साइकल और उसके पीछे का स्टैक

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

जब मौजूदा गतिविधि दूसरी गतिविधि शुरू करती है, तो नई गतिविधि को सबसे ऊपर पुश किया जाता है समीक्षा कर ली है और उस पर फ़ोकस कर लिया है. पिछली गतिविधि स्टैक में ही रहती है, लेकिन रोक दिया गया है. जब कोई गतिविधि रुक जाती है, तब सिस्टम यूज़र इंटरफ़ेस पर काम करता है. जब उपयोगकर्ता वापस कार्रवाई करता है, तो मौजूदा गतिविधि यह होती है स्टैक में सबसे ऊपर से पॉप-अप हुआ और मिट गया. कॉन्टेंट बनाने पिछली गतिविधि फिर से शुरू हो जाती है और उसके यूज़र इंटरफ़ेस (यूआई) की पिछली स्थिति को पहले जैसा कर दिया जाता है.

इसमें गतिविधियां स्टैक को कभी भी फिर से व्यवस्थित नहीं किया जाता. सिर्फ़ स्टैक पर पुश किया जाता है और स्टैक से पॉप-अप होता है. मौजूदा गतिविधि से शुरू किया गया और उपयोगकर्ता ने खारिज कर दिया 'वापस जाएँ' बटन या हाथ के जेस्चर का इस्तेमाल करें. इसलिए, बैक स्टैक इस तरह काम करते हैं: लास्ट इन, फ़र्स्ट आउट ऑब्जेक्ट स्ट्रक्चर. पहली इमेज में, टाइमलाइन के साथ गतिविधियों को पुश करके किसी बैक स्टैक से पॉप आउट किया जा रहा हो.

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

जब उपयोगकर्ता पीछे की ओर टैप या जेस्चर करना जारी रखता है, तब स्टैक में हर गतिविधि पिछला वाला दिखाने के लिए पॉप-अप होता है, जब तक कि उपयोगकर्ता होम पर वापस नहीं आ जाता स्क्रीन या टास्क के शुरू होने के समय जो भी गतिविधि चल रही थी उस पर ले जाया जा सकता है. जब सभी गतिविधियों को स्टैक से हटा दिया गया है, इसलिए यह टास्क अब मौजूद नहीं है.

रूट लॉन्चर गतिविधियों के लिए बैक टैप व्यवहार

रूट लॉन्चर गतिविधियां ऐसी गतिविधियां हैं जो किसी इंटेंट के बारे में बताती हैं दोनों के साथ फ़िल्टर करें ACTION_MAIN और CATEGORY_LAUNCHER. ये गतिविधियां यूनीक हैं, क्योंकि ये आपके ऐप्लिकेशन में एंट्री पॉइंट के तौर पर काम करती हैं: ऐप्लिकेशन लॉन्चर के हिसाब से होते हैं और इनका इस्तेमाल टास्क शुरू करने के लिए किया जाता है.

जब कोई उपयोगकर्ता रूट लॉन्चर गतिविधि से वापस जाने के लिए टैप करता है या जेस्चर करता है, तो सिस्टम यह इवेंट को अलग-अलग तरीके से हैंडल करता है. यह Android के उस वर्शन के आधार पर तय होता है जिसे डिवाइस चल रहा है.

Android 11 और इससे पहले के वर्शन पर सिस्टम का काम करने का तरीका
सिस्टम ने गतिविधि पूरी कर ली है.
Android 12 और इसके बाद के वर्शन पर, सिस्टम की परफ़ॉर्मेंस

सिस्टम, गतिविधि और उसके टास्क को बैकग्राउंड में ले जाता है गतिविधि को पूरा किया जा रहा है. यह व्यवहार, सिस्टम के डिफ़ॉल्ट व्यवहार से मेल खाता है. ऐसा तब होता है, जब किसी ऐप्लिकेशन से बाहर जाने के लिए, होम बटन या हाथ के जेस्चर का इस्तेमाल किया जाता है.

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

अगर आपको पसंद के मुताबिक बैक नेविगेशन देना हो, तो हमारा सुझाव है कि आप ओवरराइड करने के बजाय AndroidX Activity API का इस्तेमाल करें onBackPressed(). AndroidX Activity API, अपने-आप अगर सिस्टम में रुकावट डालने वाला कोई कॉम्पोनेंट नहीं है, तो सिस्टम सही व्यवहार करेगा बैक टैप करें.

हालांकि, अगर आपका ऐप्लिकेशन ओवरराइड करता है हैंडल करने के लिए onBackPressed() वापस जाएं और गतिविधि पूरी करें. साथ ही, कॉल पर लागू करने की सेटिंग अपडेट करें उसे पूरा करने के बजाय, super.onBackPressed() तक पहुँचें. कॉल से जुड़ी सुविधा super.onBackPressed() गतिविधि और उसके टास्क को बैकग्राउंड में ले जाता है, जब सही है और उपयोगकर्ताओं को एक जैसा नेविगेशन अनुभव देता है ट्रैक करें.

बैकग्राउंड और फ़ोरग्राउंड टास्क

दूसरी इमेज. दो टास्क: टास्क B को उपयोगकर्ता इंटरैक्शन करते समय मिलता है फ़ोरग्राउंड में हैं, जबकि बैकग्राउंड में टास्क A मौजूद है और फिर से शुरू करें.

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

मौजूदा टास्क A के लिए इस टास्क फ़्लो पर विचार करें, इसके स्टैक में तीन गतिविधियां हैं. इनमें मौजूदा गतिविधि के तहत दो शामिल हैं:

  1. उपयोगकर्ता होम बटन या हाथ के जेस्चर का इस्तेमाल करता है. इसके बाद, ऐप्लिकेशन लॉन्चर.

    जब होम स्क्रीन दिखती है, तो टास्क A बैकग्राउंड में चला जाता है. जब नया ऐप्लिकेशन शुरू होता है, तो सिस्टम उस ऐप्लिकेशन के लिए टास्क (टास्क B) के लिए टास्क शुरू करता है. गतिविधियों के बारे में बताया गया है.

  2. उस ऐप्लिकेशन से इंटरैक्ट करने के बाद, उपयोगकर्ता होम पेज पर वापस आता है और ऐसा ऐप्लिकेशन है जिसे मूल रूप से टास्क A को शुरू किया गया था.

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

गतिविधि के एक से ज़्यादा इंस्टेंस

तीसरी इमेज. एक गतिविधि को कई बार इंस्टैंशिएट किया जा सकता है बार.

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

अगर उपयोगकर्ता 'वापस जाएं' बटन का इस्तेमाल करके पीछे की ओर नेविगेट करता है बटन या जेस्चर, गतिविधि को इस क्रम में दिखाया जाता है जिस क्रम में वे जिसमें हर एक की अपनी यूज़र इंटरफ़ेस (यूआई) स्थिति हो. हालांकि, आपके पास इसमें बदलाव करने का विकल्प है व्यवहार. ज़्यादा जानें इसके बारे में ज़्यादा जानने के लिए, Tasks.

मल्टी-विंडो एनवायरमेंट

जब ऐप्लिकेशन कई विंडो वाली विंडो में एक साथ चलते हैं एनवायरमेंट, Android 7.0 (एपीआई) में काम करता है लेवल 24) और उससे ऊपर के लेवल पर, सिस्टम हर विंडो के लिए अलग-अलग टास्क मैनेज करता है. हर विंडो में कई टास्क हो सकते हैं. यही बात, इस पर चल रहे Android ऐप्लिकेशन पर भी लागू होती है Chromebook: सिस्टम, टास्क या टास्क के ग्रुप को हर विंडो के हिसाब से.

लाइफ़साइकल का रीकैप

गतिविधियों और टास्क के डिफ़ॉल्ट व्यवहार की खास जानकारी देने के लिए:

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

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

  • अगर उपयोगकर्ता 'वापस जाएँ' पर टैप या हाथ के जेस्चर करता है, तो मौजूदा गतिविधि की जानकारी और उसे नष्ट कर दिया. स्टैक में पिछली गतिविधि फिर से शुरू हो जाती है. टास्क कब शुरू होगा कोई गतिविधि खत्म हो जाती है, तो सिस्टम गतिविधि की स्थिति को बनाए नहीं रखता.

    रूट लॉन्चर की गतिविधियों के लिए यह तरीका अलग-अलग है जब आपका ऐप्लिकेशन Android 12 या उसके बाद के वर्शन पर चल रहा हो.

  • गतिविधियों को कई बार इंस्टैंशिएट किया जा सकता है. यहां तक कि दूसरे टास्क से भी ऐसा किया जा सकता है.

काम में मदद पाएँ

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

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

आप यहां दी गई विशेषताओं का इस्तेमाल करके, ये काम और बहुत कुछ कर सकते हैं: <activity> मेनिफ़ेस्ट एलिमेंट और उस इंटेंट में फ़्लैग करें, जिसे आप पास करते हैं startActivity().

इस मुख्य <activity> एट्रिब्यूट का इस्तेमाल, टास्क मैनेज करने के लिए किया जा सकता है:

यहां मुख्य इंटेंट फ़्लैग के बारे में बताया गया है. इसका इस्तेमाल किया जा सकता है:

नीचे दिए गए सेक्शन में, मेनिफ़ेस्ट के इन एट्रिब्यूट को इस्तेमाल करने के तरीके के बारे में बताया गया है और इंटेंट फ़्लैग का इस्तेमाल करें, ताकि यह बताया जा सके कि गतिविधियों के साथ टास्क कैसे जुड़ा है और वे कैसे काम करते हैं पिछली गतिविधियों में क्या-क्या करते हैं.

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

लॉन्च के मोड तय करें

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

इसलिए, अगर गतिविधि A ने गतिविधि B को शुरू किया है, तो गतिविधि B अपने मेनिफ़ेस्ट में तय कर सकती है यह मौजूदा टास्क से कैसे जुड़ा होता है और गतिविधि A इंटेंट फ़्लैग का इस्तेमाल कर सकती है का इस्तेमाल किया जा सकता है.

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

मेनिफ़ेस्ट फ़ाइल का इस्तेमाल करके लॉन्च मोड तय करें

अपनी मेनिफ़ेस्ट फ़ाइल में किसी ऐक्टिविटी का एलान करते समय, गतिविधि, इसका इस्तेमाल करके किसी टास्क से जुड़ी होती है <activity> एलिमेंट launchMode एट्रिब्यूट.

launchMode एट्रिब्यूट के लिए, पांच लॉन्च मोड असाइन किए जा सकते हैं:

  1. "standard"
    डिफ़ॉल्ट मोड. सिस्टम, टास्क में गतिविधि का नया इंस्टेंस बनाता है यह इंटेंट से शुरू होता है और इंटेंट को इस तक भेजता है. यह गतिविधि कई बार इंस्टैंशिएट किया जाता है, तो हर इंस्टेंस अलग-अलग टास्क से जुड़ा हो सकता है और एक टास्क के कई इंस्टेंस हो सकते हैं.
  2. "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" हो.

  3. "singleTask"
    सिस्टम, नए टास्क के रूट में गतिविधि बनाता है या टास्क की जगह की जानकारी का पता लगाता है एक जैसी पसंद वाले किसी टास्क पर गतिविधि. अगर गतिविधि पहले से मौजूद है, तो सिस्टम मौजूदा इंस्टेंस के लिए इंटेंट onNewIntent() का इस्तेमाल करने का सुझाव देते हैं. इस बीच उससे ऊपर की गतिविधियां खत्म हो जाती हैं.
  4. "singleInstance".
    काम करने का तरीका "singleTask" जैसा ही है. हालांकि, सिस्टम किसी दूसरे डिवाइस को लॉन्च नहीं करता टास्क में गतिविधियों के लिए इस्तेमाल किया जा सकता है. यह गतिविधि हमेशा सदस्य ही होगा. इससे शुरू की गई सभी गतिविधियां इस अवधि में खुलेंगी अलग से टास्क बनाया जा सकता है.
  5. "singleInstancePerTask".
    गतिविधि को टास्क की मुख्य गतिविधि के तौर पर ही चलाया जा सकता है. इसे चलाने वाली पहली गतिविधि ऐसी गतिविधि जिससे टास्क बनाया गया. इसलिए, ऐसा सिर्फ़ एक इंस्टेंस हो सकता है टास्क में इस गतिविधि को शामिल किया है. singleTask लॉन्च मोड के उलट, यह सुविधा गतिविधि को अलग-अलग टास्क में कई इंस्टेंस में शुरू किया जा सकता है, अगर FLAG_ACTIVITY_MULTIPLE_TASK या FLAG_ACTIVITY_NEW_DOCUMENT फ़्लैग सेट कर दिया गया है.

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

भले ही, कोई गतिविधि किसी नए टास्क से शुरू हो या उसी टास्क में उसे शुरू करने वाली गतिविधि है, तो वापस जाएँ बटन और जेस्चर हमेशा पिछली गतिविधि पर जाते हैं. हालांकि, अगर आपने कोई ऐसी गतिविधि शुरू की, तय करता है 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. इन फ़्लैग को एक साथ इस्तेमाल करने पर किसी अन्य टास्क में मौजूदा गतिविधि का पता लगाएं और उसे सही जगह पर रखें जहां यह इंटेंट पर प्रतिक्रिया दे सके.

अफ़िनिटी ऑडिएंस (पसंद के हिसाब से चुने गए दर्शक) हैंडल करें

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

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

किसी गतिविधि की अफ़िनिटी ऑडियंस (एक जैसी पसंद वाले दर्शक) में बदलाव करने के लिए, taskAffinity का इस्तेमाल करें <activity> का एट्रिब्यूट एलिमेंट.

taskAffinity एट्रिब्यूट के लिए ऐसी स्ट्रिंग वैल्यू ली जाती है जो इससे अलग होनी चाहिए डिफ़ॉल्ट पैकेज का नाम <manifest> में बताया गया है एलिमेंट, क्योंकि सिस्टम उस नाम का इस्तेमाल डिफ़ॉल्ट टास्क की पहचान करने के लिए करता है अफ़िनिटी ऑडियंस (एक जैसी पसंद वाले दर्शक) की सूची देखें.

अफ़िनिटी दो स्थितियों में काम आ सकता है:

  1. जब किसी गतिविधि को लॉन्च करने वाले इंटेंट में FLAG_ACTIVITY_NEW_TASK फ़्लैग करें.

    डिफ़ॉल्ट रूप से, एक नई गतिविधि को उस गतिविधि के टास्क में लॉन्च किया जाता है जो कॉल किया गया startActivity(). इसे उसी पिछली स्टैक में पुश किया जाता है जिसमें कॉलर है.

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

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

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

  2. जब किसी गतिविधि के 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" तक. ज़्यादा जानकारी के लिए, पिछली गतिविधियों को हटाने का तरीका सेक्शन देखें.

टास्क और गतिविधियों को कैसे दिखाया और मैनेज किया जाता है, इस बारे में ज़्यादा जानकारी हाल ही की स्क्रीन में, हाल ही के स्क्रीन.

ज़्यादा संसाधन