Bagian berikut menjelaskan cara memperbarui GlanceAppWidget
dan mengelola
statusnya.
Mengelola status GlanceAppWidget
Class GlanceAppWidget
yang diberikan di-instansiasi setiap kali widget dibuat atau memerlukan update, sehingga harus stateless dan pasif.
Konsep status dapat dibagi menjadi berikut ini:
- Status aplikasi: Status atau konten aplikasi yang diperlukan oleh widget. Misalnya, daftar tujuan tersimpan (yaitu, database) yang ditentukan oleh pengguna.
- Status sekilas: Status tertentu yang hanya relevan dengan widget aplikasi dan tidak selalu mengubah atau memengaruhi status aplikasi. Misalnya, kotak centang dipilih di widget atau penghitung ditingkatkan.
Menggunakan status aplikasi
Widget aplikasi harus pasif. Setiap aplikasi bertanggung jawab untuk mengelola lapisan data dan menangani status, seperti tidak ada aktivitas, memuat, dan error yang tercermin di UI widget.
Misalnya, kode berikut mengambil tujuan dari cache dalam memori dari lapisan repositori, menyediakan daftar tujuan yang disimpan, dan menampilkan UI yang berbeda bergantung pada statusnya:
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 } } } }
Setiap kali status atau data berubah, aplikasi bertanggung jawab untuk memberi tahu dan memperbarui widget. Lihat Memperbarui GlanceAppWidget untuk mengetahui informasi selengkapnya.
Mengupdate GlanceAppWidget
Anda dapat meminta untuk memperbarui konten widget menggunakan GlanceAppWidget
. Seperti
yang dijelaskan di bagian Mengelola status GlanceAppWidget
, widget
aplikasi dihosting dalam proses yang berbeda. Glance menerjemahkan konten menjadi RemoteViews
yang sebenarnya dan mengirimkannya ke host. Untuk memperbarui konten, Glance harus membuat ulang RemoteViews
dan mengirimkannya lagi.
Untuk mengirim update, panggil metode update
instance GlanceAppWidget
,
dengan memberikan context
dan glanceId
:
MyAppWidget().update(context, glanceId)
Untuk mendapatkan glanceId
, kueri GlanceAppWidgetManager
:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
Atau, gunakan salah satu ekstensi 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 }
Metode ini dapat dipanggil dari bagian mana pun dalam aplikasi Anda. Karena merupakan fungsi suspend
, sebaiknya luncurkan di luar cakupan thread utama. Dalam contoh berikut, peluncurannya dilakukan di 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() } }
Lihat Coroutine Kotlin di Android untuk mengetahui detail selengkapnya tentang coroutine.
Kapan harus mengupdate widget
Perbarui widget secara langsung atau berkala.
Widget Anda dapat langsung diperbarui saat aplikasi Anda aktif. Contoh:
- Saat pengguna berinteraksi dengan widget, memicu tindakan, panggilan lambda, atau intent untuk meluncurkan aktivitas.
- Saat pengguna berinteraksi dengan aplikasi Anda di latar depan, atau saat aplikasi sudah memperbarui sebagai respons terhadap pesan Firebase Cloud Messaging (FCM) atau siaran.
Dalam kasus ini, panggil metode update
seperti yang dijelaskan dalam panduan ini.
Widget Anda dapat diperbarui secara berkala saat aplikasi Anda tidak aktif. Contoh:
- Gunakan
updatePeriodMillis
untuk memperbarui widget hingga sekali setiap 30 menit. - Gunakan
WorkManager
untuk menjadwalkan pembaruan yang lebih sering, seperti setiap 15 menit. - Perbarui widget sebagai respons terhadap siaran.
Referensi
- Membuat widget dengan Glance (Codelab)
- Membangun untuk Masa Depan Android: Bab widget (Video)