सिस्टम की सजावट से जुड़ी सहायता

डिसप्ले से जुड़े इन खास इलाकों में किए गए अपडेट नीचे दिए गए हैं:

सिस्टम की सजावट

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

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

लागू करना

DisplayWindowSettings#setShouldShowSystemDecorsLocked() में भी सार्वजनिक किया गया है जांच के लिए WindowManager#setShouldShowSystemDecors(). इस तरीके को ट्रिगर करना सिस्टम डेकोरेशन सक्षम करने के इरादे से की जाने वाली डेकोर विंडो नहीं जोड़ी जातीं. या अगर वे पहले मौजूद थे, तो उन्हें हटा दें. ज़्यादातर ऐसे मामलों में, सिस्टम की सजावट के सपोर्ट में बदलाव सिर्फ़ तब लागू होता है, जब डिवाइस फिर से चालू हो रहा है.

WindowManager कोड बेस में, सिस्टम की सजावट से जुड़ी जांच करता है आम तौर पर, DisplayContent#supportsSystemDecorations() तक जाता है बाहरी सेवाओं की जाँच करता है (जैसे कि यह देखने के लिए सिस्टम यूज़र इंटरफ़ेस (यूआई) कि क्या नेविगेशन बार दिखाया जाना चाहिए) WindowManager#shouldShowSystemDecors() का उपयोग करें. यह सेटिंग किन चीज़ों को कंट्रोल करती है, यह समझने के लिए, इसके कॉल पॉइंट को एक्सप्लोर करें इन तरीकों का इस्तेमाल करके देख सकते हैं.

सिस्टम के यूज़र इंटरफ़ेस (यूआई) की सजावट वाली विंडो

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

स्टेटस बार एक जटिल सिस्टम विंडो है, क्योंकि यह इसमें नोटिफ़िकेशन शेड, क्विक सेटिंग, और लॉक स्क्रीन की सुविधा भी शामिल है. Android में 10, सेकंडरी डिसप्ले पर स्टेटस बार की सुविधा काम नहीं करती. इसलिए, नोटिफिकेशन, सेटिंग और एक पूर्ण कीगार्ड केवल प्राइमरी डिसप्ले.

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

लागू करना

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

मल्टी-डिसप्ले (एमडी) के साथ काम करने वाले सिस्टम यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट को ये मामले:

  • स्टार्टअप पर एक से ज़्यादा डिसप्ले शुरू करना
  • रनटाइम के दौरान डिसप्ले जोड़ा गया
  • रनटाइम के दौरान डिसप्ले हटाया गया

जब सिस्टम यूज़र इंटरफ़ेस (यूआई) को WindowManager से पहले किसी डिसप्ले को जोड़े जाने का पता चलता है, तो यह रेस कंडिशन. इस समस्या से बचने के लिए, अपनी वेबसाइट के लिए कस्टम कॉलबैक लागू करें सदस्यता लेने के बजाय डिसप्ले जोड़ने पर, WindowManager को सिस्टम के यूज़र इंटरफ़ेस (यूआई) पर स्विच करने की सुविधा DisplayManager.DisplayListener इवेंट. रेफ़रंस के तौर पर लागू करने के लिए, नेविगेशन बार से जुड़ी सहायता के लिए CommandQueue.Callbacks#onDisplayReady देखें और वॉलपेपर के लिए WallpaperManagerInternal#onDisplayReady.

इसके अलावा, 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 और उसके बाद के वर्शन में वॉलपेपर काम करते हैं दूसरे डिसप्ले पर:

दूसरा डायग्राम. अंदरूनी (ऊपर) और बाहरी हिस्से पर लाइव वॉलपेपर दिखाता है (नीचे)

डेवलपर, वॉलपेपर की मदद से, वॉलपेपर की सुविधा के लिए सहायता का एलान कर सकते हैं android:supportsMultipleDisplays="true" WallpaperInfo एक्सएमएल की परिभाषा. वॉलपेपर डेवलपर भी में डिसप्ले कॉन्टेक्स्ट का इस्तेमाल करके ऐसेट लोड की जा सकती हैं WallpaperService.Engine#getDisplayContext().

यह फ़्रेमवर्क एक WallpaperService.Engine इंस्टेंस बनाता है हर डिसप्ले के लिए एक जैसा अनुभव दिया जाता है. इसलिए, हर इंजन का अपना अलग-अलग सरफ़ेस और डिसप्ले कॉन्टेक्स्ट होता है. कॉन्टेंट बनाने डेवलपर को यह पक्का करना होगा कि हर इंजन, अलग-अलग तरीके से, अलग-अलग फ़्रेम रेट रहा है.

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

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

हालांकि, Android 10 में DisplayInfo.mAddress जोड़ा गया. इसमें फ़िज़िकल डिसप्ले के लिए स्टेबल आइडेंटिफ़ायर मौजूद हैं. साथ ही, इसे पूरे आने वाले समय में लागू किया जा सकता है. माफ़ करें, यह लॉजिक लागू करने के लिए बहुत देर हो चुकी है Android 10 के लिए. सुझाया गया समाधान:

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

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

अगर मौजूदा डिसप्ले के अलावा किसी दूसरे डिसप्ले के लिए वॉलपेपर सेट करने की ज़रूरत हो डिसप्ले चुनें. इसके बाद, टारगेट डिसप्ले के लिए नया Context ऑब्जेक्ट बनाएं (Context#createDisplayContext) और कोड की मदद से, उस डिसप्ले से WallpaperManager इंस्टेंस.

सुरक्षा से जुड़ी पाबंदियां

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

लागू करना

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

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

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

तीसरी इमेज. सेकंडरी डिसप्ले के लिए, वॉलपेपर फ़ॉलबैक का लॉजिक