गतिविधि की स्थिति में बदलाव

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

गतिविधि की स्थितियों के बारे में ज़्यादा जानने के लिए, गतिविधि का लाइफ़साइकल लेख पढ़ें. ViewModel क्लास, गतिविधि के लाइफ़साइकल को मैनेज करने में आपकी मदद कैसे कर सकती है, यह जानने के लिए ViewModel की खास जानकारी देखें.

कॉन्फ़िगरेशन में बदलाव होता है

कॉन्फ़िगरेशन में बदलाव करने वाले कई इवेंट हैं. शायद सबसे ज़्यादा अहम उदाहरण, पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच बदलाव करना हो. कॉन्फ़िगरेशन में बदलाव होने की अन्य वजहों में, भाषा की सेटिंग या इनपुट डिवाइस में किए गए बदलाव शामिल हैं.

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

  1. onPause()
  2. onStop()
  3. onDestroy()

गतिविधि का एक नया इंस्टेंस बन जाता है और ये कॉलबैक ट्रिगर हो जाते हैं:

  1. onCreate()
  2. onStart()
  3. onResume()

कॉन्फ़िगरेशन में होने वाले बदलावों के दौरान, किसी ऐक्टिविटी के यूज़र इंटरफ़ेस (यूआई) की स्थिति को बनाए रखने के लिए, ViewModel इंस्टेंस, onSaveInstanceState() तरीके या हमेशा सेव रहने वाले लोकल स्टोरेज के कॉम्बिनेशन का इस्तेमाल करें. इन विकल्पों को एक साथ इस्तेमाल करने का तरीका तय करने के लिए, आपके यूज़र इंटरफ़ेस (यूआई) के डेटा की जटिलता, आपके ऐप्लिकेशन के इस्तेमाल के उदाहरण, और डेटा को वापस पाने की स्पीड बनाम मेमोरी के इस्तेमाल को ध्यान में रखना ज़रूरी है. गतिविधि के यूज़र इंटरफ़ेस (यूआई) की स्थिति सेव करने के बारे में ज़्यादा जानने के लिए, यूआई की स्थितियां सेव करना लेख पढ़ें.

मल्टी-विंडो मोड में काम करने वाले ऐप्लिकेशन

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

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

एक से ज़्यादा विंडो के लाइफ़साइकल के बारे में ज़्यादा जानकारी के लिए, एक से ज़्यादा विंडो के लिए सहायता पेज पर, एक से ज़्यादा विंडो के लाइफ़साइकल के बारे में दी गई जानकारी देखें.

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

जब उपयोगकर्ता ऐप्लिकेशन A से ऐप्लिकेशन B पर स्विच करता है, तो सिस्टम ऐप्लिकेशन A पर onPause() और ऐप्लिकेशन B पर onResume() को कॉल करता है. जब भी उपयोगकर्ता एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन पर स्विच करता है, तो यह इन दोनों तरीकों के बीच स्विच करता है.

मल्टी-विंडो मोड के बारे में ज़्यादा जानकारी के लिए, मल्टी-विंडो मोड के लिए सहायता देखें.

फ़ोरग्राउंड में कोई गतिविधि या डायलॉग दिखता है

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

जब कवर की गई गतिविधि फ़ोरग्राउंड में वापस आती है और उस पर फ़ोकस फिर से आ जाता है, तो सिस्टम onResume() को कॉल करता है.

अगर फ़ोरग्राउंड में कोई नई गतिविधि या डायलॉग दिखता है, तो फ़ोकस उस पर चला जाता है और चल रही गतिविधि पूरी तरह से ढक जाती है. ऐसा होने पर, ढकी हुई गतिविधि का फ़ोकस हट जाता है और वह 'रुक गई' स्थिति में चली जाती है. इसके बाद, सिस्टम तेज़ी से onPause() और onStop() को कॉल करता है.

जब कवर की गई गतिविधि का वही इंस्टेंस फ़ोरग्राउंड में वापस आता है, तो सिस्टम गतिविधि पर onRestart(), onStart(), और onResume() को कॉल करता है. अगर यह कवर की गई गतिविधि का नया इंस्टेंस है, जो बैकग्राउंड में आता है, तो सिस्टम onRestart() को कॉल नहीं करता. सिर्फ़ onStart() और onResume() को कॉल करता है.

उपयोगकर्ता, 'वापस जाएं' पर टैप करता है या जेस्चर का इस्तेमाल करता है

अगर कोई गतिविधि फ़ोरग्राउंड में है और उपयोगकर्ता 'वापस जाएं' पर टैप करता है या जेस्चर का इस्तेमाल करता है, तो गतिविधि onPause(), onStop(), और onDestroy() कॉलबैक के ज़रिए ट्रांज़िशन करती है. गतिविधि को बंद कर दिया जाता है और बैक स्टैक से हटा दिया जाता है.

डिफ़ॉल्ट रूप से, इस मामले में onSaveInstanceState() कॉलबैक ट्रिगर नहीं होता. इस व्यवहार से यह माना जाता है कि उपयोगकर्ता, गतिविधि के उसी इंस्टेंस पर वापस जाने की उम्मीद के बिना, 'वापस जाएं' पर टैप करता है.

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

अगर onBackPressed() तरीके को बदला जाता है, तो हमारा सुझाव है कि आप बदले गए तरीके से भी super.onBackPressed() को चालू करें. ऐसा न करने पर, उपयोगकर्ता को सिस्टम के 'वापस जाएं' बटन के काम करने का तरीका अटपटा लग सकता है.

सिस्टम, ऐप्लिकेशन की प्रोसेस को बंद कर देता है

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

सिस्टम यह कैसे तय करता है कि किन प्रोसेस को बंद करना है, इस बारे में ज़्यादा जानने के लिए ऐक्टिविटी की स्थिति और मेमोरी से प्रोसेस हटाना और प्रोसेस और ऐप्लिकेशन का लाइफ़साइकल लेख पढ़ें.

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