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

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

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

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

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

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

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

Включить режим «всегда включен»

Чтобы использовать класс AmbientLifecycleObserver , выполните следующие действия:

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

    Котлин

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

Постоянно включенные приложения могут переходить в фоновый режим

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

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

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