إتاحة الشاشات المتّصلة

توسّع الشاشات المتصلة تجربة العرض في نافذة لتشمل الهواتف العادية، ما يتيح للمستخدمين الوصول إلى الشاشات الكبيرة من أجهزتهم الجوّالة. تتيح هذه الإمكانية فرصًا جديدة للتفاعل مع التطبيقات وزيادة إنتاجية المستخدمين.

تنطبق جميع الميزات الفريدة للعرض في نافذة على الشاشات المتصلة. عند توصيل هاتف بشاشة، تظل حالة الهاتف بدون تغيير، وتبدأ جلسة سطح مكتب فارغة على الشاشة المتصلة. يعمل الجهاز والشاشة كنظامَين منفصلَين، مع تطبيقات خاصة بكل شاشة.

الشكل 1. هاتف متصل بشاشة خارجية، مع عرض جلسة سطح مكتب على الشاشة بينما يحتفظ الهاتف بحالته الخاصة

إذا وصّلت جهازًا مزوّدًا بميزة "العرض في نافذة"، مثل جهاز لوحي، بشاشة خارجية، ستمتد جلسة سطح المكتب على كلتا الشاشتين. بعد ذلك، تعمل الشاشتان كنظام واحد متواصل. يتيح هذا الإعداد إمكانية نقل النوافذ والمحتوى والمؤشر بحرية بين الشاشتين.

الشكل 2. جهاز لوحي متصل بشاشة خارجية، ويتم توسيع جلسة سطح المكتب على كلتا الشاشتين.

يتطلّب توفير الدعم لشاشات العرض المتصلة بشكل فعّال الاهتمام بعدة جوانب من تصميم تطبيقك وتنفيذه. تضمن أفضل الممارسات التالية تجربة مستخدم سلسة وفعّالة.

التعامل مع تغييرات العرض الديناميكية

تم تصميم العديد من التطبيقات على افتراض أنّ العنصر Display وخصائصه لن تتغيّر أثناء دورة حياة التطبيق. ومع ذلك، عندما يوصّل المستخدم شاشة خارجية أو يفصلها، أو حتى ينقل نافذة تطبيق بين الشاشات، يمكن أن يتغيّر عنصر Display الأساسي المرتبط بسياق تطبيقك أو نافذته. ويمكن أن تختلف خصائص الشاشة، مثل الحجم ودرجة الدقة ومعدّل التحديث ودعم النطاق الديناميكي العالي والكثافة. إذا كنت تستخدم قيمًا ثابتة استنادًا إلى شاشة الهاتف، من المحتمل أن تتعطّل تنسيقاتك على شاشة خارجية.

يمكن أن تختلف كثافة البكسل في شاشات العرض الخارجية بشكل كبير أيضًا. عليك التأكّد من أنّ تطبيقك يستجيب بشكلٍ صحيح لتغييرات الكثافة. ويشمل ذلك استخدام وحدات البكسل المستقلة الكثافة (dp) للتصميمات، وتوفير موارد خاصة بالكثافة، وضمان تغيير حجم واجهة المستخدم بشكل مناسب.

إذا كان هناك نشاط قيد التشغيل على شاشة خارجية عند فصلها، ينقل النظام النشاط إلى الشاشة الأساسية. يؤدي النقل إلى تغييرات في الإعدادات، مثل تغيير حجم الشاشة وكثافتها، ما قد يؤدي إلى إعادة إنشاء النشاط. يجب أن يتعامل تطبيقك مع تغيير الإعدادات من خلال حفظ حالة واجهة المستخدم واستعادتها لمنع فقدان البيانات أو حدوث تجربة مستخدم مربكة.

استخدام السياق المناسب

يُعدّ استخدام السياق المناسب أمرًا بالغ الأهمية في البيئات التي تتضمّن شاشات متعدّدة. عند الوصول إلى الموارد، يختلف سياق النشاط (الذي يتم عرضه) عن سياق التطبيق (الذي لا يتم عرضه).

يحتوي سياق النشاط على معلومات حول الشاشة ويتم تعديله دائمًا ليناسب مساحة العرض التي يظهر فيها النشاط. يتيح لك ذلك الحصول على المعلومات الصحيحة حول كثافة العرض أو مقاييس النافذة لتطبيقك. استخدِم دائمًا سياق النشاط (أو سياقًا آخر مستندًا إلى واجهة المستخدم) للحصول على معلومات حول النافذة أو الشاشة الحالية. يؤثّر ذلك أيضًا في بعض واجهات برمجة التطبيقات للنظام التي تستخدم معلومات من السياق.

في 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 }

إدارة تشغيل الأنشطة وإعدادها

باستخدام الشاشات المتصلة، يمكن للتطبيقات تحديد الشاشة التي يجب تشغيل التطبيق عليها عند إطلاقه أو عند إنشاء نشاط آخر. يعتمد هذا السلوك على وضع بدء النشاط المحدّد في ملف البيان وعلى علامات الأهداف وخياراتها التي يضبطها العنصر الذي يشغّل النشاط.

عند نقل نشاط إلى شاشة عرض ثانوية، قد يواجه تطبيقك تحديثًا للسياق وتغييرًا في حجم النافذة وتغييرات في الإعدادات والموارد. إذا كان النشاط يتعامل مع تغيير الإعدادات، يتم إعلامه في onConfigurationChanged(). بخلاف ذلك، تتم إعادة تشغيل النشاط.

إذا كان وضع بدء النشاط المحدّد لأحد الأنشطة يسمح بإنشاء مثيلات متعددة، يمكن أن يؤدي التشغيل على شاشة ثانوية إلى إنشاء مثيل جديد للنشاط. يتم استئناف كلا النشاطين في الوقت نفسه، ما قد يكون مفيدًا في بعض سيناريوهات تنفيذ المهام المتعددة.

يمكنك بدء نشاط على شاشة معيّنة باستخدام ActivityOptions. يُرجى العِلم أنّ launchDisplayId يتطلّب الإصدار 8 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 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 وحجم العرض المضمّن، تحقَّق من مقاييس النافذة أو إمكانات الجهاز في وقت التشغيل لاتخاذ قرارات بشأن واجهة المستخدم. استخدِم واجهات برمجة التطبيقات Jetpack WindowManager أو فئات أحجام النوافذ لإنشاء تخطيطات سريعة الاستجابة ومتكيّفة مع أحجام الشاشات وكثافتها المختلفة.

استخدام الأجهزة الطرفية الخارجية

عندما يتصل المستخدمون بشاشة عرض خارجية، غالبًا ما ينشئون بيئة تشبه بيئة سطح المكتب. ويشمل ذلك غالبًا استخدام لوحات مفاتيح وفئران ولوحات تتبُّع وكاميرات ويب وميكروفونات ومكبرات صوت خارجية. عليك التأكّد من أنّ تطبيقك يعمل بسلاسة مع هذه الأجهزة الطرفية. ويشمل ذلك التعامل مع اختصارات لوحة المفاتيح وإدارة تفاعلات مؤشر الماوس وتوفير الدعم الصحيح للكاميرات أو الميكروفونات الخارجية والالتزام بتوجيه مصدر إخراج الصوت. لمزيد من التفاصيل، يُرجى الاطّلاع على توافق الإدخال على الشاشات الكبيرة.

تحسين إنتاجية المستخدمين

توفّر الشاشات المتصلة فرصة كبيرة لتحسين إنتاجية المستخدم. تتوفّر لديك الآن الأدوات اللازمة لإنشاء تطبيقات على الأجهزة الجوّالة يمكنها تقديم تجارب مماثلة لتطبيقات الكمبيوتر. ننصحك بتنفيذ الميزات التالية لتعزيز إنتاجية المستخدمين:

  • يسمح للمستخدمين بفتح عدة مثيلات من التطبيق نفسه، وهو أمر قيّم لإنجاز مهام مثل مقارنة المستندات أو إدارة محادثات مختلفة أو عرض ملفات متعددة في الوقت نفسه.
  • يمكنك السماح للمستخدمين بمشاركة بيانات غنية داخل تطبيقك وخارجه باستخدام ميزة السحب والإفلات.
  • يمكنك مساعدة المستخدمين في الحفاظ على سير عملهم عند إجراء تغييرات في الإعدادات من خلال تنفيذ نظام قوي لإدارة الحالة.

من خلال اتّباع هذه الإرشادات والاستفادة من أمثلة الرموز البرمجية المقدَّمة، يمكنك إنشاء تطبيقات تتكيّف بسلاسة مع شاشات العرض المتصلة، ما يوفّر للمستخدمين تجربة أكثر ثراءً وإنتاجية.