Quản lý và cập nhật BrowseAppWidget

Các phần sau đây mô tả cách cập nhật GlanceAppWidget và quản lý trạng thái của GlanceAppWidget.

Quản lý trạng thái GlanceAppWidget

Lớp GlanceAppWidget đã cung cấp được tạo thực thể bất cứ khi nào tiện ích được tạo hoặc yêu cầu cập nhật. Vì vậy, lớp đó phải không có trạng thái và thụ động.

Có thể chia khái niệm về trạng thái như sau:

  • Trạng thái ứng dụng: Trạng thái hoặc nội dung của ứng dụng mà tiện ích yêu cầu. Ví dụ: danh sách các đích đến được lưu trữ (tức là cơ sở dữ liệu) do người dùng xác định.
  • Trạng thái xem nhanh: Trạng thái cụ thể chỉ liên quan đến tiện ích ứng dụng và không nhất thiết phải sửa đổi hoặc ảnh hưởng đến trạng thái của ứng dụng. Ví dụ: một hộp đánh dấu được chọn trong tiện ích hoặc bộ đếm đã tăng lên.

Sử dụng trạng thái của ứng dụng

Tiện ích ứng dụng phải thụ động. Mỗi ứng dụng chịu trách nhiệm quản lý lớp dữ liệu và xử lý các trạng thái, chẳng hạn như trạng thái rảnh, tải và lỗi phản ánh trong giao diện người dùng của tiện ích.

Ví dụ: Mã sau đây truy xuất các đích đến từ bộ nhớ đệm trong bộ nhớ từ lớp lưu trữ, cung cấp danh sách đích đến đã lưu trữ và hiển thị một giao diện người dùng khác tuỳ thuộc vào trạng thái của nó:

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
            }
        }
    }
}

Bất cứ khi nào trạng thái hoặc dữ liệu thay đổi, ứng dụng có trách nhiệm thông báo và cập nhật tiện ích. Hãy xem bài viết Cập nhật mã xem nhanh AppWidget để biết thêm thông tin.

Cập nhật GlanceAppWidget

Như đã giải thích trong phần Quản lý trạng thái GlanceAppWidget, các tiện ích ứng dụng được lưu trữ trong một quy trình khác. Tính năng Xem nhanh sẽ chuyển nội dung thành RemoteViews thực tế và gửi các nội dung đó đến máy chủ lưu trữ. Để cập nhật nội dung, tính năng Xem nhanh phải tạo lại RemoteViews rồi gửi lại.

Để gửi bản cập nhật, hãy gọi phương thức update của thực thể GlanceAppWidget, cung cấp contextglanceId:

MyAppWidget().update(context, glanceId)

Để có được glanceId, hãy truy vấn GlanceAppWidgetManager:

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

Ngoài ra, bạn có thể sử dụng một trong các tiện ích 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
}

Bạn có thể gọi các phương thức này từ bất kỳ phần nào trong ứng dụng. Vì đây là các hàm suspend, bạn nên chạy các hàm này bên ngoài phạm vi luồng chính. Ở ví dụ sau, các API này được khởi chạy trong 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()
    }
}

Xem bài viết Coroutine của Kotlin trên Android để biết thêm thông tin chi tiết về coroutine.