GlanceAppWidget'ı yönetme ve güncelleme

Aşağıdaki bölümlerde, GlanceAppWidget hizmetinin nasıl güncelleneceği ve yönetileceği anlatılmaktadır. durumu.

GlanceAppWidget durumunu yönet

Sağlanan GlanceAppWidget sınıfı, widget her yapıldığında örneklenir. oluşturulmalı veya bir güncelleme gerektirdiğinden durum bilgisiz ve pasif olmalıdır.

Devlet kavramı aşağıdaki bölümlere ayrılabilir:

  • Uygulama durumu: widget'ını tıklayın. Örneğin, gösterir.
  • Bir bakışta durumu: Yalnızca uygulama widget'ıyla alakalı olan belirli bir durum. ve uygulamanın durumunu değiştirmez veya etkilemesi gerekmez. Örneğin, widget'ta onay kutusu işaretlendi veya sayaç artırıldı.

Uygulama durumunu kullan

Uygulama widget'ları pasif olmalıdır. Her uygulama, veri katmanına ve boşta kalma, yükleniyor ve hata yansıtma gibi durumları ele alma widget'ı kullanıcı arayüzünde görebilirsiniz.

Örneğin, aşağıdaki kod bellek içi öğeden hedefleri alır önbelleğine alır, depolanan hedeflerin listesini sağlar ve durumuna bağlı olarak farklı bir kullanıcı arayüzü görüntüler:

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

Durum veya veriler değiştiğinde, bunu bildirmek uygulamanın sorumluluğundadır widget'ı güncelleyin. Daha fazla bilgi için GlanceAppWidget'ı güncelleme bölümüne bakın.

GlanceAppWidget uygulamasını güncelle

GlanceAppWidget durumunu yönetme bölümünde açıklandığı gibi, uygulama widget'lar farklı bir işlemde barındırılır. Glance, içeriği gerçek RemoteViews olarak tanımlar ve bunları ana makineye gönderir. İçeriği güncellemek için Glance RemoteViews öğesini yeniden oluşturup tekrar göndermesi gerekir.

Güncellemeyi göndermek için GlanceAppWidget örneğinin update yöntemini çağırın. context ve glanceId sağlar:

MyAppWidget().update(context, glanceId)

glanceId öğesini almak için GlanceAppWidgetManager öğesini sorgulayın:

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

Alternatif olarak GlanceAppWidget update uzantılarından birini kullanabilirsiniz:

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

Bu yöntemler, uygulamanızın herhangi bir bölümünden çağrılabilir. Çünkü suspend işlev, bunları ana iş parçacığının dışında başlatmanızı öneririz kapsam. Aşağıdaki örnekte bunlar CoroutineWorker içinde başlatılmıştır:

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

Eş yordamlar hakkında daha ayrıntılı bilgi için Android'de Kotlin Eşdeğerleri konusuna bakın.