จัดการและอัปเดต GlanceAppWidget

ส่วนต่อไปนี้จะอธิบายวิธีอัปเดต GlanceAppWidget และจัดการสถานะของ GlanceAppWidget

จัดการสถานะ GlanceAppWidget

ระบบจะสร้างอินสแตนซ์ของคลาส GlanceAppWidget ที่ระบุเมื่อใดก็ตามที่มีการสร้างวิดเจ็ตหรือต้องมีการอัปเดต ดังนั้นคลาสนี้จึงควรไม่มีสถานะและไม่มีการโต้ตอบ

แนวคิดของสถานะสามารถแบ่งออกเป็นส่วนต่างๆ ดังนี้

  • สถานะของแอปพลิเคชัน: สถานะหรือเนื้อหาของแอปที่วิดเจ็ตต้องการ เช่น รายชื่อปลายทางที่จัดเก็บไว้ (เช่น ฐานข้อมูล) ที่ผู้ใช้กำหนด
  • สถานะ Glance: สถานะเฉพาะที่เกี่ยวข้องกับวิดเจ็ตแอปเท่านั้น และไม่จำเป็นต้องแก้ไขหรือส่งผลต่อสถานะของแอป เช่น มีการเลือกช่องทําเครื่องหมายในวิดเจ็ตหรือมีการเพิ่มตัวนับ

ใช้สถานะของแอปพลิเคชัน

วิดเจ็ตแอปควรเป็นแบบพาสซีฟ แต่ละแอปพลิเคชันมีหน้าที่จัดการ ชั้นข้อมูลและจัดการสถานะต่างๆ เช่น ว่าง กำลังโหลด และข้อผิดพลาดที่แสดง ใน UI ของวิดเจ็ต

ตัวอย่างเช่น โค้ดต่อไปนี้จะดึงข้อมูลจุดหมายจากแคชในหน่วยความจำจากเลเยอร์ที่เก็บข้อมูล ให้รายการจุดหมายที่จัดเก็บไว้ และแสดง UI ที่แตกต่างกันตามสถานะ

class DestinationAppWidget : GlanceAppWidget() {

    // ...

    @Composable
    fun MyContent() {
        val repository = remember { DestinationsRepository.getInstance() }
        // Retrieve the cache data everytime the content is refreshed
        val destinations by repository.destinations.collectAsState(State.Loading)

        when (destinations) {
            is State.Loading -> {
                // show loading content
            }

            is State.Error -> {
                // show widget error content
            }

            is State.Completed -> {
                // show the list of destinations
            }
        }
    }
}

เมื่อใดก็ตามที่สถานะหรือข้อมูลมีการเปลี่ยนแปลง แอปมีหน้าที่รับผิดชอบในการแจ้งเตือน และอัปเดตวิดเจ็ต ดูข้อมูลเพิ่มเติมได้ที่อัปเดต GlanceAppWidget

อัปเดต GlanceAppWidget

คุณขออัปเดตเนื้อหาวิดเจ็ตได้โดยใช้ GlanceAppWidget ดังที่อธิบายไว้ในส่วนจัดการสถานะ GlanceAppWidget วิดเจ็ตแอป จะโฮสต์ในกระบวนการที่แตกต่างกัน Glance จะแปลเนื้อหาเป็นRemoteViewsจริง และส่งไปยังโฮสต์ หากต้องการอัปเดตเนื้อหา Glance ต้องสร้าง RemoteViews ขึ้นมาใหม่และส่งอีกครั้ง

หากต้องการส่งการอัปเดต ให้เรียกใช้เมธอด update ของอินสแตนซ์ GlanceAppWidget โดยระบุ context และ glanceId ดังนี้

MyAppWidget().update(context, glanceId)

หากต้องการรับ glanceId ให้ค้นหา GlanceAppWidgetManager โดยใช้คำสั่งต่อไปนี้

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

หรือใช้GlanceAppWidget updateส่วนขยายใดส่วนขยายหนึ่งต่อไปนี้

// Updates all placed instances of MyAppWidget
MyAppWidget().updateAll(context)

// Iterate over all placed instances of MyAppWidget and update if the state of
// the instance matches the given predicate
MyAppWidget().updateIf<State>(context) { state ->
    state == State.Completed
}

คุณเรียกใช้เมธอดเหล่านี้ได้จากส่วนใดก็ได้ของแอปพลิเคชัน เนื่องจากเป็นฟังก์ชัน suspend เราจึงแนะนำให้เปิดใช้ฟังก์ชันเหล่านี้นอกขอบเขตของเทรดหลัก ในตัวอย่างต่อไปนี้ เราจะเปิดใช้ในCoroutineWorker

class DataSyncWorker(
    val context: Context,
    val params: WorkerParameters,
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        // Fetch data or do some work and then update all instance of your widget
        MyAppWidget().updateAll(context)
        return Result.success()
    }
}

ดูรายละเอียดเพิ่มเติมเกี่ยวกับโครูทีนได้ที่โครูทีน Kotlin ใน Android

เวลาที่ควรจะอัปเดตวิดเจ็ต

อัปเดตวิดเจ็ตทันทีหรือเป็นระยะ

วิดเจ็ตจะอัปเดตได้ทันทีเมื่อแอปทำงานอยู่ เช่น

  • เมื่อผู้ใช้โต้ตอบกับวิดเจ็ต ซึ่งทริกเกอร์การดำเนินการ การเรียกใช้ Lambda หรือ ความตั้งใจที่จะเปิดใช้กิจกรรม
  • เมื่อผู้ใช้โต้ตอบกับแอปในส่วนหน้า หรือขณะที่แอปกำลังอัปเดตอยู่แล้วเพื่อตอบสนองต่อข้อความ Firebase Cloud Messaging (FCM) หรือการออกอากาศ

ในกรณีเหล่านี้ ให้เรียกใช้เมธอด update ตามที่อธิบายไว้ในคู่มือนี้

วิดเจ็ตจะอัปเดตเป็นระยะๆ เมื่อแอปไม่ได้ทำงานอยู่ เช่น

  • ใช้ updatePeriodMillis เพื่ออัปเดตวิดเจ็ตได้สูงสุด 1 ครั้งทุก 30 นาที
  • ใช้ WorkManager เพื่อกำหนดเวลาการอัปเดตให้บ่อยขึ้น เช่น ทุก 15 นาที
  • อัปเดตวิดเจ็ตเพื่อตอบสนองต่อการออกอากาศ

แหล่งข้อมูล