Уведомления на часах Wear OS

Уведомления на часах используют те же API и имеют ту же структуру, что и уведомления на телефонах.

Уведомления могут появляться на часах двумя способами:

  1. Мобильное приложение создает уведомление, и система автоматически передает его на часы.
  2. Приложение для носимых устройств создает уведомление.

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

Ниже приведен пример того, как выглядят уведомления.

Карточки уведомлений на часах.
Рисунок 1. Одно и то же уведомление на телефоне и часах.

Для достижения наилучших результатов используйте один из подклассов NotificationCompat.Style.

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

Примечание. Уведомления с полноэкранными интентами (setFullScreenIntent()) и разрешение USE_FULL_SCREEN_INTENT не поддерживаются в Wear OS.

Рекомендуемые уведомления для носимых устройств

Используйте разворачиваемые уведомления в качестве основы для всех уведомлений, поскольку они отлично подходят для взаимодействия с пользователями носимых устройств. В свернутом виде уведомление показывается в панели уведомлений, чтобы пользователь мог быстро его просмотреть. Если пользователь нажмет на него, уведомление развернется и откроется дополнительный контент и действия.

Вы можете создать разворачиваемое уведомление так же, как на мобильном устройстве, используя любой из подклассов NotificationCompat.Style. Например, стандартное уведомление с использованием тега NotificationCompat.MessagingStyle выглядит так:

Разворачиваемое уведомление MessagingStyle на часах
Рисунок 2. Пример уведомления MessagingStyle на устройстве Wear OS.

Внизу уведомления в развернутом виде можно увидеть несколько действий.

Совет. Если в уведомлении есть действие "Ответить", например в приложении для обмена сообщениями, вы можете улучшить его поведение. Например, вы можете включить голосовой ввод ответов прямо на носимом устройстве или использовать заранее заданные текстовые ответы с помощью setChoices(). Подробнее о том, как добавить кнопку ответа…

Как избежать дублирования уведомлений

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

Однако если вы создадите отдельное приложение для часов и сопутствующее приложение для телефона, то будете получать дублирующиеся уведомления.

В Wear OS есть API, которые позволяют предотвратить дублирование уведомлений. Это особенно важно для приложений на устройствах с Wear OS 5 или более поздней версии, поскольку некоторые уведомления, которые можно закрыть на мобильном устройстве, нельзя закрыть на устройстве Wear OS. Подробнее о вариантах передачи уведомлений…

Как добавить в уведомление функции для носимых устройств

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

Примечание. Если вы используете фреймворк NotificationManager, некоторые функции из NotificationCompat.WearableExtender не будут работать. Поэтому используйте NotificationCompat.

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

// This intent will be fired as a result of the user clicking the "Open on watch" action.
// However, it executes on the phone, not on the watch. Typically, the Activity should then use
// RemoteActivityHelper to then launch the correct activity on the watch.
val intent = Intent(context, LaunchOnWearActivity::class.java)
val wearPendingIntent = PendingIntent.getActivity(
    context,
    wearRequestCode,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

val openOnWatchAction = NotificationCompat.Action.Builder(
    R.drawable.watch,
    "Open on watch",
    wearPendingIntent
)
    .build()

val wearableExtender = NotificationCompat.WearableExtender()
    // This action will only be shown on the watch, not on the phone.
    // Actions added to the Notification builder directly will not be shown on the watch,
    // because one or more actions are defined in the WearableExtender.
    .addAction(openOnWatchAction)
    // This synchronizes dismissals between watch and phone.
    .setDismissalId(chatId)

val notification = NotificationCompat.Builder(context, channelId)
    // ... set other fields ...
    .extend(wearableExtender)
    .build()

Как запустить приложение "Телефон" на носимом устройстве

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

  1. Создайте новый Activity, который расширяет ConfirmationActivity.
  2. Используйте RemoteActivityHelper в новом приложении Activity, чтобы запустить приложение "Телефон".
  3. При создании Intent для запуска Activity из уведомления задайте для параметра EXTRA_ANIMATION_TYPE значение OPEN_ON_PHONE_ANIMATION.

Этот подход позволяет пользователю взаимодействовать с телефоном и соответствует требованиям платформы к запуску фоновых процессов.

Примечание. В качестве цели действия уведомления нельзя использовать BroadcastReceiver.