डिस्प्ले से जुड़ी इन खास जगहों में किए गए अपडेट की जानकारी इस पेज पर दी जाती है.
सिस्टम डेकोरेशन
Android 10 में, सेकंडरी डिसप्ले को कॉन्फ़िगर करने की सुविधा जोड़ी गई है. इससे सिस्टम के कुछ डेकोरेशन दिखाए जा सकते हैं. जैसे, वॉलपेपर, नेविगेशन बार, और लॉन्चर. डिफ़ॉल्ट रूप से, प्राइमरी डिसप्ले पर सिस्टम के सभी डेकोरेशन दिखते हैं. साथ ही, सेकंडरी डिसप्ले पर वे डेकोरेशन दिखते हैं जिन्हें चालू किया गया है. इनपुट मेथड एडिटर (आईएमई) के लिए सहायता को अन्य सिस्टम डेकोरेशन से अलग से सेट किया जा सकता है.
किसी डिसप्ले पर सिस्टम डेकोरेशन की सुविधा जोड़ने के लिए, DisplayWindowSettings#setShouldShowSystemDecorsLocked का इस्तेमाल करें. इसके अलावा, /data/system/display_settings.xml में डिफ़ॉल्ट वैल्यू भी दी जा सकती है. उदाहरणों के लिए, डिसप्ले विंडो की सेटिंग देखें.
Android 17 और इसके बाद के वर्शन में, सिस्टम डेकोरेशन के लिए डिसप्ले का सपोर्ट डाइनैमिक तरीके से बदल सकता है. अगर किसी डिसप्ले में FLAG_ALLOWS_CONTENT_MODE_SWITCH फ़्लैग मौजूद है, तो सिस्टम उपयोगकर्ता को यह तय करने की अनुमति देता है कि डिसप्ले पर ऐप्लिकेशन होस्ट किए जाएं या किसी दूसरे डिसप्ले को मिरर किया जाए. सिस्टम, सिस्टम डेकोरेशन का इस्तेमाल सिर्फ़ तब करता है, जब उपयोगकर्ता डिसप्ले का इस्तेमाल ऐप्लिकेशन होस्ट करने के लिए करता है. सिस्टम कॉम्पोनेंट, जैसे कि सिस्टम यूज़र इंटरफ़ेस (यूआई) और ओईएम लॉन्चर, सिस्टम डेकोरेशन बनाने और दिखाने के लिए ज़िम्मेदार होते हैं. सिस्टम डेकोरेशन को डाइनैमिक तरीके से जोड़ने या हटाने के लिए, और हर डिसप्ले के हिसाब से स्ट्रक्चर को शुरू करने या हटाने के लिए, इन कॉम्पोनेंट को IDisplayWindowListener इंस्टेंस रजिस्टर करना होगा. साथ ही, IDisplayWindowListener.onDisplayAddSystemDecorations और IDisplayWindowListener.onDisplayRemoveSystemDecorations तरीकों को लागू करना होगा.
IDisplayWindowListener एक छिपा हुआ एपीआई है. यह सिर्फ़ सिस्टम कॉम्पोनेंट के लिए उपलब्ध है.
लागू करना
DisplayWindowSettings#setShouldShowSystemDecorsLocked को टेस्टिंग के लिए WindowManager#setShouldShowSystemDecors में भी दिखाया जाता है. सिस्टम डेकोर को चालू करने के लिए इस तरीके को ट्रिगर करने से, पहले से मौजूद डेकोर विंडो नहीं जुड़ती हैं. साथ ही, अगर वे पहले से मौजूद हैं, तो उन्हें हटाया भी नहीं जाता है. ज़्यादातर मामलों में, सिस्टम डेकोरेशन के लिए सहायता में बदलाव, डिवाइस को रीबूट करने के बाद ही पूरी तरह से लागू होता है.
WindowManager के कोड बेस में सिस्टम डेकोरेशन की सुविधा काम करती है या नहीं, इसकी जाँच करने के लिए आम तौर पर DisplayContent#supportsSystemDecorations का इस्तेमाल किया जाता है. वहीं, बाहरी सेवाओं की जाँच करने के लिए WindowManager#shouldShowSystemDecors का इस्तेमाल किया जाता है. जैसे, सिस्टम यूज़र इंटरफ़ेस (यूआई) यह देखने के लिए कि नेविगेशन बार दिखना चाहिए या नहीं.
इस सेटिंग से क्या कंट्रोल किया जाता है, यह समझने के लिए इन तरीकों के कॉल पॉइंट देखें.
सिस्टम यूज़र इंटरफ़ेस (यूआई) डेकोर विंडो
Android 10 में, सिर्फ़ नेविगेशन बार के लिए सिस्टम डेकोर विंडो की सुविधा जोड़ी गई है. ऐसा इसलिए, क्योंकि ऐक्टिविटी और ऐप्लिकेशन के बीच नेविगेट करने के लिए, नेविगेशन बार ज़रूरी है. डिफ़ॉल्ट रूप से, नेविगेशन बार में 'वापस जाएं' और 'होम पेज पर जाएं' बटन दिखते हैं. नेविगेशन बार सिर्फ़ तब शामिल किया जाता है, जब टारगेट डिसप्ले, सिस्टम डेकोरेशन (DisplayWindowSettings देखें) के साथ काम करता हो.
स्टेटस बार, सिस्टम की एक जटिल विंडो है. ऐसा इसलिए, क्योंकि इसमें सूचना शेड, क्विक सेटिंग, और लॉक स्क्रीन भी शामिल होती हैं. Android 10 में, स्टेटस बार को सेकंडरी डिसप्ले पर इस्तेमाल नहीं किया जा सकता. इसलिए, सूचनाएं, सेटिंग, और पूरा कीगार्ड सिर्फ़ प्राइमरी डिसप्ले पर उपलब्ध होता है.
खास जानकारी या हाल ही के सिस्टम विंडो को सेकंडरी स्क्रीन पर इस्तेमाल नहीं किया जा सकता. Android 10 में, AOSP सिर्फ़ डिफ़ॉल्ट डिसप्ले पर 'हाल में इस्तेमाल किए गए ऐप्लिकेशन' दिखाता है. इसमें सभी डिसप्ले की गतिविधियां शामिल होती हैं. 'हाल ही के ऐप्लिकेशन' से लॉन्च करने पर, सेकंडरी डिसप्ले पर चल रही गतिविधि डिफ़ॉल्ट रूप से उस डिसप्ले पर सबसे ऊपर आ जाती है. इस तरीके से जुड़ी कुछ समस्याएं हैं. जैसे, जब ऐप्लिकेशन दूसरी स्क्रीन पर दिखते हैं, तब वे तुरंत अपडेट नहीं होते.
लागू करना
डिवाइस बनाने वाली कंपनियों को, सिस्टम यूज़र इंटरफ़ेस (यूआई) की अतिरिक्त सुविधाओं को लागू करने के लिए, एक ही सिस्टम यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट का इस्तेमाल करना चाहिए. यह कॉम्पोनेंट, डिसप्ले के जुड़ने या हटने की सूचना देता है और सही कॉन्टेंट दिखाता है.
मल्टी-डिसप्ले (एमडी) की सुविधा के साथ काम करने वाले सिस्टम यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट को इन मामलों को मैनेज करना चाहिए:
- डिवाइस चालू होने पर, एक से ज़्यादा डिसप्ले शुरू करना
- डिसप्ले को रन टाइम पर जोड़ा गया
- डिसप्ले को रन टाइम पर हटाया गया
जब सिस्टम यूज़र इंटरफ़ेस (यूआई), WindowManager से पहले डिसप्ले के जुड़ने का पता लगाता है, तो यह रेस कंडिशन बनाता है. DisplayManager.DisplayListener इवेंट की सदस्यता लेने के बजाय, डिसप्ले जोड़े जाने पर WindowManager से सिस्टम यूज़र इंटरफ़ेस (यूआई) तक कस्टम कॉलबैक लागू करके, इस समस्या से बचा जा सकता है. रेफ़रंस के तौर पर लागू करने के लिए, नेविगेशन बार के साथ काम करने वाले CommandQueue.Callbacks#onDisplayAddSystemDecorations और वॉलपेपर के लिए WallpaperManagerInternal#onDisplayAddSystemDecorations देखें.
इसके अलावा, Android 10 में ये अपडेट भी उपलब्ध हैं:
NavigationBarControllerक्लास, नेविगेशन बार से जुड़ी सभी सुविधाओं को कंट्रोल करती है.- अपनी पसंद के मुताबिक बनाया गया नेविगेशन बार देखने के लिए,
CarStatusBarपर जाएं. TYPE_NAVIGATION_BARको अब एक ही इंस्टेंस तक सीमित नहीं रखा गया है. इसका इस्तेमाल हर डिसप्ले के लिए किया जा सकता है.IWindowManager#hasNavigationBarको अपडेट किया गया है, ताकि इसमें सिर्फ़ सिस्टम यूज़र इंटरफ़ेस के लिएdisplayIdपैरामीटर शामिल किया जा सके.
लॉन्चर
Android 10 में, सिस्टम डेकोरेशन के साथ काम करने के लिए कॉन्फ़िगर किए गए हर डिसप्ले में, डिफ़ॉल्ट रूप से लॉन्चर ऐक्टिविटी के लिए एक होम स्टैक होता है. इसका टाइप WindowConfiguration#ACTIVITY_TYPE_HOME होता है. हर डिसप्ले, लॉन्चर ऐक्टिविटी के अलग-अलग इंस्टेंस का इस्तेमाल करता है:


