يوضّح هذا الدليل كيفية إبقاء تطبيقك نشطًا دائمًا، وكيفية الاستجابة لحالات انتقال الطاقة، وكيفية إدارة سلوك التطبيق لتوفير تجربة مستخدم جيدة مع الحفاظ على البطارية.
يؤثر إبقاء التطبيق مرئيًا باستمرار بشكل كبير على عمر البطارية، لذا يجب مراعاة تأثير استهلاك الطاقة عند إضافة هذه الميزة.
المفاهيم الرئيسية
عندما يتم عرض تطبيق Wear OS على الشاشة الكاملة، يكون في إحدى حالتين من حالات الطاقة:
- تفاعلي: حالة عالية الطاقة تكون فيها الشاشة في أقصى سطوع لها، ما يتيح للمستخدم التفاعل بشكل كامل.
- الوضع المحيط: هو وضع منخفض الطاقة يتم فيه تعتيم الشاشة للحفاظ على الطاقة. في هذه الحالة، تظل واجهة مستخدم تطبيقك تشغل ملء الشاشة، ولكن قد يغيّر النظام مظهرها من خلال تمويهها أو عرض محتوى مثل الوقت فوقها. يُعرف هذا الوضع أيضًا باسم وضع الإضاءة السينمائية.
يتحكّم نظام التشغيل في الانتقال بين هذه الحالات.
التطبيق الذي يعمل دائمًا هو تطبيق يعرض المحتوى في كل من حالتَي التفاعلية والخلفية.
عندما يستمر تطبيق يعمل دائمًا في عرض واجهة المستخدم الخاصة به بينما يكون الجهاز في حالة الاستراحة منخفضة الطاقة، يُقال إنّه في وضع الاستراحة النشط.
عمليات الانتقال في النظام والسلوك التلقائي
عندما يكون التطبيق في المقدّمة، يدير النظام عمليات الانتقال بين حالات الطاقة استنادًا إلى مهلتَين يتم تفعيلهما عند توقّف نشاط المستخدم.
- المهلة رقم 1: من الوضع التفاعلي إلى وضع العرض المحيط: بعد فترة من عدم نشاط المستخدم، ينتقل الجهاز إلى وضع العرض المحيط.
- المهلة رقم 2: الرجوع إلى خلفية شاشة الساعة: بعد فترة أخرى من عدم النشاط، قد يخفي النظام التطبيق الحالي ويعرض خلفية شاشة الساعة.
بعد أن ينتقل النظام إلى حالة الوضع المحيط للمرة الأولى، يعتمد السلوك التلقائي على إصدار Wear OS وإعدادات تطبيقك:
- على الإصدار 5 من نظام التشغيل Wear OS والإصدارات الأقدم، يعرض النظام لقطة شاشة مشوّشة لتطبيقك المتوقف مؤقتًا، مع عرض الوقت في الأعلى.
- على الإصدار 6 من Wear OS والإصدارات الأحدث، إذا كان التطبيق يستهدف الإصدار 36 من حزمة تطوير البرامج (SDK) أو الإصدارات الأحدث، سيتم اعتباره قيد التشغيل دائمًا. يتم تعتيم الشاشة، ولكن يظل التطبيق قيد التشغيل ومرئيًا. (قد تكون التحديثات غير متكررة، أي مرة واحدة كل دقيقة).
تخصيص السلوك في "وضع الاستراحة"
بغض النظر عن السلوك التلقائي للنظام، يمكنك في جميع إصدارات Wear OS تخصيص مظهر تطبيقك أو سلوكه أثناء حالة الوضع المحيط باستخدام AmbientLifecycleObserver
للاستماع إلى عمليات معاودة الاتصال عند الانتقال بين الحالات.
استخدام AmbientLifecycleObserver
للتفاعل مع أحداث "وضع الإضاءة السينمائية"، استخدِم الفئة AmbientLifecycleObserver
:
تنفيذ واجهة
AmbientLifecycleObserver.AmbientLifecycleCallback
استخدِم الطريقةonEnterAmbient()
لضبط واجهة المستخدم على وضع الطاقة المنخفضة، واستخدِم الطريقةonExitAmbient()
لإعادة ضبطها على وضع العرض التفاعلي الكامل.val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. // Adjust UI for low-power state: dim colors, hide non-essential elements. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. // Restore full UI. } override fun onUpdateAmbient() { // ... Called by the system periodically (typically once per minute) // to allow the app to update its display while in ambient mode. } }
أنشئ
AmbientLifecycleObserver
وسجِّله في دورة حياة النشاط أو العنصر القابل للإنشاء.private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
اتّصِل بالرقم
removeObserver()
لإزالة المراقب فيonDestroy()
.
بالنسبة إلى المطوّرين الذين يستخدمون Jetpack Compose، توفّر مكتبة Horologist أداة مساعدة مفيدة، وهي AmbientAware
القابلة للإنشاء، ما يسهّل تنفيذ هذا النمط.
TimeText المتوافق مع ميزة "استشعار الحركة المحيطة"
كاستثناء من شرط توفُّر أداة مراقبة مخصّصة، فإنّ الأداة TimeText
في Wear OS 6 تتوافق مع وضع العرض المحيط. يتم تعديلها تلقائيًا مرة واحدة في الدقيقة عندما يكون الجهاز في وضع العرض المحيط بدون أي رمز إضافي.
التحكّم في مدة تشغيل الشاشة
توضّح الأقسام التالية كيفية إدارة مدة بقاء تطبيقك على الشاشة.
منع الرجوع إلى خلفية شاشة الساعة باستخدام "نشاط متواصل"
بعد فترة من الوقت في حالة الوضع المحيط (انتهاء المهلة رقم 2)، سيعود النظام عادةً إلى خلفية شاشة الساعة. يمكن للمستخدم ضبط مدة المهلة في إعدادات النظام. في بعض حالات الاستخدام، مثل تتبُّع المستخدم لتمرين رياضي، قد يحتاج التطبيق إلى البقاء مرئيًا لفترة أطول.
في الإصدار 5 من Wear OS والإصدارات الأحدث، يمكنك منع ذلك من خلال تنفيذ نشاط مستمر. إذا كان تطبيقك يعرض معلومات حول مهمة مستخدم مستمرة، مثل جلسة تمرين، يمكنك استخدام Ongoing Activity API لإبقاء تطبيقك مرئيًا إلى أن تنتهي المهمة. إذا عاد المستخدم يدويًا إلى خلفية شاشة الساعة، يوفّر مؤشر النشاط الجاري طريقة بنقرة واحدة للعودة إلى تطبيقك.
لتنفيذ ذلك، يجب أن يشير هدف اللمس للإشعار المستمر إلى نشاطك الذي يعمل دائمًا، كما هو موضّح في مقتطف الرمز التالي:
private fun createNotification(): Notification { val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) return notificationBuilder.build() }
إبقاء الشاشة مفعّلة ومنع حالة "العرض المحيط"
في حالات نادرة، قد تحتاج إلى منع الجهاز تمامًا من الانتقال إلى حالة وضع الاستراحة. أي لتجنُّب الخطأ Timeout #1. لإجراء ذلك، يمكنك استخدام علامة النافذة
FLAG_KEEP_SCREEN_ON
. تعمل هذه الميزة كقفل تنبيه، ما يحافظ على الجهاز في حالة تفاعلية. يجب استخدام هذا الخيار بحذر شديد لأنّه يؤثر بشكل كبير في عمر البطارية.
اقتراحات بشأن "وضع الاستراحة"
لتقديم أفضل تجربة للمستخدمين والحفاظ على الطاقة في وضع العرض المحيط، اتّبِع إرشادات التصميم التالية. تمنح هذه الاقتراحات الأولوية لتجربة المستخدم الواضحة من خلال منع المعلومات المضلّلة والحدّ من التشويش المرئي، مع تحسين قوة العرض في الوقت نفسه.
- تقليل الفوضى البصرية واستهلاك الطاقة تشير واجهة المستخدم النظيفة والبسيطة إلى أنّ التطبيق في وضع استهلاك منخفض للطاقة، كما أنّها توفّر شحن البطارية بشكل كبير من خلال الحدّ من عدد وحدات البكسل الساطعة.
- إبقاء 85% على الأقل من الشاشة باللون الأسود
- اعرض المعلومات الأكثر أهمية فقط، وانقل التفاصيل الثانوية إلى الشاشة التفاعلية.
- استخدِم خطوطًا خارجية للرموز أو الأزرار الكبيرة بدلاً من التعبئة الكاملة.
- تجنَّب استخدام مساحات كبيرة من الألوان الثابتة والعلامات التجارية أو صور الخلفية غير الوظيفية.
- التعامل مع البيانات الديناميكية القديمة
- يتم استدعاء دالة
onUpdateAmbient()
فقط بشكل دوري، أي مرة واحدة في الدقيقة عادةً، للحفاظ على الطاقة. وبسبب هذا القيد، تصبح أي بيانات تتغيّر بشكل متكرّر، مثل ساعة الإيقاف أو معدّل نبضات القلب أو مسافة التمرين، قديمة بين عمليات التحديث. لتجنُّب عرض معلومات مضلّلة وغير صحيحة، استخدِم معاودة الاتصالonEnterAmbient
، واستبدِل هذه القيم المباشرة بمحتوى ثابت للنائب، مثل--
.
- يتم استدعاء دالة
- الحفاظ على تنسيق متّسق
- يجب الحفاظ على موضع العناصر نفسه في كل من وضعَي التفاعلي والمحيطي لإنشاء انتقال سلس.
- عرض الوقت دائمًا
- الاستجابة للسياق
- إذا كان المستخدم يتصفّح شاشة إعدادات أو ضبط عند دخول الجهاز إلى "وضع الاستراحة"، ننصحك بعرض شاشة أكثر صلةً من تطبيقك بدلاً من عرض الإعدادات.
- التعامل مع المتطلبات الخاصة بالجهاز
- في عنصر
AmbientDetails
الذي تم تمريره إلىonEnterAmbient()
:- إذا كانت قيمة
deviceHasLowBitAmbient
هيtrue
، أوقِف ميزة "تنعيم الحواف" حيثما أمكن ذلك. - إذا كان
burnInProtectionRequired
هوtrue
، عليك تغيير موضع عناصر واجهة المستخدم بشكل دوري قليلاً وتجنُّب المساحات البيضاء الخالصة لمنع احتراق الشاشة.
- إذا كانت قيمة
- في عنصر
تصحيح الأخطاء والاختبار
قد تكون أوامر adb
هذه مفيدة عند تطوير تطبيقك أو اختبار طريقة عمله عندما يكون الجهاز في وضع العرض المحيط:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
مثال: تطبيق تمارين رياضية
لنفترض أنّ هناك تطبيقًا للتمارين الرياضية يحتاج إلى عرض مقاييس للمستخدم طوال مدة جلسة التمرين. يجب أن يظل التطبيق مرئيًا خلال عمليات الانتقال إلى وضع العرض المحيط وتجنُّب استبداله بخلفية شاشة الساعة.
لتحقيق ذلك، على المطوّر اتّخاذ الخطوات التالية:
- نفِّذ
AmbientLifecycleObserver
للتعامل مع تغييرات واجهة المستخدم بين حالتَي تفاعلية ومحيطة، مثل تعتيم الشاشة وإزالة البيانات غير الأساسية. - أنشئ تصميمًا جديدًا منخفض الطاقة لحالة الاستراحة يتّبع أفضل الممارسات.
- استخدِم Ongoing Activity API طوال مدة التمرين لمنع النظام من الرجوع إلى خلفية شاشة الساعة.
للحصول على عملية تنفيذ كاملة، يمكنك الاطّلاع على نموذج التمرين المستند إلى Compose على GitHub. يوضّح هذا النموذج أيضًا كيفية استخدام العنصر AmbientAware
القابل للإنشاء من مكتبة Horologist لتبسيط عملية التعامل مع "وضع العرض المحيط" في Compose.