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

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

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

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

در این حالت، «میانای کاربر سامانه» یا مؤلفه سامانه دیگری باید تا شدن را تشخیص دهد، تعیین کند که آیا انجام کنش مناسب است یا نه، و سپس فعالیت هدف را راه‌اندازی کند و شناسه نمایشگر خارجی را به‌عنوان هدف راه‌اندازی مشخص کند. برنامه‌ها نباید این کنش را شناسایی کنند یا در پاسخ به آن کنشی انجام دهند و سپس راه‌اندازی را در نمایشگر خاصی انجام دهند. بنابراین فرض نکنید که آنچه در یک دستگاه کار می‌کند در دستگاه‌های دیگر هم کار خواهد کرد. به‌طور خلاصه، کد مختص دستگاه تکه‌تکه‌سازی را افزایش می‌دهد.

محدود کردن دسترسی به نمایشگرها

اگر پیکربندی دستگاه نیاز به محدود کردن دسترسی به یک یا چند نمایشگر دارد، توصیه می‌کنیم از پرچم 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>

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

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

جابه‌جا کردن نمایشگرها بین قرینه‌سازی و میزبانی کارها

در Android 17 و بالاتر، DisplayManager از پرچم FLAG_ALLOWS_CONTENT_MODE_SWITCH برای کنترل اینکه آیا نمایشگر در زمان اجرا بین آینه‌سازی و میزبانی تکالیف جابه‌جا شود یا نه استفاده می‌کند. به‌طور پیش‌فرض، این پرچم برای نمایشگرهای خارجی فعال و برای همه نمایشگرهای دیگر غیرفعال است.

وقتی FLAG_ALLOWS_CONTENT_MODE_SWITCH وجود داشته باشد، DisplayManager تنظیم ایمن android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY را پایش می‌کند تا تعیین کند که تکالیف را منعکس کند یا میزبانی کند. اگرچه این منطق پیش‌فرض است، تولیدکنندگان تجهیزات اصلی می‌توانند این رفتار را سفارشی‌سازی کنند.

نمایش توپولوژی و حرکت نشانگر

در Android 17 و بالاتر، توپولوژی نمایشگر موقعیت‌های نسبی نمایشگرها را تعریف می‌کند و حرکت اشاره‌گر موشواره را به مجموعه خاصی از نمایشگرها در توپولوژی محدود می‌کند.

‫WindowManager تصمیم می‌گیرد نمایشگر را در توپولوژی و تماس‌ها DisplayManagerInternal.onDisplayBelongToTopologyChanged بگنجاند. DisplayManager DisplayTopologyCoordinator.isDisplayAllowedInTopology را قبل‌از افزودن نمایشگر بررسی می‌کند. به‌طور پیش‌فرض، اگر نمایشگرهای محلی بتوانند میزبان تکالیف باشند، سیستم آن‌ها را اضافه می‌کند.

اگر چندین نمایشگر عمومی وجود داشته باشد که بتواند میزبان تکلیف‌ها باشد، تصمیم‌گیری درباره افزودن نمایشگر پیش‌فرض توسط ارائه‌دهنده بولی shouldIncludeDefaultDisplayInTopology که به DisplayTopologyCoordinator ارسال می‌شود انجام می‌شود. اگر نمایشگر پیش‌فرض تنها نمایشگر عمومی باشد که می‌تواند میزبان تکلیف‌ها باشد، همیشه در توپولوژی است. در AOSP، ارائه‌دهنده بولی فقط درصورتی true را برمی‌گرداند که نمایشگر پیش‌فرض از پنجره‌بندی رایانه‌ای پشتیبانی کند یا اگر تنظیم ایمن Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY true باشد.

برنامه‌ها بااستفاده از DisplayManager.getDisplayTopology توپولوژی فعلی را پُرسمان می‌کنند و با ثبت شنودگر با DisplayManager.registerTopologyListener به تغییرات توپولوژی واکنش نشان می‌دهند.