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.

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

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

Có thể chia khái niệm về trạng thái thành những phần 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. Ví dụ: danh sách các đích đến được lưu trữ (chẳng hạn như cơ sở dữ liệu) được xác định bằng người dùng.
  • 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 đã được tăng lên.

Sử dụng trạng thái ứng dụng

Các tiện ích ứng dụng phải ở dạng thụ động. Mỗi ứng dụng đều 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ư rảnh, tải và phản ánh lỗi trong giao diện người dùng tiện ích.

Ví dụ: Mã sau đây truy xuất đích đến từ trong bộ nhớ bộ nhớ đệm từ lớp kho lưu trữ, cung cấp danh sách đích được lưu trữ và hiển thị một giao diện người dùng khác nhau tuỳ thuộc vào trạng thái của giao diệ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 phần Cập nhật GlanceAppWidget để 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, ứng dụng được lưu trữ trong một tiến trình khác. Glance dịch nội dung thành RemoteViews thực tế rồi gửi chúng đến máy chủ. Để 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)

Để lấy 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, hãy 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ì chúng Các hàm suspend, bạn nên chạy chúng bên ngoài luồng chính phạm vi. Trong ví dụ sau, chúng đượ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 Coroutine Kotlin trên Android để biết thêm thông tin chi tiết về coroutine.