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:
Abbildung 1: Aktivitätsanzeige.
Im Abschnitt Recents des globalen App Launchers werden auch alle aktuellen Aktivitäten:
Abbildung 2: Globaler Launcher
In den folgenden Situationen eignet sich eine fortlaufende Benachrichtigung, die mit einer laufende Aktivität:
Abbildung 3: Timer: Zählt aktiv den Countdown und endet, wenn der Timer abgelaufen ist pausiert oder gestoppt.
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.
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:
Rufen Sie
.setOngoing(true)
imNotificationCompat.Builder
und legen Sie beliebige optionale .Erstellen Sie eine
OngoingActivityStatus
oder eine andere Statusoption, die im folgenden Abschnitt beschrieben werden, und stellen den Text dar.Erstelle eine
OngoingActivity
und lege eine Benachrichtigungs-ID fest.Rufen Sie
apply()
fürOngoingActivity
mit dem Kontext auf.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 KommunikationsanfrageCATEGORY_NAVIGATION
:Karte oder detaillierte RoutenführungCATEGORY_TRANSPORT
:Medientransport für die WiedergabeCATEGORY_ALARM
:Wecker oder TimerCATEGORY_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 anrufennotificationManager.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 derLocusIdCompat
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 mitLocusId
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.
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Benachrichtigung erstellen {:#notification}
- Neue Möglichkeiten zur Interaktion mit Wear OS-Nutzern mit der Ongoing Activity API
- Erweiterbare Benachrichtigung erstellen {:#expandable-notification}