แสดงการอัปเดตเป็นระยะในการ์ด

สร้างไทล์ที่มีเนื้อหาเปลี่ยนแปลงไปตามเวลา

ทำงานกับไทม์ไลน์

ไทม์ไลน์ประกอบด้วยอินสแตนซ์อย่างน้อย 1 รายการ TimelineEntry โดยแต่ละรายการจะมีเลย์เอาต์ที่แสดงในช่วงเวลาที่เฉพาะเจาะจง ไทล์ทั้งหมดต้องมีไทม์ไลน์

แผนภาพไทม์ไลน์ของการ์ด

ไทล์รายการเดียว

โดยส่วนใหญ่แล้ว ไทล์สามารถอธิบายได้ด้วย TimelineEntry รายการเดียว เลย์เอาต์จะคงที่และมีเพียงข้อมูลภายในเลย์เอาต์เท่านั้นที่จะเปลี่ยนแปลง ตัวอย่างเช่น ไทล์ที่แสดงความคืบหน้าด้านฟิตเนสของวันจะแสดงเลย์เอาต์ความคืบหน้าแบบเดียวกันเสมอ แม้ว่าคุณอาจปรับเลย์เอาต์นั้นเพื่อแสดงค่าต่างๆ ในกรณีเหล่านี้ คุณจะไม่ทราบล่วงหน้าว่าเนื้อหาอาจเปลี่ยนแปลงเมื่อใด

ดูตัวอย่างไทล์ที่มี TimelineEntry รายการเดียวได้ที่นี่

override fun onTileRequest(
    requestParams: RequestBuilders.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(simpleLayout(this)))
            .build()
    return Futures.immediateFuture(tile)
}

รายการไทม์ไลน์ที่จำกัดเวลา

TimelineEntry สามารถกำหนดระยะเวลาที่มีผลได้ ซึ่งจะช่วยให้ไทล์เปลี่ยนเลย์เอาต์ได้ในเวลาที่ทราบโดยไม่ต้องให้แอปพุชไทล์ใหม่

ตัวอย่างที่ชัดเจนคือไทล์กำหนดการที่มีไทม์ไลน์ซึ่งมีรายการกิจกรรมที่กำลังจะเกิดขึ้น กิจกรรมที่กำลังจะเกิดขึ้นแต่ละรายการจะมีระยะเวลาที่มีผลเพื่อระบุเวลาที่จะแสดง

Tiles API อนุญาตให้มีระยะเวลาที่มีผลซ้อนทับกัน โดยหน้าจอที่มีระยะเวลาเหลือน้อยที่สุดจะเป็นหน้าจอที่แสดง ระบบจะแสดงกิจกรรมเพียงรายการเดียวในแต่ละครั้ง

นักพัฒนาแอปสามารถระบุรายการสำรองเริ่มต้นได้ ตัวอย่างเช่น ไทล์กำหนดการอาจมีไทล์ที่มีระยะเวลาที่มีผลไม่สิ้นสุด ซึ่งจะใช้หากไม่มีรายการไทม์ไลน์อื่นมีผล ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

override fun onTileRequest(
    requestParams: RequestBuilders.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(
        TimelineBuilders.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(
            TimelineBuilders.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.
                    TimelineBuilders.TimeInterval.Builder()
                        .setEndMillis(meeting.dateTimeMillis)
                        .build()
                )
                .build()
        )
    }

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

รีเฟรชไทล์

ข้อมูลที่แสดงในไทล์อาจหมดอายุหลังจากผ่านไปสักระยะเวลาหนึ่ง ตัวอย่างเช่น ไทล์สภาพอากาศที่แสดงอุณหภูมิเท่ากันตลอดทั้งวันจะไม่ถูกต้อง

หากต้องการจัดการกับข้อมูลที่หมดอายุ ให้ตั้งค่าช่วงเวลาความสดใหม่เมื่อสร้างไทล์ ซึ่งจะระบุระยะเวลาที่ไทล์มีผล ในตัวอย่างไทล์สภาพอากาศ คุณอาจอัปเดตเนื้อหาทุกชั่วโมง ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

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

เมื่อคุณตั้งค่าช่วงเวลาความสดใหม่ ระบบจะเรียก onTileRequest() หลังจากช่วงเวลาดังกล่าวสิ้นสุดลงไม่นาน หากคุณไม่ตั้งค่าช่วงเวลาความสดใหม่ ระบบจะไม่เรียก onTileRequest()

ไทล์อาจหมดอายุเนื่องจากเหตุการณ์ภายนอกได้เช่นกัน ตัวอย่างเช่น ผู้ใช้อาจนำการประชุมออกจากปฏิทิน และหากไม่ได้รีเฟรชไทล์ ไทล์ก็จะยังคงแสดงการประชุมที่ถูกลบไปแล้ว ในกรณีนี้ ให้ขอรีเฟรชจากที่ใดก็ได้ในโค้ดของแอปพลิเคชัน ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

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

เลือกเวิร์กโฟลว์การอัปเดต

ใช้แนวทางปฏิบัติแนะนำต่อไปนี้เพื่อกำหนดวิธีตั้งค่าการอัปเดตไทล์

  • หากการอัปเดตคาดการณ์ได้ เช่น หากเป็นการอัปเดตกิจกรรมถัดไปในปฏิทินของผู้ใช้ ให้ใช้ไทม์ไลน์
  • เมื่อดึงข้อมูลแพลตฟอร์ม ให้ใช้การเชื่อมโยงข้อมูลเพื่อให้ระบบอัปเดตข้อมูลโดยอัตโนมัติ
  • หากคำนวณการอัปเดตในอุปกรณ์ได้ในเวลาอันสั้น เช่น การอัปเดตตำแหน่งของรูปภาพในไทล์พระอาทิตย์ขึ้น ให้ใช้ onTileRequest()

    วิธีนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องสร้างรูปภาพทั้งหมดล่วงหน้า หากต้องการสร้างรูปภาพใหม่ในอนาคต ให้เรียก setFreshnessIntervalMillis()

  • หากคุณทำงานเบื้องหลังที่ต้องใช้ทรัพยากรมากซ้ำๆ เช่น การโพล ข้อมูลสภาพอากาศ ให้ใช้ WorkManager และพุชการอัปเดตไปยังไทล์

  • หากการอัปเดตเป็นการตอบสนองต่อเหตุการณ์ภายนอก เช่น ไฟ เปิดขึ้น รับอีเมล หรืออัปเดตบันทึกย่อ ให้ส่งข้อความ Firebase Cloud Messaging (FCM) เพื่อทำให้แอปกลับมาทำงานอีกครั้ง แล้วพุชการอัปเดต ไปยังไทล์

  • หากกระบวนการซิงค์ข้อมูลไทล์อาจใช้ทรัพยากรมาก ให้ทำดังนี้

    1. กำหนดเวลาการซิงค์ข้อมูล
    2. เริ่มจับเวลา 1-2 วินาที
    3. หากคุณได้รับการอัปเดตจากแหล่งข้อมูลระยะไกลก่อนหมดเวลา ให้แสดงค่าที่อัปเดตจากการซิงค์ข้อมูล ไม่เช่นนั้น ให้แสดงค่าในแคชในเครื่อง