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
được cung cấp sẽ được khởi tạo bất cứ khi nào tiện ích được tạo hoặc cần cập nhật, vì vậy, lớp này phải không trạng thái và thụ động.
Khái niệm về trạng thái có thể được chia 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 cần. Ví dụ: danh sách các địa điểm đã 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 một bộ đếm đã tăng.
Sử dụng trạng thái ứng dụng
Tiện ích ứng dụng phải ở trạng thá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, đang 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 kho 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 danh sách đó:
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. Xem phần Cập nhật GlanceAppWidget để biết thêm thông tin.
Cập nhật GlanceAppWidget
Bạn có thể yêu cầu cập nhật nội dung tiện ích bằng cách sử dụng 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. Glance dịch nội dung thành RemoteViews
thực tế và gửi nội dung đó đến máy chủ lưu trữ. Để cập nhật nội dung, Glance phải tạo lại RemoteViews
và gửi lại.
Để gửi thông tin 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) }
Hoặc 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 của mình. Vì đây là các hàm suspend
, nên bạn nên chạy các hàm này bên ngoài phạm vi luồng chính. Trong ví dụ sau, các coroutine này được khởi chạy trong một 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() } }
Hãy xem bài viết Coroutine Kotlin trên Android để biết thêm thông tin chi tiết về coroutine.
Thời điểm cập nhật tiện ích
Cập nhật các tiện ích ngay lập tức hoặc theo định kỳ.
Tiện ích có thể cập nhật ngay khi ứng dụng của bạn đang hoạt động. Ví dụ:
- Khi người dùng tương tác với một tiện ích, kích hoạt một thao tác, một lệnh gọi lambda hoặc một ý định khởi chạy một hoạt động.
- Khi người dùng tương tác với ứng dụng của bạn ở nền trước hoặc trong khi ứng dụng đang cập nhật để phản hồi một thông báo hoặc một thông báo truyền tin của Giải pháp gửi thông báo qua đám mây của Firebase (FCM).
Trong những trường hợp này, hãy gọi phương thức update
như mô tả trong hướng dẫn này.
Tiện ích có thể cập nhật định kỳ khi ứng dụng của bạn không hoạt động. Ví dụ:
- Sử dụng
updatePeriodMillis
để cập nhật tiện ích tối đa 30 phút một lần. - Sử dụng
WorkManager
để lên lịch cập nhật thường xuyên hơn, chẳng hạn như 15 phút một lần. - Cập nhật tiện ích để phản hồi một thông báo phát đi.
Tài nguyên
- Tạo một tiện ích bằng Glance (Lớp học lập trình)
- Xây dựng cho tương lai của Android: Chương về tiện ích (Video)