สร้างการ์ดที่มีเนื้อหาที่เปลี่ยนแปลงไปตามกาลเวลา
ทำงานกับไทม์ไลน์
ไทม์ไลน์ประกอบด้วยอินสแตนซ์ TimelineEntry
อย่างน้อย 1 รายการ โดยแต่ละรายการจะมีเลย์เอาต์ที่แสดงในช่วงเวลาที่เจาะจง การ์ดทั้งหมดต้องมีไทม์ไลน์
ไทล์แบบรายการเดียว
บ่อยครั้งที่การ์ดอธิบายได้ด้วย 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()
ไทล์อาจหมดอายุเนื่องจากเหตุการณ์ภายนอกด้วย เช่น ผู้ใช้อาจนำการประชุมออกจากปฏิทิน และหากไม่ได้รีเฟรชการ์ด การ์ดจะยังคงแสดงการประชุมที่ลบไปแล้ว ในกรณีนี้ ให้ขอการรีเฟรชจากตำแหน่งใดก็ได้ในโค้ดแอปพลิเคชัน ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้
Kotlin
fun eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService::class.java) }
Java
public void eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService.class); }
เลือกเวิร์กโฟลว์การอัปเดต
ใช้แนวทางปฏิบัติแนะนำต่อไปนี้เพื่อกำหนดวิธีกำหนดค่าการอัปเดตการ์ด
- หากการอัปเดตคาดการณ์ได้ เช่น เป็นการอัปเดตสำหรับกิจกรรมถัดไปในปฏิทินของผู้ใช้ ให้ใช้ไทม์ไลน์
- เมื่อดึงข้อมูลแพลตฟอร์ม ให้ใช้การเชื่อมโยงข้อมูลเพื่อให้ระบบอัปเดตข้อมูลโดยอัตโนมัติ
หากคำนวณการอัปเดตในอุปกรณ์ได้ในเวลาอันสั้น เช่น การอัปเดตตำแหน่งของรูปภาพในการ์ดภาพพระอาทิตย์ขึ้น ให้ใช้
onTileRequest()
ซึ่งจะเป็นประโยชน์อย่างยิ่งเมื่อคุณต้องสร้างรูปภาพทั้งหมดล่วงหน้า หากต้องการสร้างรูปภาพใหม่ในอนาคต ให้โทรไปที่
setFreshnessIntervalMillis()
หากคุณทํางานเบื้องหลังที่เข้มข้นมากขึ้นซ้ำๆ เช่น การสอบถามข้อมูลสภาพอากาศ ให้ใช้
WorkManager
และพุชการอัปเดตไปยังการ์ดหากการอัปเดตเป็นการตอบสนองต่อเหตุการณ์ภายนอก เช่น การเปิดไฟ การรับอีเมล หรือการอัปเดตโน้ต ให้ส่งข้อความ Firebase Cloud Messaging (FCM) เพื่อทำให้แอปทำงานอีกครั้ง จากนั้นจึงพุชการอัปเดตไปยังการ์ด
หากกระบวนการซิงค์ข้อมูลแผนที่จะเสียค่าใช้จ่ายสูง ให้ทำดังนี้
- กำหนดเวลาการซิงค์ข้อมูล
- เริ่มจับเวลา 1-2 วินาที
- หากคุณได้รับการอัปเดตจากแหล่งข้อมูลระยะไกลก่อนที่เวลาจะหมด ให้แสดงค่าที่อัปเดตจากการซิงค์ข้อมูล มิฉะนั้น ระบบจะแสดงค่าที่แคชไว้
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ลดผลกระทบของการอัปเดตเป็นประจำ
- เข้าถึงตำแหน่งในเบื้องหลัง
- เริ่มต้นใช้งาน WorkManager