मल्टी-विंडो मोड के साथ काम करता है

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

पहली इमेज. स्प्लिट-स्क्रीन मोड में, दो ऐप्लिकेशन को अगल-बगल में दिखाएं.

फ़ोनों पर स्प्लिट‑स्क्रीन मोड को ऐक्सेस करने के बारे में उपयोगकर्ता के लिए दिए गए निर्देशों को पढ़ने के लिए, Pixel फ़ोन पर एक ही समय पर दो ऐप्लिकेशन देखना पर जाएं.

वर्शन के हिसाब से मल्टी-विंडो की सुविधाएं

मल्टी-विंडो की सुविधा का इस्तेमाल करने का अनुभव, Android के वर्शन और डिवाइस के टाइप पर निर्भर करता है:

  • Android 7.0 (एपीआई लेवल 24) में, छोटी स्क्रीन वाले डिवाइसों के लिए स्प्लिट-स्क्रीन मोड और कुछ डिवाइसों के लिए पिक्चर में पिक्चर मोड की सुविधा लॉन्च की गई थी.

    • स्प्लिट-स्क्रीन मोड में, स्क्रीन पर दो ऐप्लिकेशन दिखते हैं. ये ऐप्लिकेशन, एक-दूसरे के बगल में या एक के ऊपर एक दिखते हैं. उपयोगकर्ता, दो ऐप्लिकेशन को अलग करने वाले डिवाइडर को खींचकर, एक ऐप्लिकेशन को बड़ा और दूसरे को छोटा कर सकते हैं.

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

    • डेस्कटॉप विंडोइंग मोड को बड़ी स्क्रीन वाले डिवाइस बनाने वाली कंपनियां चालू कर सकती हैं. इस मोड में, उपयोगकर्ता हर गतिविधि के साइज़ में बदलाव कर सकते हैं.

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

  • Android 8.0 (एपीआई लेवल 26) में, छोटे स्क्रीन वाले डिवाइसों के लिए पिक्चर-इन-पिक्चर मोड की सुविधा उपलब्ध है.

  • Android 12 (एपीआई लेवल 31) में, मल्टी-विंडो मोड को स्टैंडर्ड मोड बना दिया गया है.

    • बड़ी स्क्रीन (मीडियम या एक्सपैंडेड विंडो साइज़ क्लास) पर, प्लैटफ़ॉर्म मल्टी-विंडो मोड में सभी ऐप्लिकेशन के साथ काम करता है. भले ही, ऐप्लिकेशन का कॉन्फ़िगरेशन कुछ भी हो. अगर resizeableActivity="false" है, तो डिसप्ले डाइमेंशन के हिसाब से ऐप्लिकेशन को ज़रूरत पड़ने पर कंपैटिबिलिटी मोड में डाल दिया जाता है.

    • छोटी स्क्रीन (compact विंडो साइज़ क्लास) पर, सिस्टम किसी गतिविधि के minWidth और minHeight की जांच करता है. इससे यह तय किया जाता है कि गतिविधि को मल्टी-विंडो मोड में चलाया जा सकता है या नहीं. अगर resizeableActivity="false" है, तो ऐप्लिकेशन को मल्टी-विंडो मोड में चलने से रोक दिया जाता है. भले ही, कम से कम चौड़ाई और ऊंचाई कितनी भी हो.

  • Android 16 (एपीआई लेवल 36) में, स्क्रीन ओरिएंटेशन, आसपेक्ट रेशियो, और साइज़ बदलने से जुड़ी पाबंदियों को अनदेखा किया जाता है.

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

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

स्प्लिट स्क्रीन मोड

उपयोगकर्ता, स्प्लिट स्क्रीन मोड को इन तरीकों से चालू करते हैं:

  1. हाल ही के आइटम वाली स्क्रीन खोलें
  2. किसी ऐप्लिकेशन को व्यू में लाएं
  3. ऐप्लिकेशन के टाइटल बार में मौजूद ऐप्लिकेशन आइकॉन को दबाकर रखें
  4. स्प्लिट स्क्रीन मोड का विकल्प चुनें
  5. 'हाल ही के ऐप्लिकेशन' स्क्रीन से कोई दूसरा ऐप्लिकेशन चुनें या 'हाल ही के ऐप्लिकेशन' स्क्रीन को बंद करके कोई दूसरा ऐप्लिकेशन चलाएं

स्प्लिट स्क्रीन मोड से बाहर निकलने के लिए, उपयोगकर्ता विंडो डिवाइडर को स्क्रीन के किनारे पर खींचकर छोड़ते हैं. यह ऊपर या नीचे, बाएं या दाएं हो सकता है.

बगल में लॉन्च करें

अगर आपके ऐप्लिकेशन को किसी इंटेंट के ज़रिए कॉन्टेंट ऐक्सेस करना है, तो FLAG_ACTIVITY_LAUNCH_ADJACENT का इस्तेमाल करके, कॉन्टेंट को स्प्लिट-स्क्रीन वाली बगल की विंडो में खोला जा सकता है.

FLAG_ACTIVITY_LAUNCH_ADJACENT को Android 7.0 (एपीआई लेवल 24) में इसलिए पेश किया गया था, ताकि स्प्लिट-स्क्रीन मोड में चल रहे ऐप्लिकेशन, बगल वाली विंडो में ऐक्टिविटी लॉन्च कर सकें.

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

किसी दूसरी गतिविधि को लॉन्च करने के लिए, FLAG_ACTIVITY_NEW_TASK के साथ FLAG_ACTIVITY_LAUNCH_ADJACENT का इस्तेमाल करें. उदाहरण के लिए:

fun openUrlInAdjacentWindow(url: String) {
    Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
       addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
    }.also { intent -> startActivity(intent) }
}

मल्टी-विंडो मोड में गतिविधि की लाइफ़साइकल

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

एक से ज़्यादा बार फिर से शुरू करना

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

मल्टी-रिज़्यूम की सुविधा, Android 9 (एपीआई लेवल 28) पर काम करने वाले चुनिंदा डिवाइसों पर भी उपलब्ध है. Android 9 वाले डिवाइसों पर मल्टी-रिज़्यूम की सुविधा में ऑप्ट इन करने के लिए, यह मेनिफ़ेस्ट मेटाडेटा जोड़ें:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

यह पुष्टि करने के लिए कि किसी डिवाइस पर यह मेनिफ़ेस्ट मेटाडेटा काम करता है, डिवाइस की खास जानकारी देखें.

Android 9

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

जब किसी चालू ऐप्लिकेशन प्रोसेस में एक से ज़्यादा गतिविधियां होती हैं, तो सबसे ज़्यादा z-ऑर्डर वाली गतिविधि को फिर से शुरू किया जाता है और बाकी को रोक दिया जाता है.

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

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

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

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

खास संसाधनों का ऐक्सेस

मल्टी-रिज़्यूम सुविधा को बेहतर तरीके से काम करने में मदद करने के लिए, onTopResumedActivityChanged() लाइफ़साइकल कॉलबैक का इस्तेमाल करें.

जब कोई गतिविधि, सबसे ऊपर मौजूद गतिविधि की पोज़िशन में आती है या उससे बाहर जाती है, तब कॉलबैक शुरू होता है. यह तब ज़रूरी होता है, जब कोई गतिविधि शेयर किए गए सिंगलटन रिसोर्स का इस्तेमाल करती है. जैसे, माइक्रोफ़ोन या कैमरा:

override fun onTopResumedActivityChanged(topResumed: Boolean) {
    if (topResumed) {
        // Top resumed activity.
        // Can be a signal to re-acquire exclusive resources.
    } else {
        // No longer the top resumed activity.
    }
}

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

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

कैमरे का इस्तेमाल करने वाले ऐप्लिकेशन के लिए, CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() यह सुझाव देता है कि कैमरे का ऐक्सेस पाने की कोशिश करने का यह सही समय हो सकता है. यह तरीका, Android 10 (एपीआई लेवल 29) से उपलब्ध है.

ध्यान रखें कि resizeableActivity=false का मतलब यह नहीं है कि कैमरे का ऐक्सेस सिर्फ़ आपके पास होगा. ऐसा इसलिए, क्योंकि कैमरे का इस्तेमाल करने वाले अन्य ऐप्लिकेशन को अन्य डिसप्ले पर खोला जा सकता है.

दूसरी इमेज. मल्टी-विंडो मोड में कैमरा.

जब ऐप्लिकेशन फ़ोकस में न हो, तब आपके ऐप्लिकेशन को कैमरा बंद करने की ज़रूरत नहीं होती. उदाहरण के लिए, हो सकता है कि उपयोगकर्ता के नए फ़ोकस किए गए सबसे ऊपर दिखने वाले ऐप्लिकेशन के साथ इंटरैक्ट करने के दौरान, आपको कैमरे की झलक दिखानी हो. अगर आपका ऐप्लिकेशन सबसे ऊपर दिखने वाला ऐप्लिकेशन नहीं है, तो कैमरे को चालू रखना ठीक है. हालांकि, इसे डिसकनेक्ट होने की स्थिति को ठीक से हैंडल करना होगा. सबसे ऊपर मौजूद, फिर से शुरू किए गए ऐप्लिकेशन को कैमरा इस्तेमाल करने की अनुमति मिल सकती है. इससे आपके ऐप्लिकेशन का ऐक्सेस खत्म हो जाएगा. ऐप्लिकेशन को फ़ोकस वापस मिलने पर, कैमरा फिर से चालू किया जा सकता है.

किसी ऐप्लिकेशन को CameraDevice.StateCallback#onDisconnected() कॉलबैक मिलने के बाद, कैमरे वाले डिवाइस पर किए गए बाद के कॉल से CameraAccessException मिलेगा.

विंडो मेट्रिक

Android 11 (एपीआई लेवल 30) में, मल्टी-विंडो मोड में चल रहे ऐप्लिकेशन की सीमाओं के बारे में बताने के लिए, WindowManager ये तरीके पेश किए गए हैं:

  • getCurrentWindowMetrics(): यह सिस्टम की मौजूदा विंडो की स्थिति के लिए, WindowMetrics ऑब्जेक्ट दिखाता है.
  • getMaximumWindowMetrics(): यह सिस्टम की सबसे बड़ी संभावित विंडोइंग स्थिति के लिए WindowMetrics दिखाता है.

Jetpack WindowManager लाइब्रेरी के computeCurrentWindowMetrics() और computeMaximumWindowMetrics() तरीके, एक जैसी सुविधाएं देते हैं. हालांकि, ये एपीआई लेवल 14 के साथ काम करते हैं.

मौजूदा डिसप्ले के अलावा अन्य डिसप्ले के लिए मेट्रिक पाने के लिए, यह तरीका अपनाएं (कोड स्निपेट में दिखाया गया है):

  • डिसप्ले कॉन्टेक्स्ट बनाना
  • डिसप्ले के लिए विंडो कॉन्टेक्स्ट बनाएं
  • विंडो के कॉन्टेक्स्ट के बारे में WindowManager जानकारी पाना
  • ऐप्लिकेशन के लिए उपलब्ध ज़्यादा से ज़्यादा डिसप्ले एरिया का WindowMetrics पाएं

val windowMetrics = context.createDisplayContext(display)
                           .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                           .getSystemService(WindowManager::class.java)
                           .maximumWindowMetrics

ऐसे तरीके जो अब इस्तेमाल में नहीं हैं

Display तरीके getSize() और getMetrics() को एपीआई लेवल 30 में बंद कर दिया गया था. इनकी जगह नए WindowManager तरीकों का इस्तेमाल किया जाता है.

Android 12 (एपीआई लेवल 31) में, Display तरीकों getRealSize() और getRealMetrics() को बंद कर दिया गया है. साथ ही, इनके व्यवहार को getMaximumWindowMetrics() के व्यवहार से ज़्यादा मेल खाने के लिए अपडेट किया गया है.

