Regelmäßige Updates in Kacheln anzeigen

Erstellen Sie Kacheln mit Inhalten, die sich im Laufe der Zeit ändern.

Mit Zeitplänen arbeiten

Eine Zeitachse besteht aus einem oder mehreren TimelineEntry -Instanzen enthalten, von denen jede ein Layout enthält, das während einer bestimmten Zeitintervall. Alle Kacheln benötigen eine Zeitachse.

Diagramm der Kachelzeitachse

Kacheln mit einem einzelnen Eintrag

Häufig kann eine Kachel mit einer einzelnen TimelineEntry beschrieben werden. Das Layout ist und nur die Informationen im Layout ändern sich. Zum Beispiel kann eine Kachel der deine Fitnessfortschritte des Tages anzeigt, zeigt immer den gleichen Fortschritt an. Layout ändern, auch wenn Sie dieses Layout anpassen können, um andere Werte anzuzeigen. In diesen wissen Sie im Voraus nicht, wann sich der Inhalt ändern wird.

Hier ein Beispiel für eine Kachel mit einem einzelnen TimelineEntry:

Kotlin

override fun onTileRequest(
    requestParams: TileRequest
): ListenableFuture<Tile> {
    val tile = Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)

        // We add a single timeline entry when our layout is fixed, and
        // we don't know in advance when its contents might change.
        .setTileTimeline(
            Timeline.fromLayoutElement(...)
        ).build()
    return Futures.immediateFuture(tile)
}

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
   Tile tile = new Tile.Builder()
       .setResourcesVersion(RESOURCES_VERSION)
       
       // We add a single timeline entry when our layout is fixed, and
       // we don't know in advance when its contents might change.
       .setTileTimeline(
            Timeline.fromLayoutElement(...)
       ).build();
   return Futures.immediateFuture(tile);
}

Zeitgebundene Zeitachseneinträge

Ein TimelineEntry kann optional einen Gültigkeitszeitraum definieren, sodass eine Kachel das Layout zu einem bekannten Zeitpunkt ändern, ohne dass die App eine neue Kachel bereitstellen muss.

Das kanonische Beispiel ist eine Agendakachel, deren Zeitachse eine Liste von anstehende Termine. Jedes bevorstehende Ereignis enthält einen Gültigkeitszeitraum, um sie anzuzeigen.

Die Tile API ermöglicht sich überschneidende Gültigkeitszeiträume, wobei der Bildschirm mit der kürzeste Zeitdauer wird angezeigt. Es wird jeweils nur ein Ereignis .

Entwickler können einen Standard-Fallback-Eintrag angeben. Zum Beispiel kann die Kachel „Agenda“ eine Kachel mit einem unendlichen Gültigkeitszeitraum haben, die verwendet wird, Zeitachseneintrag gültig ist, wie im folgenden Codebeispiel gezeigt:

Kotlin

public override fun onTileRequest(
    requestParams: TileRequest
): ListenableFuture<Tile> {
    val timeline = Timeline.Builder()

    // Add fallback "no meetings" entry
    // Use the version of TimelineEntry that's in androidx.wear.protolayout.
    timeline.addTimelineEntry(TimelineEntry.Builder()
        .setLayout(getNoMeetingsLayout())
        .build()
    )

    // Retrieve a list of scheduled meetings
    val meetings = MeetingsRepo.getMeetings()
    // Add a timeline entry for each meeting
    meetings.forEach { meeting ->
        timeline.addTimelineEntry(TimelineEntry.Builder()
            .setLayout(getMeetingLayout(meeting))
            .setValidity(
                // The tile should disappear when the meeting begins
                // Use the version of TimeInterval that's in
                // androidx.wear.protolayout.
                TimeInterval.Builder()
                    .setEndMillis(meeting.dateTimeMillis).build()
            ).build()
        )
    }

    val tile = Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setTileTimeline(timeline.build())
        .build()
    return Futures.immediateFuture(tile)
}

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull RequestBuilders.TileRequest requestParams
) {
   Timeline.Builder timeline = new Timeline.Builder();
   // Add fallback "no meetings" entry
   // Use the version of TimelineEntry that's in androidx.wear.protolayout.
   timeline.addTimelineEntry(new TimelineEntry.Builder().setLayout(getNoMeetingsLayout()).build());
   // Retrieve a list of scheduled meetings
   List<Meeting> meetings = MeetingsRepo.getMeetings();
   // Add a timeline entry for each meeting
   for(Meeting meeting : meetings) {
        timeline.addTimelineEntry(new TimelineEntry.Builder()
            .setLayout(getMeetingLayout(meeting))
            .setValidity(
                // The tile should disappear when the meeting begins
                // Use the version of TimeInterval that's in
                // androidx.wear.protolayout.
                new TimeInterval.builder()
                    .setEndMillis(meeting.getDateTimeMillis()).build()
            ).build()
        );
    }

    Tile tile = new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setTileTimeline(timeline.build())
        .build();
    return Futures.immediateFuture(tile);
}

Kachel aktualisieren

Die in einer Kachel angezeigten Informationen laufen möglicherweise nach einiger Zeit ab. Zum Beispiel wird die Wettervorhersage Kachel, die die gleiche Temperatur den ganzen Tag über anzeigt, ist ungenau.

Wenn Sie ablaufende Daten verarbeiten möchten, legen Sie beim Erstellen eines tile, der angibt, wie lange die Tile gültig ist. Im Beispiel des Wetters können Sie deren Inhalt stündlich aktualisieren, wie im folgenden Code dargestellt: Beispiel:

Kotlin

override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
    Futures.immediateFuture(Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTileTimeline(Timeline.fromLayoutElement(
            getWeatherLayout())
        ).build()
    )

Java

@Override
protected ListenableFuture<Tile> onTileRequest(
       @NonNull TileRequest requestParams
) {
    return Futures.immediateFuture(new Tile.Builder()
        .setResourcesVersion(RESOURCES_VERSION)
        .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes
        .setTimeline(Timeline.fromLayoutElement(
            getWeatherLayout())
        ).build());
}

Wenn Sie ein Aktualisierungsintervall festlegen, ruft das System onTileRequest() kurz nach Ende des Intervalls. Wenn Sie kein Aktualitätsintervall festlegen, Das System ruft onTileRequest() nicht auf.

Eine Tile kann auch aufgrund eines externen Ereignisses ablaufen. Zum Beispiel könnten Nutzende entfernten Termin aus ihrem Kalender. Wurde die Kachel nicht aktualisiert, zeigt die gelöschte Besprechung immer noch an. Fordern Sie in diesem Fall eine Aktualisierung von an einer beliebigen Stelle in Ihrem Anwendungscode, wie im folgenden Codebeispiel gezeigt:

Kotlin

fun eventDeletedCallback() {
     TileService.getUpdater(context)
             .requestUpdate(MyTileService::class.java)
}

Java

public void eventDeletedCallback() {
   TileService.getUpdater(context)
           .requestUpdate(MyTileService.class);
}

Aktualisierungsworkflow auswählen

Orientieren Sie sich an diesen Best Practices, um festzulegen, wie Sie Ihre Kachel-Updates konfigurieren:

  • Wenn das Update vorhersehbar ist, zum Beispiel, wenn es für das nächste Ereignis in des Nutzers – verwenden Sie eine Zeitachse.
  • Verwenden Sie beim Abrufen von Plattformdaten die Datenbindung, damit das System aktualisiert wird die Daten automatisch abrufen.
  • Wenn das Update in kurzer Zeit auf dem Gerät berechnet werden kann, z. B. wie zum Aktualisieren der Position eines Bildes auf einer Sonnenaufgangskachel. Verwenden Sie onTileRequest()

    Dies ist besonders nützlich, wenn Sie alle Bilder vor der . Wenn Sie später ein neues Bild generieren müssen, rufen Sie setFreshnessIntervalMillis()

  • Wenn Sie wiederholt intensivere Hintergrundarbeiten ausführen, z. B. Abfragen für Wetterdaten verwenden Sie WorkManager und senden Sie Updates an Ihre Kachel.

  • Wenn das Update als Reaktion auf ein externes Ereignis wie das Licht Zum Aktivieren, Empfangen einer E-Mail oder zum Aktualisieren einer Notiz – senden Sie eine Firebase Cloud Messaging (FCM), um Ihre App wieder zu aktivieren, und senden Sie dann Updates. hinzugefügt werden.

  • Wenn das Synchronisieren der Kacheldaten kostspielig sein könnte, gehen Sie so vor:

    1. Datensynchronisierung planen
    2. Starte einen Timer für 1 bis 2 Sekunden.
    3. Wenn Sie vor Ablauf der Zeit ein Update von einer Remote-Datenquelle erhalten, um den aktualisierten Wert aus der Datensynchronisierung anzuzeigen. Andernfalls wird ein im Cache gespeichertes lokalen Wert.