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