Powiadomienia na Wear OS

Powiadomienia na zegarkach korzystają z tych samych interfejsów API i mają taką samą strukturę jak powiadomienia na telefonach.

Powiadomienia mogą pojawiać się na zegarku na 2 sposoby:

  1. Aplikacja mobilna tworzy powiadomienie, a system automatycznie przekazuje je na zegarek.
  2. Aplikacja na urządzenie do noszenia tworzy powiadomienie.

W obu przypadkach do tworzenia powiadomień używaj klasy NotificationCompat.Builder. Gdy tworzysz powiadomienia za pomocą klasy konstruktora, system dba o ich prawidłowe wyświetlanie. Na przykład, gdy wysyłasz powiadomienie z aplikacji mobilnej, każde powiadomienie pojawia się jako karta w strumieniu powiadomień.

Aby zobaczyć, jak wyświetlają się powiadomienia, zapoznaj się z tym przykładem.

Karty powiadomień na zegarku.
Rysunek 1. To samo powiadomienie wyświetlane na telefonie i zegarku.

Aby uzyskać najlepsze wyniki, użyj jednej z NotificationCompat.Style podklas.

Uwaga: Użycie RemoteViews powoduje usunięcie niestandardowych układów powiadomień, a urządzenie do noszenia wyświetla tylko tekst i ikony.

Uwaga: Powiadomienia z intencją pełnoekranową (setFullScreenIntent()) i uprawnienie USE_FULL_SCREEN_INTENT nie są obsługiwane w Wear OS.

Zalecane powiadomienia na urządzenia do noszenia

Jako punkt wyjścia dla wszystkich powiadomień używaj powiadomień rozwijanych, ponieważ są one świetnym sposobem na zaangażowanie użytkowników urządzeń do noszenia. W stanie zwiniętym powiadomienie wyświetla się w panelu powiadomień przez krótki czas, co pozwala na szybkie sprawdzenie jego treści. Gdy użytkownik kliknie powiadomienie, rozwinie się ono, wyświetlając dodatkowe treści i działania, które można przewijać.

Możesz utworzyć powiadomienie rozwijane w taki sam sposób jak na urządzeniu mobilnym, używając dowolnej NotificationCompat.Style podklasy. Na przykład standardowe powiadomienie korzystające z NotificationCompat.MessagingStyle wygląda tak:

Rozwijane powiadomienie w stylu MessagingStyle na zegarku
Rysunek 2. Przykład powiadomienia MessagingStyle w Wear OS.

Widzisz, że powiadomienie ma kilka działań ułożonych w stos na dole rozwiniętego stanu.

Wskazówka: jeśli powiadomienia zawierają działanie „Odpowiedz”, np. w przypadku aplikacji do obsługi wiadomości, możesz poprawić ich działanie. Możesz na przykład włączyć głosowe wprowadzanie tekstu bezpośrednio z urządzenia do noszenia lub wstępnie zdefiniowane odpowiedzi tekstowe za pomocą setChoices(). Więcej informacji znajdziesz w artykule Dodawanie przycisku odpowiedzi.

Unikanie duplikatów powiadomień

Domyślnie powiadomienia są udostępniane z powiązany telefon na wszystkie sparowane zegarki. To świetna opcja, jeśli nie masz zainstalowanej aplikacji na urządzenie do noszenia.

Jeśli jednak utworzysz samodzielną aplikację na zegarek i aplikację towarzyszącą na telefon, aplikacje będą tworzyć duplikaty powiadomień.

Wear OS umożliwia zatrzymanie duplikatów powiadomień za pomocą interfejsów API do udostępniania powiadomień. Jest to szczególnie ważne w przypadku aplikacji na urządzeniach z Wear OS 5 lub nowszym, ponieważ niektóre powiadomienia, które można odrzucić na urządzeniu mobilnym, nie można odrzucić na urządzeniu z Wear OS. Więcej informacji znajdziesz w artykule Opcje przekazywania powiadomień.

Dodawanie do powiadomienia funkcji specyficznych dla urządzeń do noszenia

Jeśli chcesz dodać do powiadomienia funkcje specyficzne dla urządzeń do noszenia, możesz użyć klasy NotificationCompat.WearableExtender, aby określić opcje. Aby użyć tego interfejsu API:

Uwaga: Jeśli używasz NotificationManager z frameworka, niektóre funkcje z NotificationCompat.WearableExtender nie działają, więc używaj NotificationCompat.

Ten przykład pokazuje, jak ustawić działanie specyficzne dla Wear w powiadomieniu, a także jak ustawić identyfikator odrzucenia. Gdy powiadomienie zostanie odrzucone, wszystkie inne powiadomienia z tym samym identyfikatorem odrzucenia zostaną odrzucone na zegarku i na powiązanym telefonie. Aby pobrać identyfikator odrzucenia, użyj 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()

Uruchamianie aplikacji na telefonie z urządzenia do noszenia

Jeśli używasz przekazywanych powiadomień, każde powiadomienie automatycznie zawiera przycisk uruchamiający aplikację na telefonie. Jeśli jednak używasz powiadomienia lokalnego utworzonego na zegarku, użyj tych czynności, aby utworzyć przycisk uruchamiający aplikację na telefonie:

  1. Utwórz nowy Activity, który rozszerza ConfirmationActivity.
  2. Użyj RemoteActivityHelper w nowej Activity, aby uruchomić aplikację na telefonie.
  3. Podczas tworzenia Intent do uruchomienia Activity z powiadomienia ustaw dodatkowy parametr EXTRA_ANIMATION_TYPE na OPEN_ON_PHONE_ANIMATION.

To podejście kieruje użytkownika do interakcji na telefonie i jest zgodne z wymaganiami platformy dotyczącymi uruchamiania procesów w tle.

Uwaga: nie możesz używać BroadcastReceiver jako celu działania powiadomienia.