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

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

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

इस मामले में, 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>

ज़्यादा जानकारी के लिए, स्टैटिक डिसप्ले आइडेंटिफ़ायर देखें.

ज़्यादा जानकारी के लिए, ये देखें: