सिस्टम डेकोरेशन सपोर्ट

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

इन प्रदर्शन-विशिष्ट क्षेत्रों में किए गए अपडेट नीचे दिए गए हैं:

सिस्टम सजावट

एंड्रॉइड 10 कुछ सिस्टम डेकोरेशन, जैसे वॉलपेपर, नेविगेशन बार और लॉन्चर को दिखाने के लिए सेकेंडरी डिस्प्ले को कॉन्फ़िगर करने के लिए सपोर्ट जोड़ता है। डिफ़ॉल्ट रूप से, प्राथमिक डिस्प्ले सभी सिस्टम डेकोरेशन को दिखाता है, और सेकेंडरी डिस्प्ले उन्हें वैकल्पिक रूप से सक्षम दिखाता है। इनपुट मेथड एडिटर (IME) के लिए सपोर्ट को अन्य सिस्टम डेकोरेशन से अलग सेट किया जा सकता है।

किसी विशिष्ट डिस्प्ले पर सिस्टम डेकोरेशन के लिए समर्थन जोड़ने के लिए या /data/system/display_settings.xml में एक डिफ़ॉल्ट मान प्रदान करने के लिए DisplayWindowSettings#setShouldShowSystemDecorsLocked() का उपयोग करें। उदाहरण के लिए, डिस्प्ले विंडो सेटिंग्स देखें।

कार्यान्वयन

WindowManager#setShouldShowSystemDecors() DisplayWindowSettings#setShouldShowSystemDecorsLocked() में भी उजागर किया गया है। सिस्टम डेकोर्स को सक्षम करने के इरादे से इस पद्धति को ट्रिगर करने से पहले से गायब हुई सजावट वाली खिड़कियां नहीं जुड़ती हैं, या यदि वे पहले मौजूद थीं तो उन्हें हटा दें। ज्यादातर मामलों में, सिस्टम डेकोरेशन सपोर्ट में बदलाव डिवाइस के रिबूट होने के बाद ही पूर्ण प्रभाव डालता है।

WindowManager कोड बेस में सिस्टम डेकोरेशन के समर्थन के लिए चेक आमतौर पर DisplayContent DisplayContent#supportsSystemDecorations() के माध्यम से जाते हैं, जबकि बाहरी सेवाओं (जैसे कि सिस्टम UI यह जांचने के लिए कि नेविगेशन बार दिखाया जाना चाहिए) के लिए WindowManager#shouldShowSystemDecors() का उपयोग करें। यह समझने के लिए कि इस सेटिंग द्वारा क्या नियंत्रित किया जाता है, इन विधियों के कॉल पॉइंट का अन्वेषण करें।

सिस्टम UI सजावट विंडो

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

स्टेटस बार एक अधिक जटिल सिस्टम विंडो है, क्योंकि इसमें नोटिफिकेशन शेड, क्विक सेटिंग्स और लॉक स्क्रीन भी शामिल है। एंड्रॉइड 10 में, सेकेंडरी डिस्प्ले पर स्टेटस बार सपोर्ट नहीं करता है। इसलिए, सूचनाएं, सेटिंग्स और एक पूर्ण कीगार्ड केवल प्राथमिक प्रदर्शन पर उपलब्ध हैं।

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

कार्यान्वयन

अतिरिक्त सिस्टम UI सुविधाओं को लागू करने के लिए, डिवाइस निर्माताओं को एकल सिस्टम UI घटक का उपयोग करना चाहिए जो डिस्प्ले को जोड़ने/हटाने के लिए सुनता है और उपयुक्त सामग्री प्रस्तुत करता है।

मल्टी-डिस्प्ले (एमडी) का समर्थन करने वाले सिस्टम यूआई घटक को निम्नलिखित मामलों को संभालना चाहिए:

  • स्टार्टअप पर मल्टीपल डिस्प्ले इनिशियलाइज़ेशन
  • रनटाइम पर जोड़ा गया प्रदर्शन
  • रनटाइम पर डिस्प्ले हटा दिया गया

जब सिस्टम UI WindowManager से पहले किसी डिस्प्ले को जोड़ने का पता लगाता है, तो यह एक रेस कंडीशन बनाता है। जब डिस्प्लेमैनेजर की सदस्यता लेने के बजाय डिस्प्ले जोड़ा जाता है तो विंडोमैनेजर से सिस्टम यूआई में कस्टम कॉलबैक लागू करके इसे टाला जा सकता है। डिस्प्ले .DisplayListener इवेंट्स। संदर्भ कार्यान्वयन के लिए, नेविगेशन बार समर्थन के लिए CommandQueue.Callbacks#onDisplayReady और WallpaperManagerInternal#onDisplayReady

इसके अलावा, Android 10 ये अपडेट प्रदान करता है:

  • NavigationBarController वर्ग नेविगेशन बार के लिए विशिष्ट सभी कार्यक्षमता को नियंत्रित करता है।
  • अनुकूलित नेविगेशन बार देखने के लिए CarStatusBar देखें।
  • TYPE_NAVIGATION_BAR अब किसी एकल आवृत्ति तक सीमित नहीं है और प्रति प्रदर्शन उपयोग किया जा सकता है।
  • IWindowManager#hasNavigationBar() को केवल सिस्टम UI के लिए displayId पैरामीटर शामिल करने के लिए अपडेट किया गया है।

लांचर

एंड्रॉइड 10 में, सिस्टम सजावट का समर्थन करने के लिए कॉन्फ़िगर किए गए प्रत्येक डिस्प्ले में डिफ़ॉल्ट रूप से WindowConfiguration#ACTIVITY_TYPE_HOME प्रकार के साथ लॉन्चर गतिविधियों के लिए एक समर्पित होम स्टैक होता है। प्रत्येक डिस्प्ले लॉन्चर गतिविधि के एक अलग उदाहरण का उपयोग करता है।

चित्र 1. platform/development/samples/MultiDisplay के लिए मल्टी-डिस्प्ले लॉन्चर उदाहरण

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

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

गतिविधि में एक लॉन्च मोड होना चाहिए जो कई उदाहरणों को नहीं रोकता है और विभिन्न स्क्रीन आकारों के अनुकूल होने की उम्मीद है। लॉन्च मोड singleInstance या singleTask टास्क नहीं हो सकता है।

कार्यान्वयन

एंड्रॉइड 10 में, RootActivityContainer#startHomeOnDisplay() होम स्क्रीन लॉन्च होने वाले डिस्प्ले के आधार पर स्वचालित रूप से वांछित घटक और इरादे का चयन करता है। RootActivityContainer#resolveSecondaryHomeActivity() में वर्तमान में चयनित लॉन्चर के आधार पर लॉन्चर गतिविधि घटक को देखने का तर्क है और यदि आवश्यक हो तो सिस्टम डिफ़ॉल्ट का उपयोग कर सकता है (देखें ActivityTaskManagerService#getSecondaryHomeIntent() )।

सुरक्षा प्रतिबंध

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

वॉलपेपर

Android 10 (और उच्चतर) में, द्वितीयक डिस्प्ले पर वॉलपेपर समर्थित हैं:

चित्र 2. आंतरिक (ऊपर) और बाहरी डिस्प्ले (नीचे) पर लाइव वॉलपेपर

डेवलपर वॉलपेपर सुविधा के लिए android:supportsMultipleDisplays="true" प्रदान करके WallpaperInfo एक्सएमएल परिभाषा में समर्थन की घोषणा कर सकते हैं। वॉलपेपर डेवलपर्स से भी WallpaperService.Engine#getDisplayContext() में प्रदर्शन संदर्भ का उपयोग करके संपत्ति लोड करने की उम्मीद की जाती है।

फ्रेमवर्क प्रति डिस्प्ले एक WallpaperService.Engine उदाहरण बनाता है, इसलिए प्रत्येक इंजन की अपनी सतह और प्रदर्शन संदर्भ होता है। डेवलपर को यह सुनिश्चित करने की आवश्यकता है कि प्रत्येक इंजन वीएसवाईएनसी का सम्मान करते हुए, अलग-अलग फ्रेम दर पर स्वतंत्र रूप से आकर्षित कर सकता है।

अलग-अलग स्क्रीन के लिए वॉलपेपर चुनना

एंड्रॉइड 10 अलग-अलग स्क्रीन के लिए वॉलपेपर चुनने के लिए प्रत्यक्ष मंच समर्थन प्रदान नहीं करता है। इसे पूरा करने के लिए, प्रति डिस्प्ले वॉलपेपर सेटिंग्स को बनाए रखने के लिए एक स्थिर प्रदर्शन पहचानकर्ता की आवश्यकता होती है। Display#getDisplayId() गतिशील है, इसलिए इस बात की कोई गारंटी नहीं है कि रीबूट के बाद भौतिक प्रदर्शन में समान आईडी होगी।

हालाँकि, Android 10 ने DisplayInfo.mAddress को जोड़ा, जिसमें भौतिक प्रदर्शन के लिए स्थिर पहचानकर्ता शामिल हैं और भविष्य में पूर्ण कार्यान्वयन के लिए इसका उपयोग किया जा सकता है। दुर्भाग्य से, Android 10 के लिए तर्क को लागू करने में बहुत देर हो चुकी है। सुझाया गया समाधान:

  1. वॉलपेपर सेट करने के लिए WallpaperManager API का उपयोग करें।
  2. WallpaperManager एक Context ऑब्जेक्ट से प्राप्त किया जाता है, और प्रत्येक Context ऑब्जेक्ट में संबंधित डिस्प्ले ( Context#getDisplay()/getDisplayId() ) के बारे में जानकारी होती है। इसलिए, आप नए तरीकों को जोड़े बिना एक WallpaperManager उदाहरण से displayId प्राप्त कर सकते हैं।
  3. ढांचे की तरफ, Context वस्तु से प्राप्त displayId का उपयोग करें और इसे एक स्थिर पहचानकर्ता (जैसे भौतिक प्रदर्शन का बंदरगाह) पर मैप करें। चुने हुए वॉलपेपर को बनाए रखने के लिए स्थिर पहचानकर्ता का उपयोग करें।

यह समाधान वॉलपेपर पिकर के लिए मौजूदा कार्यान्वयन का उपयोग करता है। यदि यह एक विशिष्ट डिस्प्ले पर खोला गया था और सही संदर्भ का उपयोग करता है, तो जब यह वॉलपेपर सेट करने के लिए कॉल करता है, तो सिस्टम स्वचालित रूप से डिस्प्ले की पहचान कर सकता है।

यदि वर्तमान डिस्प्ले के अलावा किसी अन्य डिस्प्ले के लिए वॉलपेपर सेट करने की आवश्यकता है, तो लक्ष्य डिस्प्ले ( Context#createDisplayContext ) के लिए एक नया Context ऑब्जेक्ट बनाएं और उस डिस्प्ले से WallpaperManager इंस्टेंस प्राप्त करें।

सुरक्षा प्रतिबंध

सिस्टम वर्चुअल डिस्प्ले पर वॉलपेपर नहीं दिखाएगा जो उसके पास नहीं है। यह एक सुरक्षा चिंता के कारण है कि एक दुर्भावनापूर्ण ऐप सक्षम सिस्टम डेकोरेशन सपोर्ट के साथ वर्चुअल डिस्प्ले बना सकता है और सतह से उपयोगकर्ता-संवेदनशील जानकारी (जैसे व्यक्तिगत फोटो) पढ़ सकता है।

कार्यान्वयन

Android 10 में, IWallpaperConnection#attachEngine() और IWallpaperService#attach() इंटरफेस प्रति-डिस्प्ले कनेक्शन बनाने के लिए displayId पैरामीटर को स्वीकार करते हैं। WallpaperManagerService.DisplayConnector प्रति-डिस्प्ले वॉलपेपर इंजन और कनेक्शन को इनकैप्सुलेट करता है। WindowManager में, सभी डिस्प्ले के लिए एक ही WallpaperController के बजाय निर्माण के समय प्रत्येक DisplayContent ऑब्जेक्ट के लिए वॉलपेपर कंट्रोलर बनाए जाते हैं।

कुछ सार्वजनिक WallpaperManager विधि कार्यान्वयन (जैसे WallpaperManager#getDesiredMinimumWidth() ) को संबंधित डिस्प्ले के लिए गणना और जानकारी प्रदान करने के लिए अद्यतन किया गया था। WallpaperInfo#supportsMultipleDisplays() और एक संबंधित संसाधन विशेषता जोड़ी गई, ताकि ऐप डेवलपर रिपोर्ट कर सकें कि कौन से वॉलपेपर एकाधिक स्क्रीन के लिए तैयार हैं।

यदि डिफ़ॉल्ट डिस्प्ले पर दिखाई गई वॉलपेपर सेवा एकाधिक डिस्प्ले का समर्थन नहीं करती है, तो सिस्टम द्वितीयक डिस्प्ले पर डिफ़ॉल्ट वॉलपेपर दिखाता है।

चित्र 3. द्वितीयक डिस्प्ले के लिए वॉलपेपर फ़ॉलबैक तर्क