شیوه های توصیه شده

برنامه‌های کاربردی برای دستگاه‌های تاشو و چند صفحه‌نمایش

به طور کلی، برنامه ها نباید به شناسه های ثابت یا منطق وابسته به برخی شناسه های نمایشگر متکی باشند. در بیشتر موارد، برنامه‌ها باید اندازه‌شان را تغییر دهند و روی نمایشگرهای مختلف کار کنند و سیستم باید مکان‌یابی برنامه‌ها را کنترل کند. به عنوان مثال، برای ایجاد یک تجربه جدید و منحصر به فرد برای دستگاه های تاشو و راه اندازی یک برنامه خاص در صفحه خارجی هنگامی که دستگاه تا شده است.

در این مورد، 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 برای شناسایی نمایش در ویژگی name استفاده می‌شود، که برای نمایش شبیه‌سازی شده 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>

برای جزئیات، به شناسه های نمایشگر استاتیک مراجعه کنید.

برای اطلاعات بیشتر رجوع کنید به:

،

برنامه‌های کاربردی برای دستگاه‌های تاشو و چند صفحه‌نمایش

به طور کلی، برنامه ها نباید به شناسه های ثابت یا منطق وابسته به برخی شناسه های نمایشگر متکی باشند. در بیشتر موارد، برنامه‌ها باید اندازه‌شان را تغییر دهند و روی نمایشگرهای مختلف کار کنند و سیستم باید محل قرارگیری برنامه‌ها را کنترل کند. به عنوان مثال، برای ایجاد یک تجربه جدید و منحصر به فرد برای دستگاه های تاشو و راه اندازی یک برنامه خاص در صفحه خارجی هنگامی که دستگاه تا شده است.

در این مورد، 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 برای شناسایی نمایش در ویژگی name استفاده می‌شود، که برای نمایش شبیه‌سازی شده 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>

برای جزئیات، به شناسه های نمایشگر استاتیک مراجعه کنید.

برای اطلاعات بیشتر رجوع کنید به:

،

برنامه‌های کاربردی برای دستگاه‌های تاشو و چند صفحه‌نمایش

به طور کلی، برنامه ها نباید به شناسه های ثابت یا منطق وابسته به برخی شناسه های نمایشگر متکی باشند. در بیشتر موارد، برنامه‌ها باید اندازه‌شان را تغییر دهند و روی نمایشگرهای مختلف کار کنند و سیستم باید محل قرارگیری برنامه‌ها را کنترل کند. به عنوان مثال، برای ایجاد یک تجربه جدید و منحصر به فرد برای دستگاه های تاشو و راه اندازی یک برنامه خاص در صفحه خارجی هنگامی که دستگاه تا شده است.

در این مورد، 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 برای شناسایی نمایش در ویژگی name استفاده می‌شود، که برای نمایش شبیه‌سازی شده 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>

برای جزئیات، به شناسه های نمایشگر استاتیک مراجعه کنید.

برای اطلاعات بیشتر رجوع کنید به: