डेस्कटॉप विंडोिंग का समर्थन

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

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

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

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

जब कोई ऐप्लिकेशन डेस्कटॉप विंडोविंग में खुला होता है, तो अन्य ऐप्लिकेशन भी डेस्कटॉप विंडो में खुलते हैं.

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

उपयोगकर्ता, डेस्कटॉप विंडो को मेन्यू से भी चालू कर सकते हैं. यह मेन्यू, विंडो हैंडल के नीचे दिखता है. इसे चालू करने के लिए, हैंडल पर टैप या क्लिक करें. इसके अलावा, कीबोर्ड शॉर्टकट मेटा बटन (Windows, Command या Search) + Ctrl + Down का इस्तेमाल करें.

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

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

रीसाइज़ करने की सुविधा और कंपैटबिलिटी मोड

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

तीसरी इमेज. पोर्ट्रेट मोड में काम करने वाले ऐप्लिकेशन की विंडो का साइज़ बदलकर लैंडस्केप मोड में करना.

जिन ऐप्लिकेशन को नॉनरीसाइज़ेबल (यानी कि resizeableActivity = false) के तौर पर सेट किया गया है उनके यूज़र इंटरफ़ेस (यूआई) को स्केल किया जाता है. हालांकि, ऐसा करते समय उनके आसपेक्ट रेशियो में कोई बदलाव नहीं किया जाता.

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

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

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

कैमरा ऐप्लिकेशन के लिए कंपैटिबिलिटी मोड के बारे में ज़्यादा जानने के लिए, डिवाइस कंपैटिबिलिटी मोड देखें.

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

पसंद के मुताबिक बनाए जा सकने वाले हेडर इंसर्ट

डेस्कटॉप विंडो में चल रहे सभी ऐप्लिकेशन में हेडर बार होता है. यह इमर्सिव मोड में भी दिखता है. पुष्टि करें कि आपके ऐप्लिकेशन का कॉन्टेंट, हेडर बार से न ढका हो. हेडर बार, कैप्शन बार इंसर्ट टाइप है: WindowInsets.Companion.captionBar(); व्यू में, WindowInsets.Type.captionBar(), जो सिस्टम बार का हिस्सा है.

अपने ऐप्लिकेशन में कॉन्टेंट को एज-टू-एज डिसप्ले करना और Compose में विंडो इनसेट मैनेज करना लेख में जाकर, इनसेट मैनेज करने के बारे में ज़्यादा जानें.

हेडर बार को भी पसंद के मुताबिक बनाया जा सकता है. Android 15 में, ऐप्लिकेशन को हेडर बार के अंदर कस्टम कॉन्टेंट दिखाने की अनुमति देने के लिए, हेडर बार को पारदर्शी बनाने के लिए, अपीयरेंस टाइप APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND पेश किया गया है.

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

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

Android 15 में, WindowInsets#getBoundingRects() तरीका भी पेश किया गया है. इससे ऐप्लिकेशन, कैप्शन बार के इनसेट की ज़्यादा जानकारी पा सकते हैं. ऐप्लिकेशन, उन जगहों के बीच अंतर कर सकते हैं जहां सिस्टम, सिस्टम एलिमेंट बनाता है. साथ ही, उन जगहों के बीच अंतर कर सकते हैं जहां ऐप्लिकेशन, सिस्टम एलिमेंट को ओवरलैप किए बिना कस्टम कॉन्टेंट रख सकते हैं.

एपीआई से मिले Rect ऑब्जेक्ट की सूची में, सिस्टम के उन क्षेत्रों की जानकारी होती है जहां आपको डेटा स्टोर नहीं करना चाहिए. बची हुई जगह (कैप्शन बार के इंसर्ट में से आयत घटाकर इसकी गणना की जाती है) में ऐप्लिकेशन, सिस्टम एलिमेंट को ओवरलैप किए बिना और इनपुट पाने की सुविधा के साथ ड्रॉ कर सकता है.

कस्टम हेडर लागू करने से पहले और बाद में Chrome.
छठी इमेज. कस्टम हेडर लागू करने से पहले और बाद में Chrome.

कस्टम हेडर के लिए, सिस्टम के जेस्चर को बाहर रखने वाले रेक्ट सेट करने के लिए, अपने व्यू या कंपोज़ेबल में यह कोड लागू करें:

// In a custom View's onLayout or a similar lifecycle method
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    super.onLayout(changed, left, top, right, bottom)
    if (changed) {
        // Calculate the height of your custom header
        val customHeaderHeight = 100 // Replace with your actual header height in pixels

        // Create a Rect covering your custom header area
        val exclusionRect = Rect(0, 0, width, customHeaderHeight)

        // Set the exclusion rects for the system
        systemGestureExclusionRects = listOf(exclusionRect)
    }
}

मल्टीटास्किंग और एक से ज़्यादा इंस्टेंस इस्तेमाल करने की सुविधा

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

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

