ChromeOS पर, Android ऐप्लिकेशन को एक साथ कई विंडो में इस्तेमाल किया जा सकता है. सिस्टम, ऐप्लिकेशन को विंडो कंटेनर में रेंडर करता है. इनका साइज़, डिवाइस के फ़ॉर्म फ़ैक्टर के हिसाब से तय होता है. इसे पहले डायग्राम में दिखाया गया है.
पहली इमेज. अलग-अलग डिवाइसों पर ऐप्लिकेशन की विंडो.
ऐसे लेआउट डिज़ाइन करना ज़रूरी है जो अलग-अलग स्क्रीन साइज़ के साथ काम करें. अगर आपने अलग-अलग स्क्रीन साइज़ के लिए सहायता पाने से जुड़े Android के दिशा-निर्देशों का पालन किया है, तो ChromeOS पर ऐप्लिकेशन चलाने पर भी वह अच्छी तरह से काम करेगा.
इस पेज पर बताया गया है कि ऐप्लिकेशन की विंडो को सही तरीके से लॉन्च करने, उसके साइज़ को आसानी से बदलने, और साइज़ बदलने पर उसके सभी कॉन्टेंट को दिखाने में कैसे मदद करें.
शुरुआती लॉन्च का साइज़
ऐप्लिकेशन, शुरुआती लॉन्च के लिए साइज़ का अनुरोध इन तरीकों से कर सकते हैं:
लॉन्च साइज़ का इस्तेमाल सिर्फ़ डेस्कटॉप एनवायरमेंट में करें. इससे विंडो मैनेजर को सही बाउंड्री और ओरिएंटेशन देने में मदद मिलती है. डेस्कटॉप मोड में इस्तेमाल किए जाने पर, प्राथमिकताओं के बारे में बताने के लिए,
<activity>में यहां दिए गए मेटा टैग जोड़ें:<meta-data android:name="WindowManagerPreference:FreeformWindowSize" android:value="[phone|tablet|maximize]" /> <meta-data android:name="WindowManagerPreference:FreeformWindowOrientation" android:value="[portrait|landscape]" />लॉन्च करने की स्टैटिक सीमाओं का इस्तेमाल करें. अपनी गतिविधि की मेनिफ़ेस्ट एंट्री में
<layout>का इस्तेमाल करके, "तय किया गया" शुरुआती साइज़ तय करें. उदाहरण के लिए:<layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minHeight="450dp" android:minWidth="300dp" />डाइनैमिक लॉन्च बाउंड्री का इस्तेमाल करें. कोई गतिविधि, नई गतिविधि बनाते समय
ActivityOptions.setLaunchBounds(Rect)बना सकती है और उसका इस्तेमाल कर सकती है. खाली आयत तय करके, आपके ऐप्लिकेशन को ज़्यादा से ज़्यादा किया जा सकता है.
विंडो का साइज़ बदलना
ChromeOS में, उपयोगकर्ता किसी ऐप्लिकेशन की विंडो का साइज़ सामान्य तरीके से बदल सकते हैं. इसके लिए, उन्हें नीचे दाएं कोने को खींचना होगा. इसे दूसरी इमेज में दिखाया गया है.
दूसरी इमेज. ऐप्लिकेशन की ऐसी विंडो जिसका साइज़ बदला जा सकता है.
View क्लास का इस्तेमाल करते समय, विंडो का साइज़ बदलने की सुविधा को मैनेज करने के लिए दो विकल्प उपलब्ध हैं:
onConfigurationChanged(..)को कॉल करके, कॉन्फ़िगरेशन में हुए बदलावों के हिसाब से डाइनैमिक तरीके से जवाब दें. उदाहरण के लिए, गतिविधि के मेनिफ़ेस्ट मेंandroid:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"जोड़ा जा सकता है. कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करने के बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करना लेख पढ़ें.- सिस्टम को गतिविधि फिर से शुरू करने दें. इस मामले में,
onSaveInstanceStateको लागू करें और ViewModel आर्किटेक्चर कॉम्पोनेंट का इस्तेमाल करके, पहले से सेव की गई स्थिति को वापस लाएं.
Jetpack Compose का इस्तेमाल करते समय, विंडो का साइज़ बदलने का तरीका इस बात पर निर्भर करता है कि आपकी गतिविधि कैसे कॉन्फ़िगर की गई है. अगर यह बदलावों को डाइनैमिक तौर पर हैंडल करता है, तो विंडो का साइज़ बदलने पर, फिर से कंपोज़िशन ट्रिगर हो जाती है. अगर सिस्टम गतिविधि को फिर से शुरू करता है, तो रीस्टार्ट होने के बाद शुरुआती कंपोज़िशन होती है. इसलिए, ऐसे कंपोज़ लेआउट बनाना ज़रूरी है जो विंडो के बदलते साइज़ के हिसाब से अपने-आप अडजस्ट हो जाएं. साइज़ को तय न मानें.
विंडो के डाइमेंशन
अपनी गतिविधियों को हर बार शुरू होने पर, विंडो के डाइमेंशन पढ़ने की अनुमति दें. साथ ही, उन्हें मौजूदा कॉन्फ़िगरेशन के हिसाब से कॉन्टेंट व्यवस्थित करने की अनुमति दें.
मौजूदा कॉन्फ़िगरेशन का पता लगाने के लिए, मौजूदा गतिविधि पर getResources().getConfiguration() कॉल करें. बैकग्राउंड में चल रही गतिविधि या सिस्टम रिसोर्स के कॉन्फ़िगरेशन का इस्तेमाल न करें.
बैकग्राउंड गतिविधि का कोई साइज़ नहीं होता. साथ ही, सिस्टम कॉन्फ़िगरेशन में अलग-अलग साइज़ और ओरिएंटेशन वाली कई विंडो हो सकती हैं. इसलिए, इस्तेमाल किया जा सकने वाला कोई डेटा नहीं निकाला जा सकता.
ध्यान दें कि विंडो का साइज़ और स्क्रीन का साइज़ एक जैसा नहीं होता. डीपी में विंडो का साइज़ पाने के लिए, Activity.getResources().getConfiguration().screenWidth और Activity.getResources().getConfiguration().screenHeight का इस्तेमाल करें. आपको शायद ही कभी स्क्रीन के साइज़ का इस्तेमाल करना पड़े.
कॉन्टेंट की सीमाएं
विंडो का साइज़ बदलने के बाद, उसके कॉन्टेंट की सीमाएं बदल सकती हैं. उदाहरण के लिए, अगर विंडो स्क्रीन पर फ़िट होने के लिए बहुत बड़ी हो जाती है, तो ऐप्लिकेशन के लिए इस्तेमाल की जाने वाली विंडो का साइज़ बदल सकता है. इन दिशा-निर्देशों का पालन करें:
- Android की लेआउट प्रोसेस का इस्तेमाल करने वाले ऐप्लिकेशन, उपलब्ध जगह में अपने-आप लेआउट हो जाते हैं.
नेटिव ऐप्लिकेशन को उपलब्ध जगह के बारे में जानकारी होनी चाहिए. साथ ही, उन्हें साइज़ में होने वाले बदलावों पर नज़र रखनी चाहिए, ताकि यूज़र इंटरफ़ेस (यूआई) के एलिमेंट ऐक्सेस किए जा सकें. इस प्लैटफ़ॉर्म के लिए, शुरुआती तौर पर उपलब्ध साइज़ का पता लगाने के लिए, इन तरीकों का इस्तेमाल करें:
NativeActivity.mLastContent[X/Y/Width/Height]()findViewById(android.R.id.content).get[Width/Height]()
ऑब्ज़र्वर का इस्तेमाल करके, लगातार मॉनिटरिंग की जा सकती है:
NativeActivity.onContentRectChangedNative()NativeActivity.onGlobalLayout()view.addOnLayoutChangeListener(findViewById(android.R.id.content))में कोई श्रोता जोड़ना
अगर ऐप्लिकेशन, आर्टवर्क को पहले से ही स्केल कर रहा है, तो रिज़ॉल्यूशन में बदलाव होने पर ऐसा करें.
फ़्री-फ़ॉर्म में साइज़ बदलना
ChromeOS में, किसी भी विंडो का साइज़ बदला जा सकता है: उपयोगकर्ता, स्क्रीन पर किसी विंडो की चौड़ाई, ऊंचाई, और जगह बदल सकता है. कई Android ऐप्लिकेशन, फ़्री-फ़ॉर्म में साइज़ बदलने की सुविधा को ध्यान में रखे बिना बनाए जाते हैं. इन समस्याओं पर ध्यान दें:
- स्क्रीन की जगह बदल सकती है. विंडो से स्क्रीन और स्क्रीन से विंडो के कोऑर्डिनेट ट्रांसफ़ॉर्मेशन के लिए, हमेशा सिस्टम का इस्तेमाल करें.
- अगर Android के व्यू सिस्टम का इस्तेमाल किया जा रहा है, तो विंडो का साइज़ बदलने पर उसका लेआउट अपने-आप बदल जाता है.
- अगर व्यू सिस्टम का इस्तेमाल नहीं किया जाता है और पूरे डिसप्ले पर कंट्रोल किया जाता है, तो आपके ऐप्लिकेशन को साइज़ में होने वाले बदलावों को खुद मैनेज करना होगा.
- नेटिव ऐप्लिकेशन के लिए,
mLastContentसदस्यों का इस्तेमाल करें या कॉन्टेंट व्यू का इस्तेमाल करके शुरुआती साइज़ तय करें. - ऐप्लिकेशन के चालू होने पर, साइज़ में होने वाले बदलावों पर प्रतिक्रिया देने के लिए,
onContentRectChangedNativeयाonGlobalLayoutइवेंट सुनें. - ऐप्लिकेशन का साइज़ बदलने पर, लेआउट और आर्टवर्क को फिर से स्केल करें या फिर से लोड करें और इनपुट एरिया अपडेट करें.
पूर्ण स्क्रीन मोड
फ़ुल स्क्रीन मोड, स्टॉक Android की तरह ही काम करता है. अगर विंडो पूरी स्क्रीन पर नहीं दिख रही है, तो फ़ुल स्क्रीन करने (सिस्टम के सभी यूज़र इंटरफ़ेस (यूआई) एलिमेंट छिपाने) के अनुरोधों को अनदेखा कर दिया जाता है. ऐप्लिकेशन को बड़ा करने पर, फ़ुलस्क्रीन के सामान्य तरीके, लेआउट, और फ़ंक्शन इस्तेमाल किए जाते हैं. इससे सिस्टम के यूज़र इंटरफ़ेस (यूआई) एलिमेंट (विंडो कंट्रोल बार और शेल्फ़) छिप जाते हैं.
स्क्रीन ओरिएंटेशन
ज़्यादातर Android ऐप्लिकेशन पोर्ट्रेट मोड में होते हैं, क्योंकि ज़्यादातर फ़ोन इसी मोड में इस्तेमाल किए जाते हैं. पोर्ट्रेट मोड, फ़ोन के लिए अच्छा होता है. हालांकि, यह लैपटॉप और टैबलेट के लिए सही नहीं होता. इनके लिए लैंडस्केप मोड बेहतर होता है. अपने ऐप्लिकेशन के लिए सबसे अच्छे नतीजे पाने के लिए, दोनों ओरिएंटेशन का इस्तेमाल करें.
कुछ Android ऐप्लिकेशन यह मानते हैं कि जब डिवाइस को पोर्ट्रेट मोड में रखा जाता है, तो रोटेशन की वैल्यू Surface.ROTATION_0 होती है.
यह बात ज़्यादातर Android डिवाइसों पर लागू हो सकती है. हालांकि, जब ऐप्लिकेशन किसी एआरसी मोड में होता है, तो पोर्ट्रेट ओरिएंटेशन के लिए रोटेशन वैल्यू Surface.ROTATION_0 नहीं हो सकती.
ऐक्सिलरोमीटर या इसी तरह के सेंसर से डेटा पढ़ते समय, रोटेशन की सटीक वैल्यू पाने के लिए, Display.getRotation() तरीके का इस्तेमाल करें और ऐक्सिस को उसके हिसाब से बदलें.
रूट ऐक्टिविटी और ओरिएंटेशन
Chromebook की विंडो में, गतिविधि वाली विंडो का स्टैक होता है. स्टैक में मौजूद हर विंडो का साइज़ और ओरिएंटेशन एक जैसा होता है.
डेस्कटॉप एनवायरमेंट में, ओरिएंटेशन और साइज़ में अचानक होने वाले बदलावों से भ्रम पैदा होता है. Chromebook का विंडो मैनेजर, इस समस्या को Android के साइड-बाय-साइड मोड की तरह ही हल करता है: स्टैक में सबसे नीचे मौजूद ऐक्टिविटी, उसके ऊपर मौजूद सभी ऐक्टिविटी के एट्रिब्यूट को कंट्रोल करती है. इससे ऐसी अनचाही स्थितियां पैदा हो सकती हैं जहां पोर्ट्रेट मोड में शुरू की गई और साइज़ में बदलाव न की जा सकने वाली गतिविधि, लैंडस्केप मोड में बदल जाती है और उसके साइज़ में बदलाव किया जा सकता है.
यहां डिवाइस मोड का असर पड़ता है: टैबलेट मोड में, ओरिएंटेशन लॉक नहीं होता. साथ ही, हर विंडो अपना ओरिएंटेशन बनाए रखती है. ऐसा Android पर आम तौर पर होता है.
ओरिएंटेशन से जुड़े दिशा-निर्देश
ओरिएंटेशन को मैनेज करने के लिए, इन दिशा-निर्देशों का पालन करें:
- अगर आपका ऐप्लिकेशन सिर्फ़ एक ओरिएंटेशन के साथ काम करता है, तो मेनिफ़ेस्ट में यह जानकारी जोड़ें. इससे विंडो मैनेजर को ऐप्लिकेशन शुरू करने से पहले ही इस बारे में पता चल जाएगा. ओरिएंटेशन तय करते समय, जहां भी हो सके वहां सेंसर के ओरिएंटेशन भी तय करें. Chromebook को अक्सर कन्वर्ट किया जा सकता है. ऐसे में, ऐप्लिकेशन का उल्टा दिखना, उपयोगकर्ता के लिए खराब अनुभव होता है.
- चुने गए किसी एक ओरिएंटेशन का इस्तेमाल करें. मेनिफ़ेस्ट में एक ओरिएंटेशन का अनुरोध करने और बाद में प्रोग्राम के हिसाब से दूसरा ओरिएंटेशन सेट करने से बचें.
- विंडो के साइज़ के हिसाब से ओरिएंटेशन बदलते समय सावधानी बरतें. ऐसा हो सकता है कि उपयोगकर्ता, पोर्ट्रेट साइज़ वाली छोटी विंडो में फंस जाए और लैंडस्केप साइज़ वाली बड़ी विंडो पर वापस न आ पाए.
- Chrome में विंडो कंट्रोल होते हैं. इनकी मदद से, उपलब्ध सभी लेआउट के बीच टॉगल किया जा सकता है. ओरिएंटेशन का सही विकल्प चुनकर, यह पक्का किया जा सकता है कि ऐप्लिकेशन लॉन्च करने के बाद, उपयोगकर्ता को सही लेआउट दिखे. अगर कोई ऐप्लिकेशन पोर्ट्रेट और लैंडस्केप, दोनों मोड में उपलब्ध है, तो उसे डिफ़ॉल्ट रूप से लैंडस्केप मोड में सेट करें. इस विकल्प को सेट करने के बाद, इसे हर ऐप्लिकेशन के हिसाब से याद रखा जाता है.
- बेवजह ओरिएंटेशन बदलने से बचें. उदाहरण के लिए, अगर गतिविधि का ओरिएंटेशन पोर्ट्रेट है, लेकिन ऐप्लिकेशन रनटाइम में
setRequestedOrientation(LANDSCAPE)को कॉल करता है, तो इससे विंडो का साइज़ ज़रूरत से ज़्यादा बदल जाता है. इससे उपयोगकर्ता को परेशानी होती है. साथ ही, ऐसा हो सकता है कि ऐप्लिकेशन इसे हैंडल न कर पाए और रीस्टार्ट हो जाए. स्क्रीन की दिशा को एक बार सेट करना बेहतर होता है. उदाहरण के लिए, मेनिफ़ेस्ट में और इसे सिर्फ़ तब बदलना चाहिए, जब ज़रूरी हो.
ध्यान देने वाली अन्य बातें
ChromeOS में Android ऐप्लिकेशन इस्तेमाल करते समय, इन बातों का भी ध्यान रखें:
- अपनी गतिविधि के
onDestroyतरीके में,finish()को कॉल न करें. इससे ऐप्लिकेशन का साइज़ बदलने पर, वह बंद हो जाता है और रीस्टार्ट नहीं होता. - ऐसी विंडो टाइप का इस्तेमाल न करें जो काम नहीं करती हैं. जैसे,
TYPE_KEYGUARDऔरTYPE_APPLICATION_MEDIA. - पहले से असाइन किए गए ऑब्जेक्ट को कैश मेमोरी में सेव करके, गतिविधि को तेज़ी से रीस्टार्ट करें.
- अगर आपको उपयोगकर्ता को अपने ऐप्लिकेशन का साइज़ बदलने की अनुमति नहीं देनी है, तो अपनी मेनिफ़ेस्ट फ़ाइल में
android:resizeableActivity=falseको शामिल करें. - अपने ऐप्लिकेशन की जांच करें, ताकि यह पक्का किया जा सके कि वह विंडो के साइज़ में होने वाले बदलावों को सही तरीके से मैनेज करता हो.