GlanceAppWidget'ı yönetme ve güncelleme

Aşağıdaki bölümlerde GlanceAppWidget öğesinin nasıl güncelleneceği ve durumunun nasıl yönetileceği açıklanmaktadır.

GlanceAppWidget durumunu yönetme

Sağlanan GlanceAppWidget sınıfı, widget oluşturulduğunda veya güncelleme gerektiğinde başlatılır. Bu nedenle, durumsuz ve pasif olmalıdır.

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

  • Uygulama durumu: Uygulamanın, widget tarafından gerekli olan durumu veya içeriği. Örneğin, kullanıcı tarafından tanımlanan depolanmış hedeflerin listesi (yani veritabanı).
  • Glance durumu: Yalnızca uygulama widget'ı için geçerli olan ve uygulamanın durumunu değiştirmeyen veya etkilemeyen belirli durum. Örneğin, widget'ta bir onay kutusu seçildi veya sayaç artırıldı.

Uygulama durumunu kullanma

Uygulama widget'ları pasif olmalıdır. Her uygulama, veri katmanını yönetmekten ve widget kullanıcı arayüzünde yansıtılan boşta, yükleniyor ve hata gibi durumları işlemden geçirmekten sorumludur.

Örneğin, aşağıdaki kod, hedefleri depolama katmanındaki bellek içi önbellekten alır, depolanmış hedef listesini sağlar ve durumuna bağlı olarak farklı bir kullanıcı arayüzü gösterir:

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 her değiştiğinde widget'ı bilgilendirmek ve güncellemek uygulamanın sorumluluğundadır. Daha fazla bilgi için Update GlanceAppWidget (GlanceAppWidget'ı güncelleme) başlıklı makaleye bakın.

GlanceAppWidget uygulamasını güncelle

GlanceAppWidget kullanarak widget içeriğinizin güncellenmesini isteyebilirsiniz. Yönetim GlanceAppWidget durumu bölümünde açıklandığı gibi, uygulama widget'ları farklı bir süreçte barındırılır. Glance, içeriği gerçek RemoteViews olarak çevirir ve sunucuya gönderir. İçeriği güncellemek için Glance'in RemoteViews öğelerini yeniden oluşturup tekrar göndermesi gerekir.

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

MyAppWidget().update(context, glanceId)

glanceId almak için GlanceAppWidgetManager sorgusunu gönderin:

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 kullanın:

// 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. suspend işlevleri olduklarından bunları ana iş parçacığı kapsamı dışında başlatmanızı öneririz. Aşağıdaki örnekte, bunlar CoroutineWorker içinde başlatılı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 fazla bilgi için Android'de Kotlin Eş Yordamları başlıklı makaleyi inceleyin.

Widget'ları ne zaman güncellemelisiniz?

Widget'ları hemen veya düzenli olarak güncelleyin.

Uygulamanız etkin olduğunda widget'ınız hemen güncellenebilir. Örneğin:

  • Kullanıcı bir widget'la etkileşime geçtiğinde bir işlem, lambda çağrısı veya etkinliği başlatma niyeti tetiklenir.
  • Kullanıcınız uygulamanızla ön planda etkileşim kurduğunda veya uygulama, Firebase Cloud Messaging (FCM) mesajına ya da bir yayın mesajına yanıt olarak zaten güncellenirken.

Bu gibi durumlarda, bu rehberde açıklandığı şekilde update yöntemini çağırın.

Uygulamanız açık değilken widget'ınız periyodik olarak güncellenebilir. Örneğin:

  • Widget'ı 30 dakikada bir kez güncellemek için updatePeriodMillis simgesini kullanın.
  • Daha sık güncellemeler (ör. 15 dakikada bir) planlamak için WorkManager kullanın.
  • Anonsa yanıt olarak widget'ı güncelleyin.

Kaynaklar