تطبيقات قيد التشغيل دائمًا وميزة "وضع الإضاءة السينمائية"

الكلمات الرئيسية: wear،ambient،alwayson

يتعامل نظام التشغيل Wear OS تلقائيًا مع الانتقال إلى وضع الطاقة المنخفضة لتطبيق نشط عندما يتوقف المستخدم عن استخدام ساعته. ويُعرف هذا الوضع باسم وضع الإضاءة السينمائية. إذا تفاعل المستخدم مع الساعة مرة أخرى خلال إطار زمني معيّن، سيعيد نظام التشغيل Wear OS المستخدم إلى التطبيق الذي توقّف عنده.

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

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

ضبط إعدادات مشروعك

لتفعيل ميزة "الإضاءة السينمائية"، اتّبِع الخطوات التالية:

  1. أنشئ مشروعك أو عدِّله استنادًا إلى الإعدادات في صفحة إنشاء تطبيق مخصّص للأجهزة القابلة للارتداء وتشغيله.
  2. أضِف إذن WAKE_LOCK إلى ملف بيان Android:
<uses-permission android:name="android.permission.WAKE_LOCK" />

تفعيل وضع "تشغيل الشاشة دائمًا"

لاستخدام فئة AmbientLifecycleObserver، اتّبِع الخطوات التالية:

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

    Kotlin

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
        // ... Called when moving from interactive mode into ambient mode.
        }
    
        override fun onExitAmbient() {
        // ... Called when leaving ambient mode, back into interactive mode.
        }
    
        override fun onUpdateAmbient() {
        // ... Called by the system in order to allow the app to periodically
        // update the display while in ambient mode. Typically the system will
        // call this every 60 seconds.
        }
    }
  2. أنشئ AmbientLifecycleObserver وسجِّل المُراقب. وعادةً ما يتم استخدام هذه القيمة في onCreate() أو في العنصر القابل للتجميع من المستوى الأعلى في حال استخدام Compose لنظام التشغيل Wear OS، وذلك بهدف السماح بتفعيل السلوك "التشغيل دائمًا" طوال دورة حياة النشاط.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. أزِل المراقب من خلال استدعاء removeObserver() عندما لا يكون السلوك "مفعّل دائمًا" مطلوبًا. على سبيل المثال، يمكنك استدعاء هذه الطريقة في طريقة onDestroy() لنشاطك.

يمكن نقل التطبيقات التي تعمل دائمًا إلى الخلفية

بدءًا من الإصدار 5 من نظام التشغيل Wear OS، ينقل النظام التطبيقات المعروضة دائمًا إلى الخلفية بعد ظهورها في وضع الإضاءة السينمائية لفترة زمنية معيّنة. يمكن للمستخدمين ضبط مهلة الانتظار في إعدادات النظام.

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

لكي يتعرّف النظام على النشاط الجاري، يجب أن يشير رمز اللمس في إعلام الرسالة المستمر إلى نشاطك الدائم، كما هو موضّح في مقتطف الرمز التالي:

// Create a pending intent that point to your always-on activity
val touchIntent =
    PendingIntent.getActivity(
        context,
        0,
        Intent(context, MyAlwaysOnActivity::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
    // ...
    .setOngoing(true)

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
    // ...
    .setTouchIntent(touchIntent)
    .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(
    NOTIFICATION_ID,
    notificationBuilder.build()
)

تعديل المظهر المرئي في وضع الإضاءة السينمائية

بشكلٍ تلقائي، عند تفعيل ميزة "تشغيل الشاشة دائمًا"، لا تتغيّر طريقة ظهور الشاشة عندما تدخل الساعة في وضع الاستراحة. يمكنك تعديل هذا السلوك من خلال إلغاء الطرق في AmbientLifecycleCallback.

للمساعدة في توفير الطاقة، اتّبِع الخطوات التالية:

  • إضاءة عدد أقل من وحدات البكسل وترك معظم الشاشة سوداء ننصحك بعدم عرض سوى المعلومات المهمة في الوضع "الإضاءة السينمائية"، وتقديم المزيد من التفاصيل عندما يدخل المستخدم إلى الوضع التفاعلي.
  • تعديل أي محتوى لنشر تحديثات أقل تكرارًا على سبيل المثال، يمكنك عرض الموقّتات لأقرب دقيقة بدلاً من أقرب ثانية.
  • في AmbientDetails كائن تم تمريره إلى onEnterAmbient():
    • في حال ضبط deviceHasLowBitAmbient، أوقِف ميزة تمويه الحواف كلما أمكن ذلك.
    • في حال ضبط burnInProtectionRequired، حرِّك الرسم البياني بشكل دوري وتجنَّب المناطق البيضاء الكاملة.

عند استخدام Compose لنظام التشغيل Wear OS، ننصحك باستخدام طرق الاستدعاء التالية لتعديل الحالة، ما يسمح للنظام بإعادة إنشاء واجهة المستخدم بشكلٍ مناسب.

للحصول على مثال على كيفية تحقيق ذلك، يمكنك الاطّلاع على النموذج التدريبي المستنِد إلى الإنشاء على GitHub، والذي يستخدم العنصر القابل للتجميع AmbientAware من مكتبة Horologist.