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

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

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

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

แนวคิดของรัฐแบ่งออกได้เป็นข้อมูลต่อไปนี้

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

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

วิดเจ็ตแอปควรเป็นแบบแพสซีฟ แต่ละแอปพลิเคชันมีหน้าที่จัดการ ชั้นข้อมูลและการจัดการสถานะ เช่น ไม่มีการใช้งาน การโหลด และข้อผิดพลาดในการแสดง ใน 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
            }
        }
    }
}

แอปมีหน้าที่แจ้งทุกครั้งที่รัฐหรือข้อมูลมีการเปลี่ยนแปลง และอัปเดตวิดเจ็ต โปรดดูข้อมูลเพิ่มเติมที่ Update GlanceAppWidget

อัปเดต GlanceAppWidget

ตามที่อธิบายไว้ในส่วนจัดการสถานะGlanceAppWidget วิดเจ็ตจะโฮสต์อยู่ในกระบวนการอื่น Glance แปลเนื้อหาเป็นภาษา RemoteViews จริงและส่งไปยังโฮสต์ หากต้องการอัปเดตเนื้อหา ข้อมูลโดยย่อ ต้องสร้าง 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 Coroutines ใน Android