सुझाए गए तरीके

फोल्डेबल और मल्टी-स्क्रीन डिवाइस के लिए ऐप्स

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

इस मामले में, 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" हो सकता है। एक अन्य विकल्प हार्डवेयर पोर्ट जानकारी का उपयोग करना और DisplayWindowSettings#IDENTIFIER_PORT के अनुरूप identifier="1" सेट करना है और फिर "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>

विवरण के लिए, स्टेटिक डिस्प्ले आइडेंटिफ़ायर देखें।

अधिक जानकारी के लिए देखें: