Laufende Aktivität

Koppeln einer laufenden Aktivität mit einer laufenden Benachrichtigung in Wear OS werden die Benachrichtigungen auf weiteren Oberflächen der Wear OS-Benutzeroberfläche hinzugefügt. So können Nutzer länger andauernde Aktivitäten weiter nutzen.

Laufende Benachrichtigungen werden in der Regel verwendet, um anzuzeigen, dass eine Benachrichtigung ein Hintergrundaufgabe, mit der der Nutzer aktiv interagiert oder die irgendwie anstehen. und somit auf dem Gerät.

Ein Wear OS-Nutzer könnte beispielsweise mit einer Workout-App einen Lauf von einem und verlassen Sie diese App, um eine andere Aufgabe zu starten. Wenn Nutzende die Trainings-App verlassen, wird zu einer fortlaufenden Benachrichtigung gewechselt, die mit einigen Aufgaben im Hintergrund verbunden ist, um den Nutzer über seine Ausführung auf dem Laufenden zu halten. Die Benachrichtigung bietet dem Nutzer aktuelle Informationen und eine einfache Möglichkeit, wieder auf das Symbol

Um die Benachrichtigung zu sehen, muss der Nutzer jedoch Benachrichtigungsleiste unter dem Zifferblatt und finden Sie die richtige Benachrichtigung. Dieses ist nicht so praktisch wie auf anderen Oberflächen.

Mit der Ongoing Activity API kann die fortlaufende Benachrichtigung einer App Informationen auf verschiedenen neuen, praktischen Wear OS-Oberflächen bereitzustellen, und Interaktionen fördern.

In dieser Workout-App können die Informationen beispielsweise auf der Smartwatch des Nutzers angezeigt werden. Gesicht als antippbares Laufsymbol:

Laufsymbol

Abbildung 1: Aktivitätsanzeige.

Im Abschnitt Recents des globalen App Launchers werden auch alle aktuellen Aktivitäten:

launcher

Abbildung 2: Globaler Launcher

In den folgenden Situationen eignet sich eine fortlaufende Benachrichtigung, die mit einer laufende Aktivität:

Timer

Abbildung 3: Timer: Zählt aktiv den Countdown und endet, wenn der Timer abgelaufen ist pausiert oder gestoppt.

Karte

Abbildung 4: Detaillierte Routenführung: Kündigt die Route zu einem Ziel an. Sie endet, wenn der Nutzer das Ziel erreicht oder die Navigation beendet.

Musik

Abbildung 5: Medien: Spielt während einer Sitzung Musik ab. Endet sofort nach dem Der Nutzer pausiert die Sitzung.

Wear erstellt automatisch laufende Aktivitäten für Medien-Apps.

Im Codelab zu laufenden Aktivitäten finden Sie Beispiel für die Erstellung fortlaufender Aktivitäten für andere Arten von Apps.

Einrichten

Fügen Sie Folgendes hinzu, um die Ongoing Activity API in Ihrer App zu verwenden zur Datei build.gradle Ihrer Anwendung hinzufügen:

dependencies {
  implementation "androidx.wear:wear-ongoing:1.0.0"
  // Includes LocusIdCompat and new Notification categories for Ongoing Activity.
  implementation "androidx.core:core:1.6.0"
}

Laufende Aktivität starten

Erstellen Sie zuerst eine fortlaufende Benachrichtigung und dann eine laufende Aktivität.

Aktive Benachrichtigung erstellen

Eine laufende Aktivität ist eng mit einer laufenden Benachrichtigung verbunden. Sie arbeiten zusammen, um Nutzende über eine Aufgabe zu informieren, mit der sie aktiv involviert sind. oder einer Aufgabe, die noch auf dem Gerät steht.

Du musst eine laufende Aktivität mit einer laufenden Benachrichtigung koppeln. Das Verknüpfen deiner laufenden Aktivitäten mit einer Benachrichtigung hat viele Vorteile. einschließlich der folgenden:

  • Benachrichtigungen sind das Fallback auf Geräten, die keine fortlaufenden Aktivitäten. Die Benachrichtigung ist die einzige Oberfläche, die in deiner App angezeigt wird während sie im Hintergrund läuft.
  • Ab Android 11 blendet Wear OS die Benachrichtigung in der Benachrichtigung aus , wenn die App als laufende Aktivität auf zusätzlichen Oberflächen angezeigt wird.
  • Die aktuelle Implementierung verwendet den Notification selbst als den Kommunikationsmechanismus.

Erstellen Sie eine fortlaufende Benachrichtigung mit Notification.Builder.setOngoing zurückgegeben wird.

Laufende Aktivität starten

Sobald Sie eine fortlaufende Benachrichtigung haben, erstellen Sie wie hier gezeigt eine laufende Aktivität. im folgenden Beispiel. Sehen Sie sich die enthaltenen Kommentare an, um das Verhalten der einzelnen Unterkünfte zu verstehen.

Kotlin

var notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
      
      .setSmallIcon(..)
      .setOngoing(true)

val ongoingActivityStatus = Status.Builder()
    // Sets the text used across various surfaces.
    .addTemplate(mainText)
    .build()

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
        // Sets the animated icon that will appear on the watch face in
        // active mode.
        // If it isn't set, the watch face will use the static icon in
        // active mode.
        .setAnimatedIcon(R.drawable.ic_walk)
        // Sets the icon that will appear on the watch face in ambient mode.
        // Falls back to Notification's smallIcon if not set.
        // If neither is set, an Exception is thrown.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap/touch event so users can re-enter your app from the
        // other surfaces.
        // Falls back to Notification's contentIntent if not set.
        // If neither is set, an Exception is thrown.
        .setTouchIntent(activityPendingIntent)
        // Here, sets the text used for the Ongoing Activity (more
        // options are available for timers and stopwatches).
        .setStatus(ongoingActivityStatus)
        .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(NOTIFICATION_ID, builder.build())

Java

NotificationCompat.Builder notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
      
      .setSmallIcon(..)
      .setOngoing(true);

OngoingActivityStatus ongoingActivityStatus = OngoingActivityStatus.Builder()
    // Sets the text used across various surfaces.
    .addTemplate(mainText)
    .build();

OngoingActivity ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
        // Sets the animated icon that will appear on the watch face in
        // active mode.
        // If it isn't set, the watch face will use the static icon in
        // active mode.
        .setAnimatedIcon(R.drawable.ic_walk)
        // Sets the icon that will appear on the watch face in ambient mode.
        // Falls back to Notification's smallIcon if not set.
        // If neither is set, an Exception is thrown.
        .setStaticIcon(R.drawable.ic_walk)
        // Sets the tap/touch event so users can re-enter your app from the
        // other surfaces.
        // Falls back to Notification's contentIntent if not set.
        // If neither is set, an Exception is thrown.
        .setTouchIntent(activityPendingIntent)
        // Here, sets the text used for the Ongoing Activity (more
        // options are available for timers and stopwatches).
        .setStatus(ongoingActivityStatus)
        .build();

ongoingActivity.apply(applicationContext);

notificationManager.notify(NOTIFICATION_ID, builder.build());

Die folgenden Schritte heben den wichtigsten Teil des vorherigen Beispiels hervor:

  1. Rufen Sie .setOngoing(true) im NotificationCompat.Builder und legen Sie beliebige optionale .

  2. Erstellen Sie eine OngoingActivityStatus oder eine andere Statusoption, die im folgenden Abschnitt beschrieben werden, und stellen den Text dar.

  3. Erstelle eine OngoingActivity und lege eine Benachrichtigungs-ID fest.

  4. Rufen Sie apply() für OngoingActivity mit dem Kontext auf.

  5. notificationManager.notify() anrufen und dieselbe Benachrichtigung übergeben ID, die in der laufenden Aktivität festgelegt wird, um sie zu verknüpfen.

Status

Sie verwenden die Status um den aktuellen Live-Status der OngoingActivity für den Nutzer auf neuen Oberflächen wie Zuletzt verwendet im Launcher. Verwenden Sie zur Nutzung der Funktion die Status.Builder abgeleitete Klasse.

In den meisten Fällen müssen Sie nur Vorlage hinzufügen für den Text, der im Bereich Letzte Aufrufe des App Launchers angezeigt werden soll.

Sie können dann anpassen, wie Text mit spans mit der Methode addTemplate() und Dabei werden alle dynamischen Teile des Textes Status.Part

Das folgende Beispiel zeigt, wie das Wort „Uhrzeit“ werden rot angezeigt. Die Beispiel verwendet eine Status.StopwatchPart , um im Bereich Letzte des App Launchers eine Stoppuhr darzustellen.

Kotlin

val htmlStatus =
        "<p>The <font color=\"red\">time</font> on your current #type# is #time#.</p>"

val statusTemplate =
        Html.fromHtml(
                htmlStatus,
                Html.FROM_HTML_MODE_COMPACT
        )

// Creates a 5 minute timer.
// Note the use of SystemClock.elapsedRealtime(), not System.currentTimeMillis().
val runStartTime = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(5)

val status = new Status.Builder()
   .addTemplate(statusTemplate)
   .addPart("type", Status.TextPart("run"))
   .addPart("time", Status.StopwatchPart(runStartTime)
   .build()

Java

String htmlStatus =
        "<p>The <font color=\"red\">time</font> on your current #type# is #time#.</p>";

Spanned statusTemplate =
        Html.fromHtml(
                htmlStatus,
                Html.FROM_HTML_MODE_COMPACT
        );

// Creates a 5 minute timer.
// Note the use of SystemClock.elapsedRealtime(), not System.currentTimeMillis().
Long runStartTime = SystemClock.elapsedRealtime() + TimeUnit.MINUTES.toMillis(5);

Status status = new Status.Builder()
   .addTemplate(statusTemplate)
   .addPart("type", new Status.TextPart("run"))
   .addPart("time", new Status.StopwatchPart(runStartTime)
   .build();

Wenn Sie auf einen Teil in der Vorlage verweisen möchten, verwenden Sie den von # umgebenen Namen. Um # in der Ausgabe zu erzeugen, verwenden Sie ## in der Vorlage.

Im vorherigen Beispiel werden HTMLCompat eine CharSequence zu generieren, die an die Vorlage übergeben wird. Das ist einfacher als das manuelle Definieren eines Spannable-Objekts.

Zusätzliche Anpassungen

Über Status kannst du deine laufenden Aktivitäten anpassen oder wie Sie Benachrichtigungen erhalten. Diese Anpassungen sind jedoch nicht unbedingt je nach Implementierung durch den OEM.

Laufende Benachrichtigung

  • Die festgelegte Kategorie bestimmt die Priorität der laufenden Aktivität.
    • CATEGORY_CALL:ein eingehender Sprach- oder Videoanruf oder eine ähnliche synchrone Kommunikationsanfrage
    • CATEGORY_NAVIGATION:Karte oder detaillierte Routenführung
    • CATEGORY_TRANSPORT:Medientransport für die Wiedergabe
    • CATEGORY_ALARM:Wecker oder Timer
    • CATEGORY_WORKOUT:ein Training (neue Kategorie)
    • CATEGORY_LOCATION_SHARING:temporäre Standortfreigabe (neue Kategorie)
    • CATEGORY_STOPWATCH:Stoppuhr (neue Kategorie)

Laufende Aktivität

  • Animiertes Symbol: ein Schwarz-Weiß-Vektor, vorzugsweise mit einem transparenten Hintergrund. Wird im Aktivmodus auf dem Zifferblatt angezeigt. Wenn das animierte Symbol nicht wird das Standard-Benachrichtigungssymbol verwendet. (Das Standard-Benachrichtigungssymbol ist bei jeder Anwendung anders.)

  • Statisches Symbol:Vektorsymbol mit transparentem Hintergrund. Wird auf dem Zifferblatt im Inaktivmodus. Wenn das animierte Symbol nicht festgelegt ist, erscheint das statische Symbol wird im Aktivmodus auf dem Zifferblatt verwendet. Wird keine Angabe gemacht, Benachrichtigungssymbol verwendet. Ist keiner der beiden Werte festgelegt, geworfen werden. Im App Launcher wird weiterhin das App-Symbol verwendet.

  • OngoingActivityStatus:Nur Text oder Chronometer Wird in den Letzte des App Launchers. Falls nicht, wird die Benachrichtigung Kontexttext wird verwendet.

  • Touch-Intent: Ein PendingIntent, mit dem zurück zur App gewechselt wird, wenn der der Nutzer auf das Symbol für laufende Aktivität tippt. Anzeigen auf dem Zifferblatt oder auf der Launcher-Element. Er kann sich vom ursprünglichen Intent unterscheiden, der für um die App zu starten. Wenn nicht angegeben, hat der Inhalt der Benachrichtigung verwendet. Wenn keiner der beiden Parameter festgelegt ist, wird eine Ausnahme ausgelöst.

  • LocusId: ID, die dem Ereignis Launcher-Verknüpfung, der die aktuelle Aktivität entspricht. Wird auf dem im Bereich „Letzte“ angezeigt werden, während die Aktivität läuft. Falls nicht werden im Launcher alle App-Elemente im Abschnitt Recents (Letzte) Paket und zeigt nur die aktuelle Aktivität an.

  • ID der laufenden Aktivität:ID, die zur Unterscheidung von Aufrufen an fromExistingOngoingActivity(), wenn für eine App mehrere laufende Aufgaben vorhanden sind Aktivitäten.

Laufende Aktivität aktualisieren

In den meisten Fällen erstellen Entwickler eine neue fortlaufende Benachrichtigung und eine neue wenn sie die Daten auf dem Bildschirm aktualisieren müssen. Die Die Ongoing Activity API bietet auch Hilfsmethoden zum Aktualisieren eines OngoingActivity, wenn Sie eine Instanz beibehalten möchten, anstatt sie neu zu erstellen.

Wenn die App im Hintergrund ausgeführt wird, kann sie Aktualisierungen an den Activity API Sie sollten dies jedoch nicht zu oft tun, da die Aktualisierungsmethode Anrufe, die zu nah beieinander liegen, werden ignoriert. Einige Aktualisierungen pro Minute vernünftigerweise.

Um die laufende Aktivität und die gepostete Benachrichtigung zu aktualisieren, verwenden Sie das Objekt, und update() aufrufen, wie im folgenden Beispiel gezeigt:

Kotlin

ongoingActivity.update(context, newStatus)

Java

ongoingActivity.update(context, newStatus);

Der Einfachheit halber gibt es eine statische Methode zum Erstellen einer fortlaufenden Aktivität.

Kotlin

OngoingActivity.recoverOngoingActivity(context)
               .update(context, newStatus)

Java

OngoingActivity.recoverOngoingActivity(context)
               .update(context, newStatus);

Laufende Aktivität beenden

Wenn die Ausführung der App als laufende Aktivität beendet ist, muss sie nur abgebrochen werden der laufenden Benachrichtigung.

Du kannst die Benachrichtigung oder die laufende Aktivität auch abbrechen. wenn es im Vordergrund auftritt, und reproduzieren Sie sie, wenn Sie Hintergrund, aber das ist nicht erforderlich.

Laufende Aktivität pausieren

Wenn deine App eine explizite Stopp-Aktion beinhaltet, setze die laufende Aktivität nach wird die Pausierung aufgehoben. Bei Apps ohne explizite Stoppaktion die Aktivität beenden, wenn sie pausiert ist.

Best Practices

Beachten Sie Folgendes, wenn Sie mit der Ongoing Activity API arbeiten:

  • ongoingActivity.apply(context) vor dem Anruf anrufen notificationManager.notify(...).
  • Legen Sie ein statisches Symbol für Ihre laufende Aktivität fest, entweder explizit oder als Fallback über die Benachrichtigung. Andernfalls erhalten Sie ein IllegalArgumentException.

  • Verwenden Sie schwarz-weiße Vektorsymbole mit transparentem Hintergrund.

  • Lege einen Touch Intent für deine laufende Aktivität fest, entweder explizit oder als Fallback mit der Methode Benachrichtigung. Andernfalls erhalten Sie ein IllegalArgumentException.

  • Verwenden Sie für NotificationCompat die Core AndroidX-Bibliothek. core:1.5.0-alpha05+, einschließlich der LocusIdCompat und das neue Kategorien für „Training“, die Stoppuhr und die Standortfreigabe.

  • Wenn für deine App mehr als eine MAIN LAUNCHER-Aktivität deklariert ist veröffentlichen Sie ein dynamisches Tastenkombination und es mit deinen laufenden Aktivitäten mit LocusId verknüpfen.

Medienbenachrichtigungen bei der Wiedergabe von Medien auf Wear OS-Geräten veröffentlichen

Wenn Medieninhalte auf einem Wear OS-Gerät wiedergegeben werden, veröffentlichen Sie eine Medienbenachrichtigung. So kann das System die entsprechende laufende Aktivität erstellen.

Wenn Sie Media3 verwenden, wird die Benachrichtigung automatisch veröffentlicht. Wenn Sie die Benachrichtigung manuell erstellt wird, MediaStyleNotificationHelper.MediaStyle, und die entsprechende MediaSession sollte ihre Sitzungsaktivität ausgefüllt.