ऐप्लिकेशन के चालू होने पर, डिवाइस के कुछ कॉन्फ़िगरेशन में बदलाव हो सकता है. इनमें ये शामिल हैं, लेकिन इन तक सीमित नहीं हैं:
- ऐप्लिकेशन का डिसप्ले साइज़
- स्क्रीन की दिशा
- फ़ॉन्ट का साइज़ और मोटाई
- स्थान-भाषा
- गहरे रंग वाले मोड बनाम हल्के रंग वाला मोड
- कीबोर्ड की उपलब्धता
कॉन्फ़िगरेशन में होने वाले ज़्यादातर बदलाव, उपयोगकर्ता के किसी इंटरैक्शन की वजह से होते हैं. उदाहरण के लिए, डिवाइस को घुमाने या फ़ोल्ड करने से, आपके ऐप्लिकेशन के लिए उपलब्ध स्क्रीन स्पेस बदल जाता है. इसी तरह, फ़ॉन्ट का साइज़, भाषा या पसंदीदा थीम जैसी डिवाइस सेटिंग बदलने से, Configuration ऑब्जेक्ट में उनकी वैल्यू बदल जाती हैं.
इन पैरामीटर में बदलाव करने के लिए, आम तौर पर आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में काफ़ी बदलाव करने पड़ते हैं. इसलिए, Android प्लैटफ़ॉर्म में इनके बदलावों के लिए, खास तौर पर बनाया गया एक मैकेनिज़्म होता है. इस मैकेनिज़्म को Activity फिर से बनाना कहते हैं.
ऐक्टिविटी को फिर से बनाना
कॉन्फ़िगरेशन में बदलाव होने पर, सिस्टम Activity को फिर से बनाता है. इसके लिए, सिस्टम onDestroy को कॉल करता है और मौजूदा Activity इंस्टेंस को डिस्ट्रॉय करता है. इसके बाद, onCreate का इस्तेमाल करके एक नया इंस्टेंस बनाता है. इस नए Activity इंस्टेंस को नए और अपडेट किए गए कॉन्फ़िगरेशन के साथ शुरू किया जाता है. इसका यह भी मतलब है कि सिस्टम, नए कॉन्फ़िगरेशन के साथ यूज़र इंटरफ़ेस (यूआई) को भी फिर से बनाता है.
आम तौर पर, Activity कंपोज़ेबल के लिए होस्ट के तौर पर काम करता है. Activity को फिर से बनाने पर, Compose भी नई कॉन्फ़िगरेशन वैल्यू का इस्तेमाल करके आपके यूज़र इंटरफ़ेस (यूआई) को फिर से बनाता है.
फिर से बनाने की सुविधा, आपके ऐप्लिकेशन को नए कॉन्फ़िगरेशन के हिसाब से ढालने में मदद करती है. इसके लिए, यह सुविधा आपके ऐप्लिकेशन को उन वैकल्पिक संसाधनों के साथ अपने-आप रीलोड करती है जो नए डिवाइस कॉन्फ़िगरेशन से मेल खाते हैं.
मनोरंजन का उदाहरण
मान लें कि एक कंपोज़ेबल है, जो स्ट्रिंग रिसॉर्स का इस्तेमाल करके स्टैटिक टाइटल दिखाता है:
// In the res/values/strings.xml file // <string name="compose">Jetpack Compose</string> // In your Compose code Text( text = stringResource(R.string.compose) )
Activity बनाने पर, Text कंपोज़ेबल, मौजूदा कॉन्फ़िगरेशन (जैसे कि भाषा) को पढ़ता है और सही स्ट्रिंग रिसॉर्स को हल करता है.
भाषा बदलने पर, सिस्टम गतिविधि को फिर से बनाता है. ऐसा होने पर, कंपोज़ फ़ंक्शन यूज़र इंटरफ़ेस (यूआई) को फिर से बनाता है. stringResource, मौजूदा कॉन्फ़िगरेशन से डेटा पढ़ता है. इसलिए, टाइटल अपने-आप सही स्थानीय भाषा में अपडेट हो जाता है.
फिर से बनाने पर, Activity में फ़ील्ड के तौर पर सेव की गई किसी भी स्थिति को भी हटा दिया जाता है.
कॉन्फ़िगरेशन में होने वाले बदलावों के दौरान, यूज़र इंटरफ़ेस (यूआई) की स्थिति को बनाए रखने के लिए, सुझाए गए स्टेट मैनेजमेंट पैटर्न का इस्तेमाल करें. डेटा और कारोबारी नियम के लिए ViewModel का इस्तेमाल करें. साथ ही, यूज़र इंटरफ़ेस (यूआई) के लेवल की स्थिति के लिए rememberSaveable का इस्तेमाल करें. इन तरीकों से, यूज़र इंटरफ़ेस (यूआई) को नए कॉन्फ़िगरेशन के हिसाब से अपडेट करते समय, आपकी स्थिति Activity फिर से बन जाती है.
Compose में स्थिति सेव करने के बारे में ज़्यादा जानने के लिए, Compose में यूज़र इंटरफ़ेस (यूआई) की स्थिति सेव करना लेख पढ़ें.
उपयोगकर्ताओं की उम्मीदें
किसी ऐप्लिकेशन का इस्तेमाल करने वाला व्यक्ति यह उम्मीद करता है कि ऐप्लिकेशन की मौजूदा स्थिति बनी रहे. अगर कोई व्यक्ति कोई फ़ॉर्म भर रहा है और जानकारी देखने के लिए मल्टी-विंडो मोड में कोई दूसरा ऐप्लिकेशन खोलता है, तो ऐप्लिकेशन पर वापस आने पर अगर उसे भरा हुआ फ़ॉर्म मिटा हुआ मिलता है या ऐप्लिकेशन में कहीं और ले जाया जाता है, तो यह उपयोगकर्ता के लिए खराब अनुभव होता है. डेवलपर के तौर पर, आपको कॉन्फ़िगरेशन में बदलाव करके और गतिविधि को फिर से बनाकर, उपयोगकर्ता को लगातार बेहतर अनुभव देना होगा.
यह पुष्टि करने के लिए कि आपके ऐप्लिकेशन में स्थिति बनी रहती है या नहीं, ऐसे टास्क पूरे करें जिनसे कॉन्फ़िगरेशन में बदलाव होता है. ये टास्क तब भी पूरे किए जा सकते हैं, जब ऐप्लिकेशन फ़ोरग्राउंड में हो और तब भी, जब वह बैकग्राउंड में हो. इन कार्रवाइयों में ये शामिल :
- डिवाइस को घुमाना
- मल्टी-विंडो मोड में जाना
- मल्टी-विंडो मोड या फ़्री-फ़ॉर्म विंडो में ऐप्लिकेशन का साइज़ बदलना
- एक से ज़्यादा डिसप्ले वाले फ़ोल्डेबल डिवाइस को फ़ोल्ड करना
- सिस्टम की थीम बदलना, जैसे कि गहरे रंग वाला मोड बनाम हल्के रंग वाला मोड
- फ़ॉन्ट का साइज़ बदलना
- सिस्टम या ऐप्लिकेशन की भाषा बदलना
- हार्डवेयर कीबोर्ड को कनेक्ट या डिसकनेक्ट करना
- डॉक को कनेक्ट या डिसकनेक्ट करना
Activity फिर से बनाने के दौरान, काम की स्थिति को बनाए रखने के लिए कई तरीके अपनाए जा सकते हैं. इनमें से किसका इस्तेमाल करना है, यह इस बात पर निर्भर करता है कि आपको किस तरह की स्थिति बनाए रखनी है:
- जटिल या बड़े डेटा के लिए, प्रोसेस बंद होने की समस्या को ठीक करने के लिए लोकल परसिस्टेंस.
स्थायी लोकल स्टोरेज में डेटाबेस या
DataStoreशामिल होते हैं. - बनाए रखे गए ऑब्जेक्ट, जैसे कि
ViewModelइंस्टेंस. इनका इस्तेमाल, उपयोगकर्ता के ऐप्लिकेशन का इस्तेमाल करते समय, मेमोरी में यूज़र इंटरफ़ेस (यूआई) से जुड़ी स्थिति को मैनेज करने के लिए किया जाता है. rememberSaveableका इस्तेमाल, कॉन्फ़िगरेशन में होने वाले बदलावों और सिस्टम की वजह से प्रोसेस बंद होने पर, यूज़र इंटरफ़ेस (यूआई) की स्थिति को बनाए रखने के लिए किया जाता है. यह उस स्थिति के लिए सही है जो उपयोगकर्ता के इनपुट, स्क्रोल करने की जगह या नेविगेशन पर निर्भर करती है, लेकिनViewModelमें नहीं आती है.
इनमें से हर एक के लिए एपीआई के बारे में ज़्यादा जानने के लिए, यूज़र इंटरफ़ेस (यूआई) की स्थितियां सेव करना लेख पढ़ें. इसमें यह भी बताया गया है कि हर एपीआई का इस्तेमाल कब करना सही होता है.
गतिविधि के हिसाब से मनोरंजन को सीमित करना
कॉन्फ़िगरेशन में कुछ बदलावों के लिए, गतिविधि को अपने-आप फिर से बनाने की सुविधा को रोका जा सकता है. सिर्फ़ Compose का इस्तेमाल करने वाले आधुनिक ऐप्लिकेशन में, यूज़र इंटरफ़ेस (यूआई) को किसी भी तरह से फिर से कंपोज़ किया जाता है. हालांकि, कॉन्फ़िगरेशन में बदलाव को सीधे तौर पर मैनेज करने का सुझाव दिया जाता है.
डिफ़ॉल्ट रूप से, कॉन्फ़िगरेशन में बदलाव होने पर सिस्टम, गतिविधि को खत्म कर देता है और फिर से बनाता है. इसमें यूज़र इंटरफ़ेस (यूआई) और गतिविधि से मिले ऑब्जेक्ट शामिल होते हैं. अगर आपने यह एलान किया है कि आपकी गतिविधि, कॉन्फ़िगरेशन में होने वाले बदलाव को खुद मैनेज करती है, तो सिस्टम ऐसा नहीं करेगा. इसके बजाय, सिर्फ़ Configuration ऑब्जेक्ट अपडेट होता है. साथ ही, Compose आपके यूआई को नई वैल्यू के साथ फिर से कंपोज़ करता है.
Compose में सीधे तौर पर कॉन्फ़िगरेशन में हुए बदलावों को हैंडल करने के कई फ़ायदे हैं:
- बेहतर परफ़ॉर्मेंस: यूज़र इंटरफ़ेस (यूआई) को फिर से कंपोज़ करना, पूरी ऐक्टिविटी को फिर से बनाने के साइकल की तुलना में कम खर्चीला होता है. खास तौर पर, छोटे-मोटे बदलावों के लिए.
- फ़्लूड ऐनिमेशन: ऐक्टिविटी को रीस्टार्ट करने से बचने पर, कॉन्फ़िगरेशन में बदलाव होने पर भी ऐनिमेशन लगातार चलते रहते हैं. जैसे, डिवाइस को घुमाते समय लेआउट में आसानी से बदलाव होना.
- स्टेट प्रिज़र्वेशन: ऐक्टिविटी इंस्टेंस को बनाए रखने से, स्क्रीन रोटेशन जैसे इवेंट के दौरान यूज़र इंटरफ़ेस (यूआई) की स्थिति के अस्थायी तौर पर खो जाने का जोखिम कम हो जाता है. ध्यान दें कि आपको सिस्टम की ओर से शुरू की गई प्रोसेस के बंद होने पर भी, स्टेट प्रिज़र्वेशन को मैनेज करना होगा.
कॉन्फ़िगरेशन में हुए कुछ बदलावों के लिए, गतिविधि फिर से बनाने की सुविधा बंद करने के लिए, अपने AndroidManifest.xml फ़ाइल में मौजूद <activity> एंट्री में android:configChanges एट्रिब्यूट के लिए कॉन्फ़िगरेशन टाइप जोड़ें. संभावित वैल्यू, android:configChanges एट्रिब्यूट के दस्तावेज़ में दिखती हैं.
यहां दिया गया मेनिफ़ेस्ट कोड, स्क्रीन ओरिएंटेशन और कीबोर्ड की उपलब्धता में बदलाव होने पर, MyActivity के लिए Activity को फिर से बनाने की सुविधा बंद कर देता है:
<activity
android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:label="@string/app_name">
कॉन्फ़िगरेशन में हुए बदलावों पर प्रतिक्रिया देना
Jetpack Compose की मदद से, आपका ऐप्लिकेशन कॉन्फ़िगरेशन में हुए बदलावों पर ज़्यादा आसानी से प्रतिक्रिया दे सकता है.
हालांकि, अगर कॉन्फ़िगरेशन में किए गए सभी बदलावों के लिए Activity को बंद कर दिया जाता है, तो आपका ऐप्लिकेशन अब भी कॉन्फ़िगरेशन में किए गए बदलावों को सही तरीके से हैंडल करेगा.
Configuration ऑब्जेक्ट, Compose यूज़र इंटरफ़ेस (यूआई) के क्रम में LocalConfiguration कंपोज़िशन लोकल के साथ उपलब्ध है. जब भी इसमें बदलाव होता है, तब LocalConfiguration.current से डेटा पढ़ने वाले कंपोज़ेबल फ़ंक्शन फिर से कंपोज़ होते हैं. CompositionLocal के काम करने के तरीके के बारे में जानने के लिए, CompositionLocal के साथ स्थानीय स्कोप वाला डेटा लेख पढ़ें.
उदाहरण
यहां दिए गए उदाहरण में, कंपोज़ेबल एक तारीख को खास फ़ॉर्मैट में दिखाता है.
सिस्टम के स्थान-भाषा कॉन्फ़िगरेशन में होने वाले बदलावों के हिसाब से कंपोज़ेबल, LocalConfiguration.current के साथ ConfigurationCompat.getLocales को कॉल करके प्रतिक्रिया देता है.
@Composable
fun DateText(year: Int, dayOfYear: Int) {
val dateTimeFormatter = DateTimeFormatter.ofPattern(
"MMM dd",
ConfigurationCompat.getLocales(LocalConfiguration.current)[0]
)
Text(
dateTimeFormatter.format(LocalDate.ofYearDay(year, dayOfYear))
)
}
भाषा-इलाके की जानकारी बदलने पर, Activity को फिर से बनाने से बचने के लिए, Compose कोड को होस्ट करने वाले Activity को भाषा-इलाके की जानकारी के कॉन्फ़िगरेशन में हुए बदलावों से ऑप्ट आउट करना होगा. इसके लिए, आपको android:configChanges को locale|layoutDirection पर सेट करना होगा.
कॉन्फ़िगरेशन में बदलाव: मुख्य सिद्धांत और सबसे सही तरीके
कॉन्फ़िगरेशन में बदलाव करते समय, आपको इन मुख्य बातों के बारे में पता होना चाहिए:
- कॉन्फ़िगरेशन: डिवाइस कॉन्फ़िगरेशन से यह तय होता है कि यूज़र इंटरफ़ेस (यूआई) उपयोगकर्ता को कैसे दिखेगा. जैसे, ऐप्लिकेशन का डिसप्ले साइज़, स्थान-भाषा या सिस्टम थीम. Compose में,
LocalConfigurationका इस्तेमाल करके कॉन्फ़िगरेशन वैल्यू ऐक्सेस की जा सकती हैं. - कॉन्फ़िगरेशन में बदलाव: उपयोगकर्ता के इंटरैक्शन से कॉन्फ़िगरेशन में बदलाव होता है. उदाहरण के लिए, उपयोगकर्ता डिवाइस की सेटिंग बदल सकता है या डिवाइस के साथ इंटरैक्ट करने का तरीका बदल सकता है. कॉन्फ़िगरेशन में बदलावों को रोकने का कोई तरीका नहीं है.
Activityफिर से बनाना: कॉन्फ़िगरेशन में बदलाव करने पर,Activityडिफ़ॉल्ट रूप से फिर से बन जाता है. यह एक बिल्ट-इन मैकेनिज़्म है. इसकी मदद से, नए कॉन्फ़िगरेशन के लिए ऐप्लिकेशन की स्थिति को फिर से शुरू किया जाता है.Activityडिस्ट्रक्शन:Activityरीक्रिएशन की वजह से सिस्टम, पुरानेActivityइंस्टेंस को बंद कर देता है और उसकी जगह पर एक नया इंस्टेंस बना देता है. पुराना इंस्टेंस अब काम नहीं करता. लाइफ़साइकल के दायरे में आने वाले ऑब्जेक्ट के रेफ़रंस को उनके तय दायरे से बाहर न रखें.- स्टेट: पुराने
Activityइंस्टेंस में मौजूद स्टेट, नएActivityइंस्टेंस में मौजूद नहीं है. इसकी वजह यह है कि ये दो अलग-अलग ऑब्जेक्ट इंस्टेंस हैं. स्टेट को ऐक्टिविटी से जोड़ने के बजाय, सुझाए गए एपीआई का इस्तेमाल करके ऐप्लिकेशन और उपयोगकर्ता की स्थिति को बनाए रखें. इसके बारे में यूज़र इंटरफ़ेस (यूआई) की स्थितियां सेव करना लेख में बताया गया है. - ऑप्ट-आउट करना: कॉन्फ़िगरेशन में किसी तरह के बदलाव के लिए, गतिविधि को फिर से बनाने की सुविधा से ऑप्ट-आउट करने के लिए, यह ज़रूरी है कि आपका ऐप्लिकेशन नए कॉन्फ़िगरेशन के हिसाब से सही तरीके से अपडेट हो.
उपयोगकर्ताओं को बेहतर अनुभव देने के लिए, यहां दिए गए सबसे सही तरीके अपनाएं:
- कॉन्फ़िगरेशन में बार-बार होने वाले बदलावों के लिए तैयार रहें: यह न मानें कि कॉन्फ़िगरेशन में बदलाव कभी-कभार होते हैं या कभी नहीं होते. भले ही, एपीआई लेवल, फ़ॉर्म फ़ैक्टर या यूज़र इंटरफ़ेस टूलकिट कुछ भी हो. जब कोई उपयोगकर्ता कॉन्फ़िगरेशन में बदलाव करता है, तो वह उम्मीद करता है कि ऐप्लिकेशन अपडेट हो जाएं और नए कॉन्फ़िगरेशन के साथ सही तरीके से काम करते रहें.
- स्थिति बनाए रखना:
Activityको फिर से बनाने पर, उपयोगकर्ता की स्थिति को बनाए रखें.ViewModelऔरrememberSaveableजैसे एपीआई का इस्तेमाल करके, यूज़र इंटरफ़ेस की स्थितियां सेव करें में बताए गए तरीके से स्थिति को बनाए रखें. - समस्या को तुरंत ठीक करने के लिए, गतिविधि को फिर से बनाने की सुविधा बंद न करें: स्थिति के डेटा को मिटने से बचाने के लिए,
Activityrecreation की सुविधा को बंद न करें. गतिविधि को फिर से बनाने की सुविधा बंद करने पर, आपको बदलाव को मैनेज करने का वादा पूरा करना होगा. साथ ही, कॉन्फ़िगरेशन में हुए अन्य बदलावों, प्रोसेस के बंद होने या ऐप्लिकेशन बंद करने की वजह से, स्थिति का डेटा अब भी मिट सकता है.Activityrecreation की सुविधा को पूरी तरह से बंद नहीं किया जा सकता. यूज़र इंटरफ़ेस (यूआई) की स्थितियों को सेव करना में बताए गए तरीके से, स्थिति के डेटा को सेव करें.Activity - कॉन्फ़िगरेशन में बदलाव करने से न बचें: स्क्रीन की दिशा, आसपेक्ट रेशियो या साइज़ बदलने की सुविधा पर पाबंदियां न लगाएं, ताकि कॉन्फ़िगरेशन में बदलाव करने और
Activityको फिर से बनाने से बचा जा सके. इससे उन लोगों पर बुरा असर पड़ता है जो आपके ऐप्लिकेशन का इस्तेमाल अपनी पसंद के हिसाब से करना चाहते हैं.
साइज़ के आधार पर कॉन्फ़िगरेशन में हुए बदलावों को हैंडल करना
साइज़ के आधार पर कॉन्फ़िगरेशन में बदलाव कभी भी हो सकते हैं. ऐसा तब होने की संभावना ज़्यादा होती है, जब आपका ऐप्लिकेशन बड़ी स्क्रीन वाले डिवाइस पर चलता हो. इस डिवाइस पर उपयोगकर्ता, मल्टी-विंडो मोड में जा सकते हैं. वे उम्मीद करते हैं कि आपका ऐप्लिकेशन उस एनवायरमेंट में अच्छी तरह से काम करेगा.
साइज़ में बदलाव दो तरह के होते हैं: अहम और मामूली. अहम बदलाव तब होता है, जब स्क्रीन के साइज़ (जैसे कि चौड़ाई, ऊंचाई या सबसे कम चौड़ाई) में अंतर होने की वजह से, नए कॉन्फ़िगरेशन पर वैकल्पिक संसाधनों का अलग सेट लागू होता है. इन संसाधनों में, वे संसाधन शामिल होते हैं जिन्हें ऐप्लिकेशन खुद तय करता है. साथ ही, वे संसाधन भी शामिल होते हैं जो उसकी किसी भी लाइब्रेरी से मिलते हैं.
साइज़ के हिसाब से कॉन्फ़िगरेशन में बदलाव करने पर, गतिविधि को फिर से बनाने की सुविधा को सीमित करें
साइज़ के आधार पर कॉन्फ़िगरेशन में बदलाव करने के लिए, Activity फिर से बनाने की सुविधा बंद करने पर, सिस्टम Activity को फिर से नहीं बनाता है. इसके बजाय, उसे Activity.onConfigurationChanged पर कॉल आता है. LocalConfiguration.current को पढ़ने वाले सभी कंपोज़ेबल, नए साइज़ को दिखाने के लिए अपने-आप फिर से कंपोज़ हो जाते हैं.
Activity को फिर से बनाने की सुविधा, साइज़ के आधार पर कॉन्फ़िगरेशन में किए गए बदलावों के लिए बंद कर दी जाती है. ऐसा तब होता है, जब आपकी मेनिफ़ेस्ट फ़ाइल में android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" मौजूद हो.
अन्य संसाधन
कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करने के बारे में ज़्यादा जानने के लिए, यहां दिए गए अतिरिक्त संसाधन देखें: