कनेक्ट किए गए डिसप्ले के साथ काम करना

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

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

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

अगर डेस्कटॉप विंडोइंग की सुविधा वाले किसी डिवाइस (जैसे, टैबलेट) को बाहरी मॉनिटर से कनेक्ट किया जाता है, तो डेस्कटॉप सेशन दोनों डिसप्ले पर दिखता है. इसके बाद, दोनों डिसप्ले एक ही सिस्टम के तौर पर काम करते हैं. इस सेटअप की मदद से, विंडो, कॉन्टेंट, और कर्सर को दोनों डिसप्ले के बीच आसानी से ले जाया जा सकता है.

दूसरी इमेज. टैबलेट को किसी बाहरी मॉनिटर से कनेक्ट किया गया है. इससे डेस्कटॉप सेशन, दोनों डिसप्ले पर दिखता है.

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

डाइनैमिक डिसप्ले में होने वाले बदलावों को मैनेज करना

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

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

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

सही संदर्भ का इस्तेमाल करना

एक से ज़्यादा डिसप्ले वाले एनवायरमेंट में, सही कॉन्टेक्स्ट का इस्तेमाल करना ज़रूरी है. संसाधन ऐक्सेस करते समय, गतिविधि का कॉन्टेक्स्ट (जो दिखता है) ऐप्लिकेशन के कॉन्टेक्स्ट (जो नहीं दिखता) से अलग होता है.

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

Jetpack Compose में, LocalConfiguration.current और LocalDensity.current जैसे CompositionLocal ऑब्जेक्ट का इस्तेमाल करके, डिसप्ले से जुड़ी जानकारी ऐक्सेस की जा सकती है. जब कोई ऐक्टिविटी या विंडो एक से दूसरे डिसप्ले पर जाती है, तो डिवाइस के कॉन्फ़िगरेशन में बदलाव होता है. इससे, डिसप्ले की नई मेट्रिक के साथ फिर से कंपोज़िशन ट्रिगर होती है. 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 API या विंडो साइज़ क्लास का इस्तेमाल करें.

बाहरी सहायक डिवाइसों के साथ काम करने की सुविधा

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

उपयोगकर्ता की प्रॉडक्टिविटी बढ़ाना

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

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

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