برنامه های همیشه روشن و حالت محیطی سیستم

این راهنما توضیح می‌دهد که چگونه برنامه‌تان را همیشه روشن کنید، چگونه به انتقال حالت برق واکنش نشان دهید، و چگونه رفتار برنامه را مدیریت کنید تا ضمن صرفه‌جویی در مصرف باتری، یک تجربه کاربری خوب ارائه دهید.

قابل مشاهده بودن یک برنامه به طور قابل توجهی بر عمر باتری تأثیر می گذارد، بنابراین هنگام افزودن این ویژگی تأثیر انرژی را در نظر بگیرید.

مفاهیم کلیدی

هنگامی که یک برنامه Wear OS در تمام صفحه نمایش داده می شود، در یکی از دو حالت قدرت قرار دارد:

  • تعاملی : حالتی با قدرت بالا که در آن صفحه نمایش در روشنایی کامل است و امکان تعامل کامل با کاربر را فراهم می کند.
  • محیط : حالت کم مصرف که در آن صفحه نمایش برای صرفه جویی در مصرف برق کم می شود. در این حالت، رابط کاربری برنامه شما همچنان تمام صفحه را اشغال می‌کند، اما ممکن است سیستم ظاهر آن را با محو کردن آن یا پوشاندن محتوایی مانند زمان تغییر دهد. به این حالت Ambient Mode نیز گفته می شود.

سیستم عامل انتقال بین این حالت ها را کنترل می کند.

برنامه همیشه روشن برنامه‌ای است که محتوا را در حالت تعاملی و محیطی نمایش می‌دهد.

هنگامی که یک برنامه همیشه روشن همچنان به نمایش رابط کاربری خود ادامه می دهد در حالی که دستگاه در حالت محیطی کم مصرف است، به عنوان در حالت ambiactive توصیف می شود.

انتقال سیستم و رفتار پیش فرض

هنگامی که یک برنامه در پیش زمینه است، سیستم انتقال وضعیت قدرت را بر اساس دو مهلت زمانی ایجاد شده توسط عدم فعالیت کاربر مدیریت می کند.

  • وقفه شماره 1: حالت تعاملی به محیط: پس از مدتی عدم فعالیت کاربر، دستگاه وارد حالت محیطی می شود.
  • وقفه شماره 2: بازگشت به صفحه ساعت: پس از یک دوره عدم فعالیت بیشتر، سیستم ممکن است برنامه فعلی را پنهان کرده و صفحه ساعت را نمایش دهد.

بلافاصله پس از اینکه سیستم از اولین انتقال به حالت Ambient عبور کرد، رفتار پیش‌فرض به نسخه Wear OS و پیکربندی برنامه شما بستگی دارد:

  • در Wear OS 5 و نسخه‌های پایین‌تر ، سیستم یک اسکرین شات تار از برنامه متوقف‌شده شما را با زمان در بالا نشان می‌دهد.
  • در Wear OS 6 و بالاتر ، اگر برنامه‌ای SDK 36 یا جدیدتر را هدف قرار دهد، همیشه روشن در نظر گرفته می‌شود. صفحه نمایش کم نور است، اما برنامه به کار خود ادامه می دهد و قابل مشاهده است. (به روز رسانی ممکن است به ندرت یک بار در دقیقه باشد.)

رفتار را برای حالت Ambient سفارشی کنید

صرف نظر از رفتار پیش‌فرض سیستم، در تمام نسخه‌های Wear OS می‌توانید ظاهر یا رفتار برنامه خود را در حالت Ambient با استفاده از AmbientLifecycleObserver برای گوش دادن به تماس‌های برگشتی در انتقال وضعیت سفارشی کنید.

از AmbientLifecycleObserver استفاده کنید

برای واکنش به رویدادهای حالت محیطی، از کلاس AmbientLifecycleObserver استفاده کنید:

  1. رابط AmbientLifecycleObserver.AmbientLifecycleCallback را پیاده سازی کنید. از متد onEnterAmbient() برای تنظیم UI خود برای حالت کم مصرف و 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.
        }
    }
    
  2. یک AmbientLifecycleObserver ایجاد کنید و آن را با چرخه حیات فعالیت خود یا قابل ترکیب ثبت کنید.

    private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback)
    
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(ambientObserver)
    
        // ...
    }
    
  3. برای حذف ناظر در onDestroy() removeObserver() فراخوانی کنید.

برای توسعه دهندگانی که از Jetpack Compose استفاده می کنند، کتابخانه Horologist یک ابزار مفید به نام AmbientAware composable ارائه می دهد که اجرای این الگو را ساده می کند.

TimeText آگاه از محیط

به عنوان یک استثنا برای نیاز به یک ناظر سفارشی، در Wear OS 6 ویجت TimeText از محیط آگاه است. هنگامی که دستگاه در حالت Ambient بدون کد اضافی است، به طور خودکار یک بار در دقیقه به روز می شود.

مدت زمان روشن شدن صفحه نمایش را کنترل کنید