<activity> टैग में जाकर, अपने ऐप्लिकेशन के AndroidManifest.xml में PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI का एलान किया जा सकता है:

<activity
    android:name=".MyActivity"
    android:exported="true"
    android:resizeableActivity="true">
    <meta-data
        android:name="android.window.PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI"
        android:value="true" />
</activity>

ड्रैग करने के जेस्चर की मदद से, ऐप्लिकेशन के इंस्टेंस मैनेज करना

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

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

Android 15 में, ड्रैग करने के तरीके को पसंद के मुताबिक बनाने के लिए दो फ़्लैग जोड़े गए हैं:

  • DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: इससे पता चलता है कि अगर कोई दिखने वाली विंडो, ड्रॉप किए गए आइटम को हैंडल नहीं करती है, तो सिस्टम को बिना हैंडल किए गए ड्रैग को शुरू करने के लिए सौंपा जाना चाहिए. इस फ़्लैग का इस्तेमाल करते समय, कॉलर को ClipData के साथ ClipData.Item देना होगा. इसमें लॉन्च की जाने वाली गतिविधि के लिए, न बदलने वाला IntentSender शामिल होता है (ClipData.Item.Builder#setIntentSender() देखें). सिस्टम, मौजूदा स्क्रीन साइज़ या विंडो मोड जैसे फ़ैक्टर के आधार पर, इंटेंट लॉन्च कर सकता है या नहीं भी कर सकता. अगर सिस्टम इंटेंट लॉन्च नहीं करता है, तो सामान्य ड्रैग फ़्लो के ज़रिए इंटेंट रद्द कर दिया जाता है.

  • DRAG_FLAG_GLOBAL_SAME_APPLICATION: इससे पता चलता है कि ड्रैग करने की कार्रवाई, विंडो की सीमाओं को पार कर सकती है. ऐसा एक ही ऐप्लिकेशन के कई इंस्टेंस के लिए किया जा सकता है.

    इस फ़्लैग को सेट करके [startDragAndDrop()][20] को कॉल करने पर, सिर्फ़ एक ही ऐप्लिकेशन से जुड़ी दिखने वाली विंडो, ड्रैग करने की कार्रवाई में हिस्सा ले सकती हैं और ड्रैग किया गया कॉन्टेंट पा सकती हैं.

यहां दिए गए उदाहरण में, startDragAndDrop() के साथ इन फ़्लैग का इस्तेमाल करने का तरीका बताया गया है:

// Assuming 'view' is the View that initiates the drag
view.setOnLongClickListener {
    // Create an IntentSender for the activity you want to launch
    val launchIntent = Intent(view.context, NewInstanceActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(
        view.context,
        0,
        launchIntent,
        PendingIntent.FLAG_IMMUTABLE // Ensure the PendingIntent is immutable
    )

    // Build the ClipData.Item with the IntentSender
    val item = ClipData.Item.Builder()
        .setIntentSender(pendingIntent.intentSender)
        .build()

    // Create ClipData with a simple description and the item
    val dragData = ClipData(
        ClipDescription("New Instance Drag", arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN)),
        item
    )

    // Combine the drag flags
    val dragFlags = View.DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG or
                    View.DRAG_FLAG_GLOBAL_SAME_APPLICATION

    // Start the drag operation
    view.startDragAndDrop(
        dragData,                     // The ClipData to drag
        View.DragShadowBuilder(view), // A visual representation of the dragged item
        null,                         // Local state object (not used here)
        dragFlags                     // The drag flags
    )
    true // Indicate that the long click was consumed
}
आठवीं इमेज. Chrome ऐप्लिकेशन के दो इंस्टेंस के बीच किसी टैब को ले जाना.

अन्य ऑप्टिमाइज़ेशन

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

डिफ़ॉल्ट साइज़ और पोज़िशन की जानकारी देना

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

यहां किसी गतिविधि के लिए लॉन्च बाउंड्री सेट करने का उदाहरण दिया गया है:

val options = ActivityOptions.makeBasic()

// Define the desired launch bounds (left, top, right, bottom in pixels)
val launchBounds = Rect(100, 100, 700, 600) // Example: 600x500 window at (100,100)

// Apply the launch bounds to the ActivityOptions
options.setLaunchBounds(launchBounds)

// Start the activity with the specified options
val intent = Intent(this, MyActivity::class.java)
startActivity(intent, options.toBundle())

डेस्कटॉप स्पेस से फ़ुल-स्क्रीन मोड में जाना

ऐप्लिकेशन, Activity#requestFullScreenMode() को कॉल करके फ़ुल-स्क्रीन मोड में जा सकते हैं. इस तरीके से, ऐप्लिकेशन को सीधे डेस्कटॉप विंडोविंग से फ़ुल स्क्रीन में दिखाया जाता है.

किसी गतिविधि से फ़ुल-स्क्रीन मोड का अनुरोध करने के लिए, इस कोड का इस्तेमाल करें:

// In an Activity
fun enterFullScreen() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Android 15 (U)
        requestFullScreenMode()
    }
}