पहली इमेज. मल्टी-डिसप्ले लॉन्चर का उदाहरण, जो platform/development/samples/MultiDisplay के लिए है.
ज़्यादातर मौजूदा लॉन्चर, एक से ज़्यादा इंस्टेंस के साथ काम नहीं करते. साथ ही, इन्हें बड़ी स्क्रीन के लिए ऑप्टिमाइज़ नहीं किया गया है. साथ ही, सेकंडरी/बाहरी डिसप्ले पर अक्सर अलग तरह के अनुभव की उम्मीद की जाती है. सेकंडरी स्क्रीन के लिए खास गतिविधि उपलब्ध कराने के लिए, Android 10 ने इंटेंट फ़िल्टर में SECONDARY_HOME कैटगरी पेश की है. इस गतिविधि के इंस्टेंस का इस्तेमाल उन सभी डिसप्ले पर किया जाता है जो सिस्टम डेकोरेशन के साथ काम करते हैं. हर डिसप्ले पर एक इंस्टेंस का इस्तेमाल किया जाता है.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>गतिविधि का लॉन्च मोड ऐसा होना चाहिए जिससे एक से ज़्यादा इंस्टेंस को रोका न जा सके. साथ ही, यह अलग-अलग स्क्रीन साइज़ के हिसाब से अडजस्ट हो सके. लॉन्च मोड singleInstance या singleTask नहीं हो सकता.
लागू करना
Android 10 में, RootActivityContainer#startHomeOnDisplay होम स्क्रीन लॉन्च करने के लिए इस्तेमाल किए जा रहे डिसप्ले के हिसाब से, मनचाहा कॉम्पोनेंट और इंटेंट अपने-आप चुन लेता है. RootActivityContainer#resolveSecondaryHomeActivity में, मौजूदा समय में चुने गए लॉन्चर के हिसाब से लॉन्चर गतिविधि कॉम्पोनेंट को ढूंढने का लॉजिक होता है. साथ ही, ज़रूरत पड़ने पर सिस्टम डिफ़ॉल्ट का इस्तेमाल किया जा सकता है (ActivityTaskManagerService#getSecondaryHomeIntent देखें).
सुरक्षा से जुड़ी पाबंदियां
सेकंडरी डिसप्ले पर की जाने वाली गतिविधियों पर लागू होने वाली पाबंदियों के अलावा, नुकसान पहुंचाने वाले ऐप्लिकेशन को सिस्टम डेकोरेशन चालू करके वर्चुअल डिसप्ले बनाने और उपयोगकर्ता की संवेदनशील जानकारी को पढ़ने से रोकने के लिए, लॉन्चर सिर्फ़ सिस्टम के मालिकाना हक वाले वर्चुअल डिसप्ले पर दिखता है. लॉन्चर, सिस्टम के वर्चुअल डिसप्ले के अलावा अन्य वर्चुअल डिसप्ले पर कॉन्टेंट नहीं दिखाता है.
वॉलपेपर बदलने के लिए ऐप्लिकेशन
Android 10 और इसके बाद के वर्शन में, सेकंडरी डिस्प्ले पर वॉलपेपर इस्तेमाल किए जा सकते हैं:


दूसरी इमेज. इंटरनल (ऊपर) और एक्सटर्नल डिसप्ले (नीचे) पर लाइव वॉलपेपर.
डेवलपर, वॉलपेपर की सुविधा के लिए सहायता का एलान कर सकते हैं. इसके लिए, उन्हें WallpaperInfo XML डेफ़िनिशन में android:supportsMultipleDisplays="true" देना होगा. वॉलपेपर डेवलपर से भी यह उम्मीद की जाती है कि वे WallpaperService.Engine#getDisplayContext में डिसप्ले कॉन्टेक्स्ट का इस्तेमाल करके ऐसेट लोड करें.
फ़्रेमवर्क, हर डिसप्ले के लिए एक WallpaperService.Engine इंस्टेंस बनाता है. इसलिए, हर इंजन का अपना सर्फ़ेस और डिसप्ले कॉन्टेक्स्ट होता है. डेवलपर को यह पक्का करना होगा कि हर इंजन, अलग-अलग फ़्रेम रेट पर स्वतंत्र रूप से ड्रॉ कर सके. साथ ही, VSync का पालन कर सके.
हर स्क्रीन के लिए अलग-अलग वॉलपेपर चुनना
Android 10 में, अलग-अलग स्क्रीन के लिए वॉलपेपर चुनने की सुविधा सीधे तौर पर उपलब्ध नहीं है. इसके लिए, हर डिसप्ले के हिसाब से वॉलपेपर की सेटिंग को सेव रखने के लिए, डिसप्ले आइडेंटिफ़ायर की ज़रूरत होती है.
Display#getDisplayId डाइनैमिक होता है. इसलिए, इस बात की कोई गारंटी नहीं है कि रीबूट करने के बाद, किसी फ़िज़िकल डिसप्ले का आईडी वही रहेगा.
हालांकि, Android 10 में DisplayInfo.mAddress को जोड़ा गया है. इसमें फ़िज़िकल डिसप्ले के लिए स्टेबल आइडेंटिफ़ायर होते हैं. इसका इस्तेमाल आने वाले समय में पूरी तरह से लागू करने के लिए किया जा सकता है. माफ़ करें, Android 10 के लिए लॉजिक लागू करने में बहुत देर हो चुकी है. सुझाया गया समाधान:
- वॉलपेपर सेट करने के लिए,
WallpaperManagerक्लास का इस्तेमाल करें.WallpaperManagerकोContextऑब्जेक्ट से हासिल किया जाता है. साथ ही, हरContextऑब्जेक्ट में, उससे जुड़े डिसप्ले (Context#getDisplay/getDisplayId) की जानकारी होती है. इसलिए, नए तरीके जोड़े बिना,WallpaperManagerइंस्टेंस सेdisplayIdहासिल किया जा सकता है. - फ़्रेमवर्क की ओर से,
Contextऑब्जेक्ट से मिलेdisplayIdका इस्तेमाल करें. साथ ही, इसे किसी स्टैटिक आइडेंटिफ़ायर (जैसे कि फ़िज़िकल डिसप्ले का पोर्ट) पर मैप करें. चुने गए वॉलपेपर को बनाए रखने के लिए, स्टैटिक आइडेंटिफ़ायर का इस्तेमाल करें.
इस तरीके में, वॉलपेपर चुनने की सुविधा के लिए पहले से मौजूद सुविधाओं का इस्तेमाल किया जाता है. अगर इसे किसी खास डिसप्ले पर खोला गया था और यह सही कॉन्टेक्स्ट का इस्तेमाल करता है, तो वॉलपेपर सेट करने के लिए कॉल करने पर, सिस्टम डिसप्ले की पहचान अपने-आप कर सकता है.
अगर आपको मौजूदा डिसप्ले के अलावा किसी दूसरे डिसप्ले के लिए वॉलपेपर सेट करना है, तो टारगेट डिसप्ले (Context#createDisplayContext) के लिए एक नया Context ऑब्जेक्ट बनाएं. इसके बाद, उस डिसप्ले से WallpaperManager इंस्टेंस पाएं.
सुरक्षा से जुड़ी पाबंदियां
सिस्टम, उन वर्चुअल डिसप्ले पर वॉलपेपर नहीं दिखाएगा जिनका मालिकाना हक उसके पास नहीं है. ऐसा सुरक्षा से जुड़ी समस्या की वजह से होता है. कोई नुकसान पहुंचाने वाला ऐप्लिकेशन, सिस्टम डेकोरेशन की सुविधा चालू करके वर्चुअल डिसप्ले बना सकता है. साथ ही, उपयोगकर्ता की संवेदनशील जानकारी को सर्फ़ेस से पढ़ सकता है. जैसे, कोई निजी फ़ोटो.
लागू करना
Android 10 में, IWallpaperConnection#attachEngine और IWallpaperService#attach इंटरफ़ेस, डिसप्ले के हिसाब से कनेक्शन बनाने के लिए displayId पैरामीटर स्वीकार करते हैं.
WallpaperManagerService.DisplayConnector में, हर डिसप्ले के लिए वॉलपेपर इंजन और कनेक्शन शामिल होता है. WindowManager में, वॉलपेपर कंट्रोलर हर DisplayContent ऑब्जेक्ट के लिए कंस्ट्रक्शन के समय बनाए जाते हैं. ऐसा सभी डिसप्ले के लिए एक WallpaperController बनाने के बजाय किया जाता है.
सार्वजनिक WallpaperManager के कुछ तरीके (जैसे, WallpaperManager#getDesiredMinimumWidth) अपडेट किए गए थे, ताकि उनसे जुड़े डिसप्ले के लिए जानकारी का हिसाब लगाया जा सके और जानकारी दी जा सके.
WallpaperInfo#supportsMultipleDisplays और इससे जुड़ा संसाधन एट्रिब्यूट जोड़ा गया है, ताकि ऐप्लिकेशन डेवलपर यह रिपोर्ट कर सकें कि कौनसे वॉलपेपर कई स्क्रीन के लिए तैयार हैं.
अगर डिफ़ॉल्ट डिसप्ले पर दिखने वाली वॉलपेपर सेवा, एक से ज़्यादा डिसप्ले के साथ काम नहीं करती है, तो सिस्टम सेकंडरी डिसप्ले पर डिफ़ॉल्ट वॉलपेपर दिखाता है:

तीसरी इमेज. सेकंडरी डिसप्ले के लिए, वॉलपेपर फ़ॉलबैक लॉजिक.
लाइव वॉलपेपर की सुविधा चालू करना
Android 10 और इसके बाद के वर्शन (एपीआई 29) में डेवलपर, android:supportsMultipleDisplays एट्रिब्यूट का इस्तेमाल करके यह बता सकते हैं कि उनका वॉलपेपर अलग-अलग डिसप्ले पर दिख सकता है या नहीं. डेस्कटॉप विंडोविंग एनवायरमेंट में, मल्टीटास्किंग की सुविधा का इस्तेमाल ज़्यादा किया जाता है. ऐसे में, बाहरी डिसप्ले पर लाइव वॉलपेपर रेंडर करने से, जीपीयू और मेमोरी के इस्तेमाल पर काफ़ी असर पड़ सकता है.
सिस्टम के संसाधनों को बचाने के लिए, सिस्टम कनेक्ट किए गए डिसप्ले पर डिफ़ॉल्ट रूप से लाइव वॉलपेपर रेंडर नहीं करता. जब सिस्टम कॉन्फ़िगरेशन या ऐप्लिकेशन के मेनिफ़ेस्ट से लाइव वॉलपेपर पर पाबंदी लगाई जाती है, तो सिस्टम फ़ॉलबैक के तौर पर स्टैटिक वॉलपेपर रेंडर करता है.
ओईएम, इस सुविधा को बेहतर बना सकते हैं. इसके लिए, वे हाई-एंड हार्डवेयर के लिए लाइव वॉलपेपर की सुविधा चालू कर सकते हैं या ब्रैंड के हिसाब से स्टैटिक फ़ॉलबैक को पसंद के मुताबिक बना सकते हैं.
अगर आपका हार्डवेयर, एक से ज़्यादा लाइव वॉलपेपर इंस्टेंस रेंडर कर सकता है, तो इस कॉन्फ़िगरेशन को बदलें:
| संसाधन का पाथ | frameworks/base/core/res/res/values/config.xml |
|---|---|
| कॉन्फ़िगरेशन का नाम | config_isLiveWallpaperSupportedInDesktopExperience |
फ़ॉलबैक वॉलपेपर को पसंद के मुताबिक बनाना
अगर लाइव वॉलपेपर की सुविधा बंद है या यह सुविधा देने वाली कंपनी इसे सपोर्ट नहीं करती है, तो सिस्टम डिफ़ॉल्ट कॉम्पोनेंट का इस्तेमाल करता है. इसे अपने स्टैटिक वॉलपेपर प्रोवाइडर पर पॉइंट किया जा सकता है:
| संसाधन का पाथ | frameworks/base/core/res/res/values/config.xml |
|---|---|
| कॉन्फ़िगरेशन का नाम | fallback_wallpaper_component |
वॉलपेपर सेट करने की सुविधा लागू करना
इन बदलावों को लागू करने के लिए, डिवाइस के हिसाब से फ़ोल्डर में बिल्ड-टाइम रिसोर्स ओवरले का इस्तेमाल करें. यह फ़ोल्डर आम तौर पर device/<vendor>/<product>/overlay/frameworks/base/core/res/res/values/ होता है.