मल्टी-विंडो मोड को कॉन्फ़िगर करना

अगर आपका ऐप्लिकेशन, Android 7.0 (एपीआई लेवल 24) या उसके बाद के वर्शन को टारगेट करता है, तो आपके पास यह कॉन्फ़िगर करने का विकल्प होता है कि आपके ऐप्लिकेशन की गतिविधियां, मल्टी-विंडो मोड के साथ कैसे और काम करती हैं. साइज और लेआउट, दोनों को कंट्रोल करने के लिए, अपने मेनिफ़ेस्ट में एट्रिब्यूट सेट किए जा सकते हैं. रूट ऐक्टिविटी के एट्रिब्यूट की सेटिंग, उसके टास्क स्टैक में मौजूद सभी ऐक्टिविटी पर लागू होती हैं. उदाहरण के लिए, अगर रूट ऐक्टिविटी में android:resizeableActivity="true" है, तो टास्क स्टैक में मौजूद सभी ऐक्टिविटी का साइज़ बदला जा सकता है. Chromebook जैसे कुछ बड़े डिवाइसों पर, आपका ऐप्लिकेशन ऐसी विंडो में चल सकता है जिसका साइज़ बदला जा सकता है. भले ही, आपने android:resizeableActivity="false" तय किया हो. अगर इससे आपके ऐप्लिकेशन पर असर पड़ता है, तो Google Play पर फ़िल्टर का इस्तेमाल करके, ऐसे डिवाइसों पर अपने ऐप्लिकेशन की उपलब्धता को सीमित किया जा सकता है.

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

resizeableActivity

एपीआई लेवल 30 और उससे पहले के वर्शन के लिए, मल्टी-विंडो मोड को चालू या बंद करने के लिए, अपने मेनिफ़ेस्ट के <activity> या <application> एलिमेंट में यह एट्रिब्यूट सेट करें:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

अगर इस एट्रिब्यूट को true पर सेट किया जाता है, तो गतिविधि को स्प्लिट-स्क्रीन और डेस्कटॉप विंडोइंग मोड में लॉन्च किया जा सकता है. अगर एट्रिब्यूट को false पर सेट किया जाता है, तो गतिविधि मल्टी-विंडो मोड के साथ काम नहीं करती. अगर वैल्यू को false पर सेट किया जाता है और उपयोगकर्ता मल्टी-विंडो मोड में गतिविधि लॉन्च करने की कोशिश करता है, तो गतिविधि पूरी स्क्रीन पर दिखती है.

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

अगर आपका ऐप्लिकेशन, एपीआई लेवल 31 या उसके बाद के लेवल को टारगेट करता है, तो यह एट्रिब्यूट छोटी और बड़ी स्क्रीन पर अलग-अलग तरीके से काम करता है:

  • बड़ी स्क्रीन (मीडियम या बड़ी विंडो साइज़ क्लास): सभी ऐप्लिकेशन, मल्टी-विंडो मोड के साथ काम करते हैं. इस एट्रिब्यूट से पता चलता है कि किसी गतिविधि का साइज़ बदला जा सकता है या नहीं. अगर resizeableActivity="false" है, तो डिसप्ले के डाइमेंशन के मुताबिक ऐप्लिकेशन को ज़रूरत के हिसाब से कंपैटिबिलिटी मोड में डाल दिया जाता है.
  • छोटी स्क्रीन (कॉम्पैक्ट विंडो साइज़ क्लास): अगर resizeableActivity="true" और ऐक्टिविटी की कम से कम चौड़ाई और कम से कम ऊंचाई, मल्टी-विंडो मोड की ज़रूरी शर्तों के मुताबिक है, तो ऐक्टिविटी मल्टी-विंडो मोड के साथ काम करती है. अगर resizeableActivity="false" है, तो गतिविधि में मल्टी-विंडो मोड काम नहीं करेगा. भले ही, गतिविधि की कम से कम चौड़ाई और ऊंचाई कुछ भी हो.

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

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

supportsPictureInPicture

अपने मेनिफ़ेस्ट के <activity> नोड में इस एट्रिब्यूट को सेट करें. इससे यह पता चलेगा कि गतिविधि, पिक्चर-इन-पिक्चर मोड के साथ काम करती है या नहीं.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

अगर आपको मल्टी-विंडो कॉन्फ़िगरेशन में होने वाले बदलावों को खुद मैनेज करना है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट <activity> नोड में android:configChanges एट्रिब्यूट जोड़ें. जैसे, जब कोई उपयोगकर्ता किसी विंडो का साइज़ बदलता है. इसमें कम से कम ये वैल्यू होनी चाहिए:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

android:configChanges जोड़ने के बाद, आपकी गतिविधि और फ़्रैगमेंट को मिटाने और फिर से बनाने के बजाय, onConfigurationChanged() पर वापस कॉल किया जाता है. इसके बाद, ज़रूरत के मुताबिक व्यू को मैन्युअल तरीके से अपडेट किया जा सकता है, संसाधनों को फिर से लोड किया जा सकता है, और अन्य कार्रवाइयां की जा सकती हैं.

<layout>

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

  • android:defaultHeight, android:defaultWidth: डेस्कटॉप विंडोविंग मोड में लॉन्च होने पर, गतिविधि की डिफ़ॉल्ट ऊंचाई और चौड़ाई.

  • android:gravity: डेस्कटॉप विंडोइंग मोड में लॉन्च किए जाने पर, गतिविधि की शुरुआती जगह. सही वैल्यू के लिए, Gravity क्लास देखें.

  • android:minHeight, android:minWidth: स्प्लिट-स्क्रीन और डेस्कटॉप विंडोविंग मोड, दोनों में गतिविधि के लिए कम से कम ऊंचाई और कम से कम चौड़ाई. अगर उपयोगकर्ता, स्प्लिट-स्क्रीन मोड में डिवाइडर को इस तरह से ले जाता है कि गतिविधि का साइज़ तय किए गए कम से कम साइज़ से छोटा हो जाता है, तो सिस्टम गतिविधि को उपयोगकर्ता के अनुरोध किए गए साइज़ में काट देता है.

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

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

रनटाइम के दौरान मल्टी-विंडो मोड

Android 7.0 से, सिस्टम ऐसी सुविधाएं देता है जो मल्टी-विंडो मोड में चल सकने वाले ऐप्लिकेशन के साथ काम करती हैं.

मल्टी-विंडो मोड में बंद की गई सुविधाएं

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

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

सिस्टम, android:screenOrientation एट्रिब्यूट में किए गए बदलावों को अनदेखा कर देता है.

मल्टी-विंडो मोड के लिए क्वेरी और कॉलबैक

Activity क्लास, मल्टी-विंडो मोड के लिए ये तरीके उपलब्ध कराती है:

  • isInMultiWindowMode(): इससे पता चलता है कि गतिविधि मल्टी-विंडो मोड में है या नहीं.

  • isInPictureInPictureMode(): इससे पता चलता है कि गतिविधि, पिक्चर में पिक्चर मोड में है या नहीं.

  • onMultiWindowModeChanged(): सिस्टम इस तरीके को तब कॉल करता है, जब गतिविधि मल्टी-विंडो मोड में जाती है या उससे बाहर आती है. अगर गतिविधि मल्टी-विंडो मोड में जा रही है, तो सिस्टम इस तरीके को सही वैल्यू पास करता है. अगर गतिविधि मल्टी-विंडो मोड से बाहर जा रही है, तो सिस्टम इस तरीके को गलत वैल्यू पास करता है.

  • onPictureInPictureModeChanged(): सिस्टम इस तरीके को तब कॉल करता है, जब गतिविधि पिक्चर में पिक्चर मोड में जाती है या उससे बाहर आती है. अगर गतिविधि, पिक्चर में पिक्चर मोड में जा रही है, तो सिस्टम इस तरीके को true वैल्यू देता है. अगर गतिविधि, पिक्चर में पिक्चर मोड से बाहर आ रही है, तो सिस्टम इस तरीके को false वैल्यू देता है.

Fragment क्लास, इनमें से कई तरीकों के वर्शन दिखाती है. उदाहरण के लिए, Fragment.onMultiWindowModeChanged().

पिक्चर में पिक्चर मोड

किसी गतिविधि को पिक्चर में पिक्चर मोड में रखने के लिए, enterPictureInPictureMode() को कॉल करें. अगर डिवाइस पर पिक्चर में पिक्चर मोड काम नहीं करता है, तो इस तरीके का कोई असर नहीं पड़ता. ज़्यादा जानकारी के लिए, पिक्चर में पिक्चर (पीआईपी) मोड का इस्तेमाल करके वीडियो जोड़ना लेख पढ़ें.

मल्टी-विंडो मोड में नई गतिविधियां

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

अगर कोई डिवाइस डेस्कटॉप विंडोइंग मोड में है और आपको कोई नई गतिविधि शुरू करनी है, तो ActivityOptions.setLaunchBounds() को कॉल करके, नई गतिविधि के डाइमेंशन और स्क्रीन की जगह की जानकारी दी जा सकती है. अगर डिवाइस मल्टी-विंडो मोड में नहीं है, तो इस तरीके का कोई असर नहीं होगा.

एपीआई लेवल 30 और इससे कम लेवल पर, अगर किसी टास्क स्टैक में कोई गतिविधि लॉन्च की जाती है, तो वह स्क्रीन पर मौजूद गतिविधि की जगह ले लेती है. साथ ही, मल्टी-विंडो की सभी प्रॉपर्टी को इनहेरिट कर लेती है. अगर आपको नई गतिविधि को मल्टी-विंडो मोड में अलग विंडो के तौर पर लॉन्च करना है, तो आपको इसे नए टास्क स्टैक में लॉन्च करना होगा.

Android 12 (एपीआई लेवल 31) की मदद से, ऐप्लिकेशन के टास्क विंडो को कई ऐक्टिविटी के बीच बांटा जा सकता है. आपके पास यह तय करने का विकल्प होता है कि आपका ऐप्लिकेशन अपनी गतिविधियों को कैसे दिखाएगा. जैसे, फ़ुल स्क्रीन, साइड-बाय-साइड या स्टैक किया गया. इसके लिए, आपको एक्सएमएल कॉन्फ़िगरेशन फ़ाइल बनानी होगी या Jetpack WindowManager API कॉल करने होंगे.

खींचना और छोड़ना

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

एक से ज़्यादा इंस्टेंस

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

Android 12 (एपीआई लेवल 31) और इसके बाद के वर्शन में, ऐक्टिविटी एम्बेड करने की सुविधा का इस्तेमाल करके, एक ही टास्क विंडो में दो ऐक्टिविटी को एक साथ लॉन्च किया जा सकता है.

अगर आपको उपयोगकर्ताओं को ऐप्लिकेशन लॉन्चर या टास्कबार से, अपने ऐप्लिकेशन का दूसरा इंस्टेंस शुरू करने की अनुमति देनी है, तो लॉन्चर ऐक्टिविटी के मेनिफ़ेस्ट में android:resizeableActivity="true" सेट करें. साथ ही, ऐसे लॉन्च मोड का इस्तेमाल न करें जो एक से ज़्यादा इंस्टेंस को रोकता है. उदाहरण के लिए, FLAG_ACTIVITY_MULTIPLE_TASK या FLAG_ACTIVITY_NEW_DOCUMENT सेट होने पर, singleInstancePerTask ऐक्टिविटी को अलग-अलग टास्क में कई बार इंस्टैंशिएट किया जा सकता है.

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

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

मल्टी-विंडो मोड की पुष्टि करना

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

टेस्ट डिवाइस

Android 7.0 (एपीआई लेवल 24) या इसके बाद के वर्शन पर चलने वाले डिवाइसों में, मल्टी-विंडो मोड काम करता है.

एपीआई लेवल 23 या इससे पहले का लेवल

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

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

अगर ऐप्लिकेशन में ओरिएंटेशन तय किया गया है, तो आपको ऐप्लिकेशन को मल्टी-विंडो मोड में रखने की कोशिश करनी चाहिए. पुष्टि करें कि ऐसा करने पर, ऐप्लिकेशन फ़ुल स्क्रीन मोड में ही रहे.

एपीआई लेवल 24 से 30 तक

अगर आपका ऐप्लिकेशन, एपीआई लेवल 24 से 30 को टारगेट करता है और मल्टी-विंडो की सुविधा बंद नहीं करता है, तो स्प्लिट-स्क्रीन और डेस्कटॉप विंडो मोड, दोनों में इन बातों की पुष्टि करें:

  • ऐप्लिकेशन को फ़ुल स्क्रीन में लॉन्च करें. इसके बाद, हाल ही के ऐप्लिकेशन बटन को दबाकर रखें और मल्टी-विंडो मोड पर स्विच करें. पुष्टि करें कि ऐप्लिकेशन सही तरीके से स्विच हो रहा हो.

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

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

  • अगर आपने अपने ऐप्लिकेशन के लिए कम से कम डाइमेंशन तय किए हैं, तो ऐप्लिकेशन का साइज़ बदलने की कोशिश करें, ताकि उसकी विंडो का साइज़ उन डाइमेंशन से कम हो. पुष्टि करें कि ऐप्लिकेशन को तय किए गए कम से कम डाइमेंशन से छोटा नहीं किया जा सकता.

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

एपीआई लेवल 31 या उसके बाद के वर्शन

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

टेस्ट चेकलिस्ट

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

  • मल्टी-विंडो मोड में जाएं और इससे बाहर निकलें.

  • अपने ऐप्लिकेशन से किसी दूसरे ऐप्लिकेशन पर स्विच करें. इसके बाद, पुष्टि करें कि ऐप्लिकेशन दिखने पर ठीक से काम कर रहा है, भले ही वह चालू न हो. उदाहरण के लिए, अगर आपका ऐप्लिकेशन वीडियो चला रहा है, तो पुष्टि करें कि उपयोगकर्ता के किसी दूसरे ऐप्लिकेशन के साथ इंटरैक्ट करने के दौरान भी वीडियो चलता रहे.

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

  • तेज़ी से एक के बाद एक कई बार साइज़ बदलने की कार्रवाइयां करना. पुष्टि करें कि आपका ऐप्लिकेशन क्रैश न हो या मेमोरी लीक न करे. Android Studio का Memory Profiler, आपके ऐप्लिकेशन की मेमोरी के इस्तेमाल के बारे में जानकारी देता है. इसके बारे में जानने के लिए, Memory Profiler की मदद से, अपने ऐप्लिकेशन की मेमोरी के इस्तेमाल की जांच करना लेख पढ़ें.

  • अलग-अलग विंडो कॉन्फ़िगरेशन में, अपने ऐप्लिकेशन का सामान्य तरीके से इस्तेमाल करें. साथ ही, यह पुष्टि करें कि ऐप्लिकेशन ठीक से काम कर रहा है. पुष्टि करें कि टेक्स्ट पढ़ा जा सकता हो और यूज़र इंटरफ़ेस (यूआई) के एलिमेंट इतने छोटे न हों कि उनसे इंटरैक्ट न किया जा सके.

मल्टी-विंडो की सुविधा बंद है

अगर आपने एपीआई लेवल 24 से 30 पर, मल्टी-विंडो की सुविधा बंद कर दी है, तो आपको Android 7.0 से 11 पर चलने वाले डिवाइस पर अपना ऐप्लिकेशन लॉन्च करना चाहिए. इसके बाद, ऐप्लिकेशन को स्प्लिट-स्क्रीन और डेस्कटॉप विंडो मोड में रखने की कोशिश करें.android:resizeableActivity="false" पुष्टि करें कि ऐसा करने पर, ऐप्लिकेशन फ़ुल-स्क्रीन मोड में ही रहे.

अन्य संसाधन

Android में मल्टी-विंडो की सुविधा के बारे में ज़्यादा जानने के लिए, यहां जाएं: