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 context
và glanceId
:
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.