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

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

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

गतिविधि में होने वाले ज़्यादातर बदलावों के लिए, आपको गतिविधि की लाइफ़साइकल में सीधे तौर पर कॉल बैक का जवाब देने की ज़रूरत नहीं होती. Compose, यूज़र इंटरफ़ेस (यूआई) को स्टेट से फिर से बनाता है. इसलिए, आपको ऑटोमैटिक रीकंपोज़िशन का फ़ायदा मिल सकता है. इसके लिए, यह पक्का करें कि स्टेट को सही जगह पर सेव किया गया हो. जैसे, rememberSaveable या ViewModel.

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

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

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

  1. onPause
  2. onStop
  3. onDestroy

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

  1. onCreate
  2. onStart
  3. onResume

Compose में, इन कॉलबैक के साथ सीधे तौर पर इंटरैक्ट करना आम बात नहीं है. इसके बजाय, स्थिति में बदलावों को मॉनिटर करने के लिए Lifecycle API का इस्तेमाल करें. Compose में, LocalLifecycleOwner.current का इस्तेमाल करके मौजूदा लाइफ़साइकल का पता लगाया जा सकता है. साथ ही, एक ऑब्ज़र्वर जोड़ा जा सकता है. इससे आपको इवेंट के बारे में सूचनाएं मिलेंगी.

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

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

ज़्यादा जानकारी के लिए, Jetpack Compose में लाइफ़साइकल और स्टेट और Jetpack Compose लेख पढ़ें.

मल्टी-विंडो मोड से जुड़े मामलों को हैंडल करना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

सिंगल-ऐक्टिविटी वाले ऐप्लिकेशन में, जैसे कि ज़्यादातर Compose ऐप्लिकेशन में, अगर कंपोज़ेबल को नेविगेशन बैकस्टैक से हटा दिया जाता है, तो rememberSaveable स्थिति बनाए नहीं रखेगा. ऐसा इसलिए होता है, क्योंकि जब उपयोगकर्ता 'वापस जाएं' बटन पर टैप करता है, तो यह उम्मीद नहीं की जाती कि वह उसी इंस्टेंस पर वापस आएगा. इसलिए, सभी स्थितियां मिटा दी जाती हैं.

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

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

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

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

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