بخش‌های زیر نحوه مدیریت مدت زمان ماندن برنامه روی صفحه را توضیح می‌دهند.

با یک فعالیت مداوم از بازگشت به صفحه ساعت جلوگیری کنید

پس از مدتی در حالت Ambient (Timeout #2)، سیستم معمولاً به صفحه ساعت برمی‌گردد. کاربر می تواند مدت زمان وقفه را در تنظیمات سیستم پیکربندی کند. برای موارد استفاده خاص، مانند ردیابی یک تمرین توسط کاربر، ممکن است لازم باشد برنامه برای مدت بیشتری قابل مشاهده باشد.

در Wear OS 5 و بالاتر، می‌توانید با اجرای یک فعالیت مداوم از این امر جلوگیری کنید. اگر برنامه شما اطلاعاتی در مورد یک کار کاربر در حال انجام، مانند جلسه تمرین نمایش می دهد، می توانید از 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()
}

صفحه نمایش را روشن نگه دارید و از وضعیت محیطی جلوگیری کنید

در موارد نادر، ممکن است لازم باشد به طور کامل از ورود دستگاه به حالت محیطی جلوگیری کنید. یعنی برای جلوگیری از تایم اوت شماره 1. برای این کار می توانید از پرچم پنجره FLAG_KEEP_SCREEN_ON استفاده کنید. این به عنوان یک قفل فعال عمل می کند و دستگاه را در حالت تعاملی نگه می دارد. از این با احتیاط شدید استفاده کنید زیرا به شدت بر عمر باتری تأثیر می گذارد.

توصیه هایی برای حالت محیطی

برای ارائه بهترین تجربه کاربری و صرفه جویی در مصرف انرژی در حالت Ambient ، این دستورالعمل های طراحی را دنبال کنید.

  • از یک صفحه نمایش مینیمالیستی و کم مصرف استفاده کنید
    • حداقل 85 درصد از صفحه نمایش را سیاه نگه دارید.
    • از خطوط کلی برای آیکون ها یا دکمه های بزرگ به جای پرهای جامد استفاده کنید.
    • فقط مهم ترین اطلاعات را نشان دهید و جزئیات ثانویه را به صفحه نمایش تعاملی منتقل کنید.
    • از بلوک های بزرگ رنگ ثابت و نام تجاری یا تصاویر پس زمینه غیر کاربردی خودداری کنید.
  • از به روز رسانی مناسب محتوا اطمینان حاصل کنید
    • برای تغییر مکرر داده‌هایی مانند کرونومتر، مسافت تمرین یا زمان، محتوای مکان‌نما را مانند -- نشان دهید تا از ایجاد تصور تازه بودن محتوا جلوگیری کنید.
    • نشانگرهای پیشرفت را که به طور مداوم به روز می شوند، حذف کنید، مانند حلقه های شمارش معکوس و جلسات رسانه.
    • فراخوانی onUpdateAmbient() فقط باید برای به‌روزرسانی‌های ضروری، معمولاً یک بار در دقیقه استفاده شود.
  • یک چیدمان ثابت را حفظ کنید
    • عناصر را در حالت های Interactive و Ambient در یک موقعیت نگه دارید تا یک انتقال صاف ایجاد کنید.
    • همیشه زمان را نشان دهید.
  • از متن آگاه باشید
    • اگر زمانی که دستگاه وارد حالت محیطی می‌شود، کاربر در صفحه تنظیمات یا پیکربندی قرار داشت، به جای نمای تنظیمات، صفحه مرتبط‌تری را از برنامه خود نشان دهید.
  • رسیدگی به نیازهای خاص دستگاه
    • در شیء AmbientDetails به onEnterAmbient() ارسال شد:
      • اگر deviceHasLowBitAmbient true است، در صورت امکان anti-aliasing را غیرفعال کنید.
      • اگر 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

مثال: برنامه تمرین

یک برنامه تمرینی را در نظر بگیرید که نیاز به نمایش معیارها برای کاربر در تمام مدت جلسه تمرین دارد. برنامه باید از طریق انتقال حالت محیطی قابل مشاهده باشد و از جایگزینی با صفحه ساعت جلوگیری کند.

برای رسیدن به این هدف، توسعه دهنده باید موارد زیر را انجام دهد:

  1. یک AmbientLifecycleObserver را برای مدیریت تغییرات رابط کاربری بین حالت‌های Interactive و Ambient اجرا کنید، مانند کم‌نور کردن صفحه و حذف داده‌های غیر ضروری.
  2. یک طرح بندی کم مصرف جدید برای حالت Ambient ایجاد کنید که از بهترین شیوه ها پیروی می کند.
  3. برای جلوگیری از بازگشت سیستم به صفحه ساعت، از API فعالیت مداوم برای مدت زمان تمرین استفاده کنید.

برای اجرای کامل، به نمونه تمرین مبتنی بر نوشتن در GitHub مراجعه کنید. این نمونه همچنین استفاده از AmbientAware قابل ترکیب از کتابخانه Horologist را برای ساده‌سازی حالت محیطی در Compose نشان می‌دهد.