Постоянно включенные приложения и режим окружающей среды системы

Wear OS автоматически обрабатывает переход в режим низкого энергопотребления для активного приложения, когда пользователь больше не использует свои часы. Это называется системным режимом окружения . Приложение возобновляет работу после того, как пользователь взаимодействует с часами, если выполняется любое из следующих условий:

  • Взаимодействие с пользователем происходит в течение определенного периода времени (до истечения времени ожидания).
  • Приложение объявляет и начинает текущую деятельность .

Для особых случаев использования — например, когда пользователь хочет видеть частоту сердечных сокращений и темп во время бега — вы также можете управлять тем, что отображается в системном режиме окружения. Приложения Wear OS, которые работают как в режиме окружения, так и в интерактивном режиме, называются постоянно включенными приложениями .

Постоянный показ приложения влияет на время работы батареи, поэтому учитывайте это при добавлении этой функции в свое приложение.

Настройте свой проект

Для поддержки режима Ambient Mode выполните следующие действия:

  1. Создайте или обновите свой проект на основе конфигураций на странице «Создание и запуск приложения для носимого устройства» .
  2. (Требуется только для Wear OS 4 или ниже) Добавьте разрешение WAKE_LOCK в файл манифеста Android:
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

Включить режим постоянного включения

Начиная с Wear OS 6, приложения с targetSdkVersion , установленным на 36 или выше, всегда включены по умолчанию. Эти приложения остаются видимыми в системном режиме Ambient Mode в течение ограниченного периода времени без какой-либо настройки. Если targetSdkVersion вашего приложения ниже 36 или если ваше приложение должно работать на Wear OS 5 или ниже, используйте класс AmbientLifecycleObserver , чтобы сделать ваше приложение всегда включенным.

Реагируйте на события режима окружения с помощью класса AmbientLifecycleObserver

Приложения также могут использовать класс AmbientLifecycleObserver для прямого реагирования на события режима Ambient:

  1. Реализуйте интерфейс AmbientLifecycleObserver.AmbientLifecycleCallback , как в следующем примере. На этом этапе методы пусты, но далее в руководстве будут предоставлены сведения о том, какие изменения вы должны внести в визуализацию для входа и выхода из режима окружения.

    Котлин

    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, чтобы разрешить постоянное включение поведения на протяжении всего жизненного цикла активности.

    Котлин

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. Удалите наблюдателя, вызвав removeObserver() , когда поведение always-on больше не требуется. Например, вы можете вызвать этот метод в методе onDestroy() вашей активности.

Обновите текст времени с помощью виджета TimeText

Начиная с Wear OS 6, виджет TimeText поддерживает режим окружения. Если вашему приложению нужно обновлять текст времени каждую минуту в режиме окружения, вы можете просто использовать виджет TimeText без использования AmbientLifecycleObserver .

Постоянно работающие приложения могут перейти в фоновый режим

Начиная с Wear OS 5, система переводит постоянно включенные приложения в фоновый режим после того, как они видны в режиме Ambient Mode в течение определенного периода времени. Пользователи могут настроить тайм-аут в системных настройках.

Если ваше постоянное приложение отображает информацию о текущей пользовательской задаче, например, воспроизведении музыки или сеансе тренировки, вам может потребоваться сохранить текущую активность видимой до тех пор, пока задача не завершится. Для этого используйте 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()
)

Измените пользовательский интерфейс в режиме Ambient Mode

По умолчанию при реализации always-on экран не меняет свой внешний вид, когда часы переходят в режим Ambient. Вы можете изменить это поведение, переопределив методы в AmbientLifecycleCallback .

Чтобы сэкономить электроэнергию, выполните следующие действия:

  • Подсвечивайте меньше пикселей. Рассмотрите возможность отображения только важной информации в фоновом режиме и предоставления более подробной информации, когда пользователь переходит в интерактивный режим.
  • Оставьте не менее 85% экрана черным, удалите заливки и используйте контуры для кнопок и крупных значков.
  • Избегайте отображения посторонней информации, такой как нефункциональный брендинг и фоновые изображения.
  • Сохраняйте элементы в одинаковом положении в активном и постоянно включенном режимах и всегда отображайте время.
  • Настройте любой контент для менее частых обновлений. Например, показывать таймеры с точностью до минуты вместо секунды.
  • Удалить или показать пользовательский интерфейс-заполнитель для часто обновляемого буквенно-цифрового содержимого, например расстояния или времени.
  • Удалите индикаторы прогресса, которые часто обновляются, например, для колец обратного отсчета и медиа-сеансов.
  • Если при переходе в режим постоянной активности пользователь ранее находился на экране конфигурации или настроек в вашем приложении, рассмотрите возможность отображения более релевантного экрана в вашем приложении.
  • В объекте AmbientDetails , переданном в onEnterAmbient() :
    • Если установлено deviceHasLowBitAmbient , отключите сглаживание, где это возможно.
    • Если установлено значение burnInProtectionRequired , периодически меняйте визуализацию и избегайте сплошных белых областей.
  • Избегайте запуска непрерывной анимации в режиме окружения. Начиная с Wear OS 5.1, аниматоры могут перестать работать в режиме окружения.

Контрольный список для бесперебойного отображения

Могут быть ситуации, когда вам нужен максимальный контроль над дисплеем, когда устройство переходит через различные состояния, например, когда приложение для тренировок хочет избежать появления циферблата на дисплее во время тренировки. В этих случаях выполните следующие действия:

  1. Реализуйте интерфейс AmbientLifecycleObserver.AmbientLifecycleCallback .
  2. Создайте новый маломощный макет для использования, когда устройство находится в системном режиме окружения.
  3. Во время тренировки выполняйте непрерывную деятельность .

В качестве примера того, как этого можно добиться, ознакомьтесь с примером упражнения на основе компоновки на GitHub, в котором используется компонуемый объект AmbientAware из библиотеки Horologist .