कनेक्ट किए गए डिसप्ले, स्टैंडर्ड फ़ोन पर डेस्कटॉप विंडोइंग की सुविधा को बेहतर बनाते हैं. इससे उपयोगकर्ताओं को अपने फ़ोन से बड़ी स्क्रीन को ऐक्सेस करने की सुविधा मिलती है. इस सुविधा की मदद से, ऐप्लिकेशन के साथ इंटरैक्ट करने और उपयोगकर्ता की प्रॉडक्टिविटी बढ़ाने के नए अवसर मिलते हैं.
डेस्कटॉप विंडोइंग की सभी यूनीक सुविधाएं, कनेक्ट किए गए डिसप्ले पर लागू होती हैं. फ़ोन को किसी डिसप्ले से कनेक्ट करने पर, फ़ोन की स्थिति में कोई बदलाव नहीं होता. साथ ही, कनेक्ट किए गए डिसप्ले पर एक खाली डेस्कटॉप सेशन शुरू हो जाता है. डिवाइस और डिसप्ले, दो अलग-अलग सिस्टम के तौर पर काम करते हैं. हर डिसप्ले के लिए अलग-अलग ऐप्लिकेशन होते हैं.
अगर डेस्कटॉप विंडोइंग की सुविधा वाले किसी डिवाइस (जैसे, टैबलेट) को किसी बाहरी मॉनिटर से कनेक्ट किया जाता है, तो डेस्कटॉप सेशन दोनों डिसप्ले पर दिखता है. इसके बाद, दोनों डिसप्ले एक ही सिस्टम के तौर पर काम करते हैं. इस सेटअप की मदद से, विंडो, कॉन्टेंट, और कर्सर को दोनों डिसप्ले के बीच आसानी से मूव किया जा सकता है.
कनेक्ट किए गए डिसप्ले पर ऐप्लिकेशन को बेहतर तरीके से चलाने के लिए, आपको अपने ऐप्लिकेशन के डिज़ाइन और उसे लागू करने के कई पहलुओं पर ध्यान देना होगा. यहां दिए गए सबसे सही तरीकों को अपनाकर, उपयोगकर्ताओं को बेहतर और असरदार अनुभव दिया जा सकता है.
डिसप्ले में होने वाले डाइनैमिक बदलावों को मैनेज करना
कई ऐप्लिकेशन इस अनुमान के साथ बनाए जाते हैं कि ऐप्लिकेशन के लाइफ़साइकल के दौरान, Display ऑब्जेक्ट और उसकी विशेषताओं में कोई बदलाव नहीं होगा. हालांकि, जब कोई उपयोगकर्ता किसी बाहरी मॉनिटर को कनेक्ट या डिसकनेक्ट करता है या ऐप्लिकेशन विंडो को एक डिसप्ले से दूसरे डिसप्ले पर ले जाता है, तो आपके ऐप्लिकेशन के कॉन्टेक्स्ट या विंडो से जुड़ा Display ऑब्जेक्ट बदल सकता है. डिसप्ले की प्रॉपर्टी, जैसे कि साइज़, रिज़ॉल्यूशन, रीफ़्रेश रेट, एचडीआर सपोर्ट, और डेंसिटी, सभी अलग-अलग हो सकती हैं. उदाहरण के लिए, अगर फ़ोन की स्क्रीन के हिसाब से वैल्यू को हार्डकोड किया जाता है, तो हो सकता है कि आपके लेआउट किसी बाहरी डिसप्ले पर सही से न दिखें.
बाहरी डिसप्ले की पिक्सल डेंसिटी भी काफ़ी अलग हो सकती है. आपको यह पक्का करना होगा कि आपका ऐप्लिकेशन, डेंसिटी में होने वाले बदलावों के हिसाब से सही तरीके से काम करे. इसके लिए, लेआउट के लिए डेंसिटी-इंडिपेंडेंट पिक्सल (डीपी) का इस्तेमाल करना, डेंसिटी के हिसाब से संसाधन उपलब्ध कराना, और यह पक्का करना शामिल है कि आपका यूज़र इंटरफ़ेस (यूआई) सही तरीके से स्केल हो.
अगर डिसप्ले डिसकनेक्ट होने पर, बाहरी डिसप्ले पर कोई गतिविधि चल रही है, तो सिस्टम उस गतिविधि को प्राइमरी डिसप्ले पर ले जाता है. इस बदलाव से, कॉन्फ़िगरेशन में बदलाव होते हैं. जैसे, स्क्रीन के साइज़ और डेंसिटी में बदलाव. इनकी वजह से, गतिविधि को फिर से बनाया जा सकता है. आपके ऐप्लिकेशन को कॉन्फ़िगरेशन में होने वाले बदलाव को मैनेज करना चाहिए. इसके लिए, यूज़र इंटरफ़ेस (यूआई) की स्थिति को सेव और वापस लाना चाहिए, ताकि डेटा को मिटने से बचाया जा सके या उपयोगकर्ता को भ्रमित करने वाले अनुभव से बचाया जा सके.
सही कॉन्टेक्स्ट का इस्तेमाल करना
एक से ज़्यादा डिसप्ले वाले एनवायरमेंट में, सही कॉन्टेक्स्ट का इस्तेमाल करना ज़रूरी है. संसाधनों को ऐक्सेस करते समय, गतिविधि का कॉन्टेक्स्ट (जो दिखता है) ऐप्लिकेशन के कॉन्टेक्स्ट (जो नहीं दिखता है) से अलग होता है.
गतिविधि के कॉन्टेक्स्ट में, डिसप्ले के बारे में जानकारी होती है. साथ ही, इसे हमेशा उस डिसप्ले एरिया के हिसाब से अडजस्ट किया जाता है जिसमें गतिविधि दिखती है. इससे आपको अपने ऐप्लिकेशन की डिसप्ले डेंसिटी या विंडो मेट्रिक के बारे में सही जानकारी मिलती है. मौजूदा विंडो या डिसप्ले के बारे में जानकारी पाने के लिए, हमेशा गतिविधि के कॉन्टेक्स्ट (या यूज़र इंटरफ़ेस (यूआई) पर आधारित किसी अन्य कॉन्टेक्स्ट) का इस्तेमाल करें. इससे कुछ ऐसे सिस्टम एपीआई पर भी असर पड़ता है जो कॉन्टेक्स्ट से मिली जानकारी का इस्तेमाल करते हैं.
Jetpack Compose में, CompositionLocal ऑब्जेक्ट का इस्तेमाल करके, डिसप्ले से जुड़ी जानकारी को ऐक्सेस किया जा सकता है. जैसे, LocalConfiguration.current और LocalDensity.current. जब कोई गतिविधि या विंडो एक डिसप्ले से दूसरे डिसप्ले पर स्विच होती है, तो डिवाइस कॉन्फ़िगरेशन बदल जाता है. इससे, नए डिसप्ले मेट्रिक के साथ फिर से कॉम्पोज़िशन ट्रिगर होता है. CompositionLocal ऑब्जेक्ट की मदद से, यूज़र इंटरफ़ेस (यूआई) को आसानी से अडजस्ट किया जा सकता है.
डिसप्ले की जानकारी पाना
डिसप्ले के साइज़, डेंसिटी या फ़्लैग जैसी जानकारी पाने के लिए, Display क्लास का इस्तेमाल किया जा सकता है. उपलब्ध डिसप्ले की जानकारी पाने के लिए, DisplayManager सिस्टम सर्विस का इस्तेमाल करें. बाहरी डिसप्ले की पहचान करने के लिए, Display.DEFAULT_DISPLAY को फ़िल्टर करें. आम तौर पर, यह फ़ोन या टैबलेट की पहले से मौजूद स्क्रीन होती है:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays() // The default display is 0. External displays have other IDs. val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
गतिविधि लॉन्च और कॉन्फ़िगरेशन मैनेज करना
कनेक्ट किए गए डिसप्ले की मदद से, ऐप्लिकेशन यह तय कर सकते हैं कि लॉन्च होने या कोई दूसरी गतिविधि बनाने पर, ऐप्लिकेशन को किस डिसप्ले पर चलना चाहिए. यह व्यवहार, मेनिफ़ेस्ट फ़ाइल में तय किए गए गतिविधि लॉन्च मोड पर निर्भर करता है. साथ ही, गतिविधि लॉन्च करने वाली इकाई के सेट किए गए इंटेंट फ़्लैग और विकल्पों पर भी निर्भर करता है.
जब कोई गतिविधि सेकंडरी डिसप्ले पर मूव होती है, तो आपके ऐप्लिकेशन में कॉन्टेक्स्ट अपडेट, विंडो का साइज़ बदलना, और कॉन्फ़िगरेशन और संसाधन में बदलाव हो सकते हैं. अगर गतिविधि, कॉन्फ़िगरेशन में हुए बदलाव को मैनेज करती है, तो इसकी सूचना onConfigurationChanged() में दी जाती है. ऐसा न होने पर, गतिविधि को फिर से लॉन्च किया जाता है.
अगर किसी गतिविधि के लिए चुना गया लॉन्च मोड, एक से ज़्यादा इंस्टेंस की अनुमति देता है, तो दूसरी स्क्रीन पर लॉन्च करने से गतिविधि का नया इंस्टेंस बन सकता है. दोनों गतिविधियां एक ही समय पर फिर से शुरू होती हैं. इससे एक साथ कई काम करने में मदद मिल सकती है.
ActivityOptions का इस्तेमाल करके, किसी खास डिसप्ले पर कोई गतिविधि लॉन्च की जा सकती है.
ध्यान दें कि launchDisplayId के लिए, Android 8 (एपीआई लेवल 26) या इसके बाद का वर्शन होना ज़रूरी है.
// Get DisplayManager and find the first external display. val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val externalDisplayId = displayManager.displays .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY } ?.displayId // If an external display is found, launch the activity on it. if (externalDisplayId != null) { val intent = Intent(this, MySecondaryActivity::class.java) val options = ActivityOptions.makeBasic() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { options.launchDisplayId = externalDisplayId } startActivity(intent, options.toBundle()) } else { // Optionally, handle the case where no external display is connected. }
डिवाइस की अनुमति वाली सूचियों से बचें
ऐप्लिकेशन कभी-कभी बड़ी स्क्रीन वाले यूज़र इंटरफ़ेस (यूआई) और सुविधाओं को कुछ डिवाइसों तक ही सीमित कर देते हैं. इसके लिए, वे अनुमति वाली सूची का इस्तेमाल करते हैं या BUILD.MODEL और पहले से मौजूद डिसप्ले साइज़ की जांच करते हैं.
यह तरीका, कनेक्ट किए गए डिसप्ले के लिए असरदार नहीं है. इसकी वजह यह है कि किसी भी डिवाइस को बड़ी स्क्रीन से कनेक्ट किया जा सकता है. साथ ही, बाहरी डिसप्ले कनेक्ट होने पर डिवाइस का मॉडल नहीं बदलता.
अनुमति वाली सूचियों का इस्तेमाल करने या BUILD.MODEL और पहले से मौजूद डिसप्ले साइज़ की जांच करने के बजाय, रनटाइम के दौरान विंडो मेट्रिक या डिवाइस की क्षमताओं की जांच करें. इससे यूज़र इंटरफ़ेस (यूआई) से जुड़े फ़ैसले लेने में मदद मिलेगी. अलग-अलग स्क्रीन साइज़ और डेंसिटी के लिए, रिस्पॉन्सिव और अडैप्टिव लेआउट बनाने के लिए, Jetpack WindowManager एपीआई या विंडो साइज़ क्लास का इस्तेमाल करें.
बाहरी सहायक डिवाइसों (जैसे, कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) के साथ काम करना
जब उपयोगकर्ता किसी बाहरी डिसप्ले से कनेक्ट करते हैं, तो वे अक्सर डेस्कटॉप जैसा एनवायरमेंट बनाते हैं. इसके लिए, अक्सर बाहरी कीबोर्ड, माउस, ट्रैकपैड, वेबकैम, माइक्रोफ़ोन, और स्पीकर का इस्तेमाल किया जाता है. आपको यह पक्का करना होगा कि आपका ऐप्लिकेशन, इन पेरिफ़ेरल डिवाइसों के साथ आसानी से काम करे. इसमें कीबोर्ड शॉर्टकट को मैनेज करना, माउस पॉइंटर के इंटरैक्शन को मैनेज करना, बाहरी कैमरे या माइक्रोफ़ोन के साथ सही तरीके से काम करना, और ऑडियो आउटपुट रूटिंग का पालन करना शामिल है. ज़्यादा जानकारी के लिए, बड़ी स्क्रीन पर इनपुट के साथ काम करने की सुविधा देखें.
उपयोगकर्ता की प्रॉडक्टिविटी बढ़ाना
कनेक्ट किए गए डिसप्ले, उपयोगकर्ता की उत्पादकता को बेहतर बनाने का एक शानदार मौका देते हैं. अब आपके पास ऐसे टूल हैं जिनकी मदद से, मोबाइल ऐप्लिकेशन बनाए जा सकते हैं. ये ऐप्लिकेशन, डेस्कटॉप ऐप्लिकेशन जैसा अनुभव दे सकते हैं. उपयोगकर्ता की प्रॉडक्टिविटी बढ़ाने के लिए, इन सुविधाओं को लागू करें:
- उपयोगकर्ताओं को एक ही ऐप्लिकेशन के कई इंस्टेंस खोलने की अनुमति दें. यह सुविधा, दस्तावेज़ों की तुलना करने, अलग-अलग बातचीत मैनेज करने या एक साथ कई फ़ाइलें देखने जैसे कामों के लिए बहुत काम की है.
- खींचें और छोड़ें सुविधा की मदद से, उपयोगकर्ताओं को अपने ऐप्लिकेशन में और उससे बाहर रिच डेटा शेयर करने की सुविधा दें.
- स्टेट मैनेजमेंट सिस्टम को बेहतर तरीके से लागू करके, कॉन्फ़िगरेशन में बदलाव होने पर भी उपयोगकर्ताओं को अपना वर्कफ़्लो बनाए रखने में मदद करें.
इन दिशा-निर्देशों का पालन करके और दिए गए कोड के उदाहरणों का इस्तेमाल करके, ऐसे ऐप्लिकेशन बनाए जा सकते हैं जो कनेक्ट किए गए डिसप्ले के हिसाब से आसानी से अडजस्ट हो जाएं. इससे उपयोगकर्ताओं को बेहतर और ज़्यादा फ़ायदेमंद अनुभव मिलता है.