يوضّح هذا الدليل كيفية إبقاء تطبيقك قيد التشغيل دائمًا، وكيفية الاستجابة لحالات انتقال الطاقة ، وكيفية إدارة سلوك التطبيق لتقديم تجربة جيدة للمستخدم مع الحفاظ على شحن البطارية.
يؤثر إبقاء التطبيق مرئيًا باستمرار بشكل كبير على عمر البطارية، لذا يجب مراعاة تأثير الطاقة عند إضافة هذه الميزة.
المفاهيم الرئيسية
عندما يظهر تطبيق Wear OS على ملء الشاشة، يكون في إحدى حالتَي الطاقة التاليتَين:
- تفاعلي: حالة طاقة عالية يكون فيها سطوع الشاشة كاملاً، ما يسمح بتفاعل المستخدم بشكل كامل.
- استراحة: حالة طاقة منخفضة يتم فيها تعتيم الشاشة للحفاظ على الطاقة. في هذه الحالة، تظل واجهة مستخدم تطبيقك تشغل ملء الشاشة، ولكن قد يغيّر النظام مظهرها عن طريق تعتيمها أو إضافة محتوى فوقها، مثل الوقت. يُشار إلى هذه الحالة أيضًا باسم وضع الاستراحة.
يتحكّم نظام التشغيل في الانتقال بين هاتَين الحالتَين.
التطبيق قيد التشغيل دائمًا هو تطبيق يعرض محتوى في حالتَي التفاعل والاستراحة.
عندما يواصل تطبيق قيد التشغيل دائمًا عرض واجهة المستخدم الخاصة به أثناء وجود الجهاز في حالة الاستراحة المنخفضة الطاقة، يُقال إنّه في وضع التشغيل المستمر في حالة الاستراحة.
عمليات الانتقال في النظام والسلوك التلقائي
عندما يكون التطبيق في المقدّمة، يدير النظام عمليات انتقال حالة الطاقة استنادًا إلى مهلتَين تنتهيان بسبب عدم نشاط المستخدم.
- المهلة رقم 1: الانتقال من حالة التفاعل إلى حالة الاستراحة: بعد فترة من عدم نشاط المستخدم، ينتقل الجهاز إلى حالة الاستراحة.
- المهلة رقم 2: الرجوع إلى خلفية شاشة الساعة: بعد فترة أخرى من عدم النشاط، قد يخفي النظام التطبيق الحالي ويعرض خلفية شاشة الساعة.
بعد أن يجتاز النظام عملية الانتقال الأولى إلى حالة الاستراحة مباشرةً، يعتمد السلوك التلقائي على إصدار Wear OS وإعدادات تطبيقك:
- في Wear OS 5 والإصدارات الأقدم، يعرض النظام لقطة شاشة معتّمة لتطبيقك المتوقف مؤقتًا، مع عرض الوقت فوقها. تمثّل هذه الحالة عقدة "AOD Lite" في المخطط الانسيابي التالي.
- في Wear OS 6 والإصدارات الأحدث، إذا كان التطبيق يستهدف حزمة تطوير البرامج (SDK) 36 أو الإصدارات الأحدث، يُعتبر قيد التشغيل دائمًا. يتم تعتيم الشاشة، ولكن يظل التطبيق قيد التشغيل ومرئيًا. (قد تكون التحديثات غير متكررة، مثل مرة واحدة في الدقيقة). تمثّل هذه الحالة عقدة "Global AOD" في المخطط الانسيابي التالي.
تخصيص السلوك في حالة الاستراحة
بغض النظر عن السلوك التلقائي للنظام، يمكنك في جميع إصدارات 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().override fun onDestroy() { super.onDestroy() lifecycle.removeObserver(ambientObserver) // ... }
بالنسبة إلى المطوّرين الذين يستخدمون Jetpack Compose، توفّر مكتبة Horologist أداة مساعدة مفيدة
، وهي الدالة المركّبة AmbientAware، التي تسهّل تنفيذ
هذا النمط.
TimeText المتوافق مع وضع الاستراحة
على عكس الحاجة إلى مراقب مخصّص، يكون عنصر واجهة المستخدم TimeText
متوافقًا مع وضع الاستراحة في Wear OS 6. يتم تعديله تلقائيًا مرة واحدة في الدقيقة عندما يكون الجهاز في حالة الاستراحة بدون أي رمز إضافي.
المخطط الانسيابي لسلوك وضع الاستراحة
يوضّح المخطط الانسيابي التالي كيف يحدّد النظام سلوك وضع الاستراحة استنادًا إلى إصدار Wear OS على الجهاز، وtargetSdkVersion لتطبيقك، وما إذا كان التطبيق ينفّذ AmbientLifecycleCallback.
التحكّم في مدة تشغيل الشاشة
توضّح الأقسام التالية كيفية إدارة مدة ظهور تطبيقك على الشاشة.
منع الرجوع إلى خلفية شاشة الساعة باستخدام "نشاط جارٍ" أو "تحديث فوري"
بعد فترة من الوقت في حالة الاستراحة (المهلة رقم 2)، سيعود النظام عادةً إلى خلفية شاشة الساعة. يمكن للمستخدم ضبط مدة المهلة في إعدادات النظام. في حالات استخدام معيّنة، مثل تتبُّع المستخدم لتمرين، قد يحتاج التطبيق إلى البقاء مرئيًا لفترة أطول.
في Wear OS 5 والإصدارات الأحدث، يمكنك منع ذلك من خلال تنفيذ نشاط جارٍ. إذا كان تطبيقك يعرض معلومات عن مهمة مستخدم جارٍ تنفيذها، مثل جلسة تمرين، يمكنك استخدام Ongoing Activity API لإبقاء تطبيقك مرئيًا حتى انتهاء المهمة. إذا عاد المستخدم يدويًا إلى خلفية شاشة الساعة، يوفّر مؤشر النشاط المستمر في الخلفية طريقة بنقرة واحدة للعودة إلى تطبيقك.
بدلاً من ذلك، في Wear OS 7 والإصدارات الأحدث، يمكنك استخدام تحديث فوري بدلاً من نشاط جارٍ. لضمان التوافق مع الإصدارات السابقة، واصِل دعم "النشاط الجاري" على الأجهزة التي تعمل بنظام التشغيل Wear OS 6 أو الإصدارات الأقدم.
لتنفيذ ذلك، يجب أن يشير هدف اللمس للإشعار الجاري إلى نشاطك قيد التشغيل دائمًا، كما هو موضّح في مقتطف الرمز التالي:
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) val notification = notificationBuilder.build()
إبقاء الشاشة قيد التشغيل ومنع حالة الاستراحة
في حالات نادرة، قد تحتاج إلى منع الجهاز تمامًا من الانتقال إلى حالة الاستراحة. أي تجنُّب المهلة رقم 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 (أو التحديثات الفورية على Wear OS 7 والإص101}دارات الأحدث) طوال مدة التمرين لمنع النظام من الرجوع إلى خلفية شاشة الساعة
للحصول على عملية تنفيذ كاملة، اطّلِع على نموذج التمرين المستند إلى Compose على Exercise sample على
GitHub. يوضّح هذا النموذج أيضًا استخدام الدالة المركّبة AmbientAware
من مكتبة Horologist لتسهيل التعامل مع وضع الاستراحة
في Compose.