एंड्रॉइड एन में मल्टी-विंडो: इसका सर्वोत्तम लाभ उठाने के लिए डेवलपर्स को क्या जानना आवश्यक है

हम इस बात का अवलोकन प्रदान करते हैं कि एंड्रॉइड एन में आगामी मल्टी-विंडो समर्थन का डेवलपर्स के लिए क्या मतलब है, और इसका सर्वोत्तम लाभ कैसे उठाया जाए!

मल्टी-विंडो समर्थन एक अच्छी सुविधा है जिसका हम Android N में इंतजार कर रहे हैं जिसे हम लंबे समय से सभी उपकरणों पर उपलब्ध कराना चाहते थे. हालाँकि, इसे एक आनंददायक अनुभव बनाने के लिए, डेवलपर्स को इसे सही ढंग से समर्थन देने के लिए अपने ऐप्स में कुछ बदलाव करने पड़ सकते हैं।

Google I/O सत्रों में से एक डेवलपर्स के लिए मल्टी-विंडो समर्थन द्वारा लाए गए नए एपीआई और सिस्टम व्यवहार परिवर्तन के बारे में सीखना था।

सत्र को एंड्रॉइड एक्टिविटी मैनेजर के तकनीकी लीड मैनेजर वाले ओगुनवाले द्वारा प्रस्तुत किया गया था विंडोमैनेजर फ्रेमवर्क घटक - वह और उनकी टीम एंड्रॉइड पर मल्टी-विंडो के लिए जिम्मेदार हैं।

आप देख सकते हैं यूट्यूब पर मल्टी-विंडो मोड सत्र, लेकिन हम यहां सत्र का एक सिंहावलोकन भी प्रदान करते हैं।

एन तीन अलग-अलग मल्टी-विंडो मोड पेश करता है:
  • स्प्लिट-स्क्रीन मोड: यह वह मोड है जो डिफ़ॉल्ट रूप से उपलब्ध है। जैसा कि नाम से पता चलता है, यह आपको दो एप्लिकेशन को एक साथ खोलने की अनुमति देता है।
  • फ़्रीफ़ॉर्म मोड: निर्माता इसे बड़े उपकरणों पर सक्षम कर सकते हैं, जो उपयोगकर्ताओं को स्प्लिट-स्क्रीन मोड के अलावा गतिविधियों का स्वतंत्र रूप से आकार बदलने की अनुमति देता है।
  • पिक्चर-इन-पिक्चर मोड: एंड्रॉइड टीवी उपकरणों के उद्देश्य से, यह मोड वीडियो प्लेयर्स को पिन की गई विंडो में चलाने के लिए है, जबकि उपयोगकर्ता अन्य एप्लिकेशन के साथ इंटरैक्ट करता है।
एंड्रॉइड एन स्प्लिट-स्क्रीन मोडएंड्रॉइड एन पीआईपी मोड
यह ध्यान देने योग्य बात है. हमने पहले एन पर मल्टी-विंडो को कवर किया है और वर्तमान प्रणाली की कुछ आलोचना की है. इसे ध्यान में रखते हुए, हम आशा करते हैं कि फ्रीफॉर्म मोड पिक्चर-इन-पिक्चर मोड के थोड़ा करीब आ जाएगा, क्योंकि इसमें सभी डिवाइसों पर उपयोगी एप्लिकेशन होंगे।
आपके ऐप्स में मल्टी-विंडो समर्थन सक्षम करना सरल है: यदि आप पहले से ही एन को लक्षित कर रहे हैं तो आपको कुछ भी करने की आवश्यकता नहीं है। यदि आप मल्टी-विंडो को अक्षम करना चुनते हैं, तो आप इसे सेट करके ऐसा कर सकते हैं। android: resizeableActivity आपके मेनिफेस्ट में गतिविधि विशेषता। false. यह केवल तभी किया जाना चाहिए जब यह वास्तव में उचित हो, क्योंकि यह आपके ऐप को हमेशा ख़राब तरीके से खड़ा करता है फ़ुलस्क्रीन मोड में लॉन्च करना, भले ही उपयोगकर्ता (या कोई अन्य ऐप) इसे मल्टी-विंडो में लॉन्च करने का प्रयास करता हो तरीका। यह ध्यान रखना महत्वपूर्ण है कि रूट गतिविधि की विशेषताएँ उसके कार्य स्टैक के भीतर सभी गतिविधियों पर लागू होती हैं। दूसरे शब्दों में, यदि आपके पास कोई गतिविधि है जिसे अन्य ऐप्स द्वारा शुरू किया जा सकता है, तो सुनिश्चित करें कि यह मल्टी-विंडो मोड का समर्थन करता है क्योंकि आप इसकी गारंटी नहीं दे सकते कि अन्य ऐप्स किसी नए कार्य का उपयोग करके आपकी गतिविधि लॉन्च करेंगे। Intent#FLAG_ACTIVITY_NEW_TASK .पिक्चर-इन-पिक्चर मोड समर्थन को स्पष्ट रूप से घोषित किया जाना चाहिए। android: supportsPictureInPicture गुण। ध्यान दें कि इस विशेषता को अनदेखा कर दिया गया है। android: resizeableActivity है। false .लेआउट विशेषताओं का उपयोग फ़्रीफ़ॉर्म विंडो के लिए डिफ़ॉल्ट आयाम और प्लेसमेंट सेट करने के लिए, या फ़्रीफ़ॉर्म और स्प्लिट-स्क्रीन मोड दोनों के लिए न्यूनतम चौड़ाई या ऊंचाई निर्दिष्ट करने के लिए किया जा सकता है:
  • android: defaultWidth/android: defaultHeight: गतिविधि के डिफ़ॉल्ट आयाम (फ्रीफ़ॉर्म मोड)।
  • android: gravity: गतिविधि की प्रारंभिक स्थिति (फ्रीफॉर्म मोड)।
  • android: minimalWidth/android: minimalHeight: गतिविधि के न्यूनतम आयाम (फ्रीफ़ॉर्म और स्प्लिट-स्क्रीन मोड)
आप इसमें एक कोड उदाहरण पा सकते हैं। Google का मल्टी-विंडो प्लेग्राउंड नमूना ऐप गिटहब पर: AndroidManifest.xml.
मल्टी-विंडो समर्थन की शुरूआत के साथ, आपको यह सुनिश्चित करने के लिए अपने ऐप्स में कुछ चीजों की दोबारा जांच करने की आवश्यकता हो सकती है कि वे सही ढंग से काम कर रहे हैं।

गतिविधि जीवनचक्र को समझना

द. गतिविधि जीवनचक्र मल्टी-विंडो मोड में अपरिवर्तित है: एंड्रॉइड गतिविधि मूल जीवनचक्र ऐसा कहा जा रहा है कि, गतिविधि स्थितियों के बीच कुछ सूक्ष्म अंतरों के परिणामस्वरूप अनपेक्षित व्यवहार हो सकता है जिसे आप आमतौर पर एन से पहले नोटिस नहीं करेंगे। यह जानना जरूरी है. Activity#onResume() और। Activity#onPause() तब कॉल किया जाता है जब आपका ऐप फ़ोकस प्राप्त करता है या खो देता है, लेकिन ज़रूरी नहीं कि जब यह दिखाई देना शुरू हो या बंद हो जाए। (याद रखें कि किसी भी समय केवल एक ऐप पर फोकस हो सकता है।) उन ऐप्स के लिए जो सामग्री को लगातार अपडेट करते हैं (उदाहरण के लिए वीडियो प्लेबैक), सामग्री अपडेट शुरू करने और रोकने का प्रबंधन करना सुनिश्चित करें। Activity#onStart() और। Activity#onStop() बजाय। उदाहरण के लिए, वीडियो ऐप्स के लिए ऐसा नहीं किया जा रहा है इसका मतलब यह होगा कि प्लेबैक केवल तभी होगा जब ऐप फोकस्ड होगा, जो मल्टी-विंडो मोड के उद्देश्य को विफल करता है। जब Android N डेवलपर प्रीव्यू पहली बार लॉन्च हुआ तो आधिकारिक YouTube ऐप में भी ऐसी ही समस्या थी.

रनटाइम परिवर्तन को संभालना

जब किसी ऐप को मल्टी-विंडो मोड में डाला जाता है, तो कुछ डिवाइस कॉन्फ़िगरेशन बदल जाएंगे। आप या तो अपनी गतिविधि को पुनः आरंभ करने की अनुमति दे सकते हैं (जिस स्थिति में)। टुकड़े बनाए रखना यह एक अच्छा विचार हो सकता है, यदि आपकी गतिविधि को स्टार्टअप पर एक गहन ऑपरेशन करना होगा), या चुनें। कॉन्फ़िगरेशन परिवर्तनों को स्पष्ट रूप से संभालें बजाय। मल्टी-विंडो मोड में प्रवेश करते समय या उसके अंदर चार डिवाइस कॉन्फ़िगरेशन बदल सकते हैं: screenSize, smallestScreenSize, screenLayout और। orientation. को देखें। एंड्रॉइड डेवलपर्स दस्तावेज़ीकरण प्रत्येक विशेषता के बारे में अधिक जानकारी के लिए, लेकिन ध्यान दें। orientation इस मामले में अब डिवाइस के ओरिएंटेशन को संदर्भित नहीं किया जाता है। इसके बजाय, यह केवल यह दर्शाता है कि आपकी गतिविधि की चौड़ाई उसकी ऊंचाई (परिदृश्य) से बड़ी है या नहीं नहीं (चित्र)। यह घोषणा करते हुए कि आपकी गतिविधि इन परिवर्तनों को संभाल लेगी, मेनिफ़ेस्ट से की जा सकती है:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
ध्यान रखें इसका मतलब है कि आपको वास्तव में इन परिवर्तनों को संभालने की आवश्यकता होगी। Activity#onConfigurationChanged(), दृश्यों को मैन्युअल रूप से अपडेट करके या कुछ संसाधनों को पुनः लोड करके।

मल्टी-विंडो मोड में अक्षम सुविधाएँ

मल्टी-विंडो मोड में कुछ सिस्टम सुविधाएँ आपकी गतिविधियों से प्रभावित नहीं होंगी:
  • स्टेटस बार और नेविगेशन बार में बदलाव, जैसे सिस्टम बार को डिम करना/छिपाना या इमर्सिव मोड का उपयोग करना, कोई प्रभाव नहीं डालेगा। यह समझ में आता है क्योंकि आपकी गतिविधि स्क्रीन का केवल एक हिस्सा ही घेरती है।
  • android: screenOrientation मल्टी-विंडो मोड में गतिविधि विशेषता का भी कोई प्रभाव नहीं पड़ता है: चूंकि आपकी गतिविधि आकार बदलने योग्य होगी, इसलिए इसका एक निश्चित अभिविन्यास होना अब समझ में नहीं आता है।
मल्टी-विंडो ईवेंट के लिए नए कॉलबैक जोड़े गए हैं, साथ ही वर्तमान स्थिति को क्वेरी करने के तरीके भी जोड़े गए हैं।
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): तब कॉल किया जाता है जब गतिविधि स्थिति फ़ुलस्क्रीन से मल्टी-विंडो में बदलती है और इसके विपरीत।
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): जब गतिविधि स्थिति पीआईपी मोड में/से बदलती है तो कॉल किया जाता है।
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): लौटाएं कि गतिविधि मल्टी-विंडो/पिक्चर-इन-पिक्चर मोड में है या नहीं।
  • Activity#overlayWithDecorCaption(boolean overlay): फ़्रीफ़ॉर्म विंडोज़ के लिए, इस पद्धति का उपयोग सामग्री को नीचे धकेलने के बजाय कैप्शन (विंडो को चारों ओर खींचने के लिए उपयोग की जाने वाली पट्टी) बनाने के लिए किया जा सकता है।
पुनश्च. के अलावा। Activity#overlayWithDecorCaption(), ये विधियाँ भी द्वारा प्रदान की जाती हैं। Fragment कक्षा।

मल्टी-विंडो मोड में गतिविधियाँ प्रारंभ करना

  • Activity#enterPictureInPictureMode() किसी गतिविधि को पिक्चर-इन-पिक्चर मोड में रखने के लिए उपयोग किया जा सकता है। ध्यान दें कि PiP मोड में गतिविधियों को इनपुट घटनाओं के बारे में सूचित नहीं किया जाता है - उपयोग करें MediaSession#setMediaButtonReceiver() यदि आप ऐसी घटनाओं को संभालना चाहते हैं। यदि आप रुचि रखते हैं तो एंड्रॉइड डेवलपर्स वेबसाइट की जांच करना भी सुनिश्चित करें एंड्रॉइड एन पर पिक्चर-इन-पिक्चर.
  • यदि डिवाइस स्प्लिट-स्क्रीन मोड में है, तो आप इसका उपयोग करके सिस्टम को आपके बगल में एक और गतिविधि लॉन्च करने के लिए कह सकते हैं Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT झंडा। यदि स्प्लिट-स्क्रीन मोड में नहीं है तो ध्वज का कोई प्रभाव नहीं पड़ता है।
  • यदि डिवाइस फ़्रीफ़ॉर्म मोड में है, ActivityOptions#setLaunchBounds() स्क्रीन पर नई गतिविधि के आयाम और स्थान को निर्दिष्ट करने के लिए उपयोग किया जा सकता है।
कोड उदाहरणों के लिए, मल्टी-विंडो प्लेग्राउंड नमूना ऐप देखें: आसन्न गतिविधि उदाहरण, लॉन्च सीमा उदाहरण.

खींचें और छोड़ें

जबकि ड्रैग और ड्रॉप समर्थन हनीकॉम्ब के बाद से मौजूद है, यह पहले केवल उसी गतिविधि के भीतर ही संभव था। यह बर्फ है। मल्टी-विंडो में समर्थित भी। इस पर अमल होता दिख रहा है. अधिकतर पहले जैसा ही, क्रॉस-एक्टिविटी ड्रैग और ड्रॉप के लिए कुछ अतिरिक्त के साथ:
  • View#startDragAndDrop()
    • के लिए नया उपनाम View#startDrag().
    • क्रॉस-एक्टिविटी ड्रैग और ड्रॉप को सक्षम करने के लिए, नया फ़्लैग पास करें View#DRAG_FLAG_GLOBAL.
    • यदि आपको प्राप्तकर्ता गतिविधि को यूआरआई अनुमतियां देने की आवश्यकता है, तो नए झंडे पास करें View#DRAG_FLAG_GLOBAL_URI_READ या View#DRAG_FLAG_GLOBAL_URI_WRITE, के रूप में उपयुक्त।
  • View#updateDragShadow()
    • वर्तमान में चल रहे ड्रैग ऑपरेशन के लिए ड्रैग शैडो को प्रतिस्थापित करता है। केवल उस ऐप द्वारा कॉल किया जा सकता है जिसने ड्रैग ऑपरेशन की शुरुआत की थी।
  • View#cancelDragAndDrop()
    • वर्तमान में चल रहे ड्रैग ऑपरेशन को रद्द करता है। केवल उस ऐप द्वारा कॉल किया जा सकता है जिसने ड्रैग ऑपरेशन की शुरुआत की थी।
  • यह जांचना कि क्या कोई डिवाइस फ्रीफॉर्म या पिक्चर-इन-पिक्चर मोड का समर्थन करता है, संभव है PackageManager#hasSystemFeature(), का उपयोग करना PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT और PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE क्रमश।
  • android: windowBackground यदि गतिविधि का आकार बदला जा रहा है और उसका प्रतिपादन पिछड़ रहा है, तो विशेषता का उपयोग पृष्ठभूमि खींचने योग्य के रूप में किया जा सकता है। अगर android: windowBackground परेशान है, android: windowBackgroundFallback इसके स्थान पर प्रयोग किया जाता है। उदाहरण के लिए मल्टी-विंडो प्लेग्राउंड नमूना ऐप देखें.
Wale ने यह सुनिश्चित करने के लिए कुछ सर्वोत्तम प्रक्रियाएं पेश कीं कि आपके उपयोगकर्ताओं को सर्वोत्तम संभव अनुभव मिले:
  • हैंडल मोड सुरुचिपूर्ण ढंग से बदलता है:
    • ओरिएंटेशन की परवाह किए बिना यूआई स्थिरता बनाए रखें. सुचारू बदलाव के लिए तत्वों को स्थिति बदलने की आवश्यकता नहीं है।
    • उपरोक्त पर विस्तार करते हुए, फ़ोन/टैबलेट लेआउट के लिए बहुत भिन्न लेआउट के बीच स्विच न करें. इसके बजाय, स्थिरता के लिए टैबलेट लेआउट को छोटे आकार में अनुकूलित करें।
  • सुनिश्चित करें कि आपकी गतिविधियाँ छोटे आकार के अनुकूल हों द्वारा सामग्री डिज़ाइन पैटर्न का अनुसरण करना.
  • उपयोग FLAG_ACTIVITY_LAUNCH_ADJACENT जब स्प्लिट-स्क्रीन मोड में अधिक मनोरंजक अनुभव बनाना समझ में आता है।
  • उचित होने पर ही आकार बदलने की असंगति की घोषणा करें. जैसा कि हमने ऊपर चर्चा की, यह आपके ऐप को ख़राब तरीके से खड़ा कर देता है।
वेले ने कुछ अतिरिक्त उपयोगी संसाधन पेश करके सत्र समाप्त किया:
  • मल्टी-विंडो दस्तावेज़ीकरण.
  • स्प्लिट-स्क्रीन मोड के लिए सामग्री डिज़ाइन दिशानिर्देश.
  • नमूना मल्टी-विंडो ऐप.