फ़ोल्ड किए जा सकने वाले और मल्टी-स्क्रीन डिवाइसों के लिए ऐप्लिकेशन
आम तौर पर, ऐप्लिकेशन को कुछ डिसप्ले आईडी वाले स्टैटिक आइडेंटिफ़ायर या लॉजिक पर निर्भर नहीं करना चाहिए. ज़्यादातर मामलों में, ऐप्लिकेशन का साइज़ बदलना चाहिए और अलग-अलग डिसप्ले पर काम करना चाहिए. साथ ही, सिस्टम को यह कंट्रोल करना चाहिए कि ऐप्लिकेशन कहां मौजूद हों. उदाहरण के लिए, फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए नया और यूनीक अनुभव बनाने के लिए. साथ ही, डिवाइस को फ़ोल्ड करने पर, बाहरी स्क्रीन पर कोई खास ऐप्लिकेशन लॉन्च करने के लिए.
इस मामले में, SystemUI (या सिस्टम के किसी दूसरे कॉम्पोनेंट) को फ़ोल्ड का पता लगाना चाहिए और यह तय करना चाहिए कि कोई कार्रवाई करना सही है या नहीं. इसके बाद, टारगेट गतिविधि लॉन्च करें और लॉन्च टारगेट के तौर पर एक बाहरी डिसप्ले आईडी तय करें. ऐप्लिकेशन को इस कार्रवाई का पता नहीं लगाना चाहिए या रिस्पॉन्स के तौर पर कोई कार्रवाई नहीं करनी चाहिए. इसके बाद, ऐप्लिकेशन को किसी खास डिसप्ले पर लॉन्च करना चाहिए. दूसरे शब्दों में, यह मत मानें कि एक डिवाइस पर जो काम करता है वह दूसरे डिवाइसों पर भी काम करेगा. कम शब्दों में कहें, तो डिवाइस के हिसाब से बने कोड से फ़्रैगमेंटेशन बढ़ता है.
डिसप्ले का ऐक्सेस प्रतिबंधित करें
अगर डिवाइस कॉन्फ़िगरेशन में एक या एक से ज़्यादा डिसप्ले के ऐक्सेस पर पाबंदी लगानी है, तो हमारा सुझाव है कि आप Display#FLAG_PRIVATE
फ़्लैग का इस्तेमाल करके, ऐसे डिसप्ले को निजी के तौर पर सेट करें. ऐसा करने से मालिक को छोड़कर बाकी सभी
कॉन्टेंट को डिसप्ले में नहीं जोड़ा जा सकेगा. अगर कोई व्यक्ति, गतिविधि शुरू करने या विंडो जोड़ने की कोशिश करता है, तो उसे SecurityException
दिखता है.
अगर सिस्टम के पास डिसप्ले का मालिकाना हक है, तो सिस्टम विंडो जोड़ सकता है और गतिविधियां लॉन्च कर सकता है.
इसके अलावा, डिसप्ले पर रखी गई इकाइयां कभी भी उस डिसप्ले को ऐक्सेस कर सकती हैं. अगर मालिक किसी डिसप्ले पर कोई गतिविधि लॉन्च करता है, तो वह गतिविधि इस डिसप्ले पर अन्य गतिविधियां लॉन्च कर सकती है. इसलिए, ऐक्सेस पर पाबंदी लगाने और सिर्फ़ भरोसेमंद ऐप्लिकेशन को अनुमति देने की ज़िम्मेदारी, चैनल के मालिक की होती है.
इसके अलावा, वर्चुअल डिसप्ले पर ज़्यादा पाबंदियां लगाई जाती हैं, क्योंकि कोई भी ऐप्लिकेशन
उपयोगकर्ता को दिखाए बिना ही वर्चुअल डिसप्ले बना सकता है. अगर सिस्टम का मालिकाना हक वर्चुअल डिसप्ले पर नहीं है, तो सिर्फ़ allowEmbedded
वाली गतिविधियों की अनुमति होगी और कॉलर के पास ACTIVITY_EMBEDDING
की अनुमति होनी चाहिए.
ज़्यादा जानकारी के लिए, ये देखें:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
गतिविधि के लॉन्च को शर्तों के साथ कंट्रोल करने के लिए, LaunchParamsController
का इस्तेमाल करें. यह लॉन्च होने वाली सभी गतिविधियों को रोकता है. साथ ही, लॉन्च के लिए इस्तेमाल किए जाने वाले पैरामीटर में, सिस्टम कॉम्पोनेंट को बदलाव करने की अनुमति भी देता है. यह सुविधा system_server
में उपलब्ध है.
डिसप्ले विंडो की सेटिंग और सिस्टम डेकोरेशन कॉन्फ़िगर करना
सिस्टम की सजावट DisplayWindowSettings
में हर डिसप्ले के हिसाब से कॉन्फ़िगर की जा सकती है. डिवाइस पर लागू करने पर, /data/system/display_settings.xml
में डिफ़ॉल्ट कॉन्फ़िगरेशन मिल सकता है.
इस वैल्यू से यह तय होता है कि डिसप्ले पर सिस्टम डेकोरेशन (लॉन्चर, वॉलपेपर, नेविगेशन बार, और अन्य डेकोर विंडो) और IME दिखेंगे या नहीं.
ज़्यादा जानकारी के लिए, DisplayWindowSettings#shouldShowSystemDecorsLocked()
और DisplayWindowSettings#shouldShowImeLocked()
देखें.
डिसप्ले की पहचान करने के लिए, यूनीक आईडी (डिफ़ॉल्ट रूप से DisplayInfo#uniqueId
का इस्तेमाल किया जाता है) या हार्डवेयर डिसप्ले के लिए फ़िज़िकल पोर्ट आईडी (DisplayInfo#address
देखें) का इस्तेमाल करें.
उदाहरण के लिए, नीचे दिए गए डिसप्ले कॉन्फ़िगरेशन के उदाहरण से, सिम्युलेटेड डिसप्ले पर सिस्टम की सजावट और IME की सुविधा चालू होती है:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
ऊपर दिए गए उदाहरण में, uniqueId
का इस्तेमाल नाम एट्रिब्यूट में डिसप्ले आइडेंटिफ़िकेशन के लिए किया जाता है, जो सिम्युलेटेड डिसप्ले के लिए overlay:1
है.
पहले से मौजूद डिसप्ले के लिए, सैंपल वैल्यू "local:45354385242535243453"
हो सकती है.
दूसरा विकल्प यह है कि हार्डवेयर पोर्ट की जानकारी का इस्तेमाल करें और identifier="1"
को DisplayWindowSettings#IDENTIFIER_PORT
के हिसाब से सेट करें. इसके बाद, "port:<port_id>"
फ़ॉर्मैट का इस्तेमाल करने के लिए नाम अपडेट करें:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
ज़्यादा जानकारी के लिए, स्टैटिक डिसप्ले आइडेंटिफ़ायर देखें.
ज़्यादा जानकारी के लिए, ये देखें: