پشتیبانی از نمایشگرهای متصل

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

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

شکل ۱. تلفن به یک نمایشگر خارجی متصل است، در حالی که تلفن وضعیت خود را حفظ می‌کند، یک جلسه دسکتاپ روی صفحه نمایش وجود دارد.

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

شکل ۲. تبلت متصل به یک مانیتور خارجی، که صفحه دسکتاپ را در هر دو نمایشگر گسترش می‌دهد.

پشتیبانی مؤثر از نمایشگرهای متصل، نیازمند توجه به چندین جنبه از طراحی و پیاده‌سازی برنامه شماست. بهترین شیوه‌های زیر، یک تجربه کاربری روان و پربار را تضمین می‌کنند.

مدیریت تغییرات پویای نمایش

بسیاری از برنامه‌ها با این فرض ساخته می‌شوند که شیء Display و ویژگی‌های آن در طول چرخه عمر برنامه تغییر نخواهند کرد. با این حال، هنگامی که کاربر یک مانیتور خارجی را متصل یا جدا می‌کند، یا حتی یک پنجره برنامه را بین نمایشگرها جابجا می‌کند، شیء Display زیرین مرتبط با زمینه یا پنجره برنامه شما می‌تواند تغییر کند. ویژگی‌های صفحه نمایش، مانند اندازه، وضوح، نرخ تازه‌سازی، پشتیبانی از HDR و تراکم، همگی می‌توانند متفاوت باشند. به عنوان مثال، اگر مقادیر را بر اساس صفحه نمایش گوشی به صورت hardcode تنظیم کنید، طرح‌بندی‌های شما احتمالاً در یک صفحه نمایش خارجی خراب می‌شوند.

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

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

از زمینه مناسب استفاده کنید

استفاده از context مناسب در محیط‌های چند نمایشگره بسیار مهم است. هنگام دسترسی به منابع، activity context (که نمایش داده می‌شود) با application context (که نمایش داده نمی‌شود) متفاوت است.

زمینه فعالیت حاوی اطلاعاتی در مورد نمایش است و همیشه برای ناحیه نمایشی که فعالیت در آن ظاهر می‌شود تنظیم می‌شود. این به شما امکان می‌دهد اطلاعات صحیحی در مورد تراکم نمایش یا معیارهای پنجره برنامه خود دریافت کنید. همیشه از زمینه فعالیت (یا یک زمینه مبتنی بر رابط کاربری دیگر) برای دریافت اطلاعات در مورد پنجره یا صفحه نمایش فعلی استفاده کنید. این امر همچنین بر برخی از API های سیستم که از اطلاعات زمینه استفاده می‌کنند، تأثیر می‌گذارد.

در Jetpack Compose، می‌توانید با استفاده از اشیاء CompositionLocal مانند LocalConfiguration.current و LocalDensity.current به اطلاعات خاص نمایش دسترسی پیدا کنید. هنگامی که یک فعالیت یا پنجره بین نمایشگرها حرکت می‌کند، پیکربندی دستگاه تغییر می‌کند و ترکیب مجدد با معیارهای نمایش جدید را آغاز می‌کند. اشیاء CompositionLocal رابط کاربری شما را قادر می‌سازند تا به طور یکپارچه سازگار شود.

دریافت اطلاعات نمایش

شما می‌توانید از کلاس Display برای دریافت اطلاعاتی مانند اندازه صفحه نمایش، تراکم یا پرچم‌ها استفاده کنید. از سرویس سیستم DisplayManager برای دریافت نمایشگرهای موجود استفاده کنید. برای شناسایی نمایشگرهای خارجی، Display.DEFAULT_DISPLAY را که معمولاً صفحه نمایش داخلی تلفن یا تبلت است، فیلتر کنید:

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }

مدیریت راه‌اندازی و پیکربندی فعالیت

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

وقتی یک اکتیویتی به یک نمایشگر ثانویه منتقل می‌شود، برنامه شما ممکن است به‌روزرسانی زمینه، تغییر اندازه پنجره و تغییرات پیکربندی و منابع را تجربه کند. اگر اکتیویتی تغییر پیکربندی را مدیریت کند، در onConfigurationChanged() مطلع می‌شود. در غیر این صورت، اکتیویتی دوباره راه‌اندازی می‌شود.

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

شما می‌توانید با استفاده ActivityOptions یک اکتیویتی را روی یک نمایشگر خاص اجرا کنید. توجه داشته باشید که launchDisplayId به اندروید ۸ (سطح API 26) یا بالاتر نیاز دارد.

// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
    .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
    ?.displayId

// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
    val intent = Intent(this, MySecondaryActivity::class.java)
    val options = ActivityOptions.makeBasic()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        options.launchDisplayId = externalDisplayId
    }
    startActivity(intent, options.toBundle())
} else {
    // Optionally, handle the case where no external display is connected.
}

از لیست‌های مجاز دستگاه اجتناب کنید

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

به جای استفاده از لیست‌های مجاز یا بررسی BUILD.MODEL و اندازه نمایشگر داخلی، معیارهای پنجره یا قابلیت‌های دستگاه را در زمان اجرا بررسی کنید تا در مورد رابط کاربری تصمیم‌گیری کنید. از APIهای Jetpack WindowManager یا کلاس‌های اندازه پنجره برای ساخت طرح‌بندی‌های واکنش‌گرا و تطبیقی ​​برای اندازه‌ها و تراکم‌های مختلف صفحه نمایش استفاده کنید.

پشتیبانی از لوازم جانبی خارجی

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

افزایش بهره‌وری کاربران

نمایشگرهای متصل فرصت قابل توجهی برای بهبود بهره‌وری کاربر فراهم می‌کنند. اکنون ابزارهایی برای ساخت برنامه‌های موبایل دارید که می‌توانند تجربیاتی قابل مقایسه با برنامه‌های دسکتاپ ارائه دهند. پیاده‌سازی ویژگی‌های زیر را برای افزایش بهره‌وری کاربر در نظر بگیرید:

  • به کاربران اجازه دهید چندین نمونه از یک برنامه را باز کنند. این برای کارهایی مانند مقایسه اسناد، مدیریت مکالمات مختلف یا مشاهده همزمان چندین فایل بسیار ارزشمند است.
  • به کاربران این امکان را بدهید که با کشیدن و رها کردن ، داده‌های غنی را در داخل و خارج از برنامه شما به اشتراک بگذارند.
  • با پیاده‌سازی یک سیستم مدیریت وضعیت قوی، به کاربران کمک کنید تا گردش کار خود را در طول تغییرات پیکربندی حفظ کنند.

با پیروی از این دستورالعمل‌ها و استفاده از نمونه‌های کد ارائه شده، می‌توانید برنامه‌هایی ایجاد کنید که به طور یکپارچه با نمایشگرهای متصل سازگار شوند و تجربه‌ای غنی‌تر و پربارتر را به کاربران ارائه دهند.