Gelişmiş widget oluşturma

Compose yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose tarzı API'leri kullanarak widget oluşturmayı öğrenin.

Bu sayfada, daha iyi bir kullanıcı deneyimi için daha gelişmiş bir widget oluşturmaya yönelik önerilen uygulamalar açıklanmaktadır.

Widget içeriğini güncelleme optimizasyonları

Widget içeriğini güncellemek, bilgi işlem açısından maliyetli olabilir. Pil tüketiminden tasarruf etmek için güncelleme türünü, sıklığını ve zamanlamasını optimize edin.

Widget güncelleme türleri

Widget'ları güncellemenin üç yolu vardır: tam güncelleme, kısmi güncelleme ve koleksiyon widget'ları için veri yenileme. Her birinin farklı hesaplama maliyetleri ve sonuçları vardır.

Aşağıda her bir güncelleme türü açıklanmakta ve her biri için kod snippet'leri verilmektedir.

val appWidgetManager = AppWidgetManager.getInstance(context)
val remoteViews = RemoteViews(context.packageName, R.layout.widgetlayout).apply {
    setTextViewText(R.id.textview_widget_layout1, "Updated text1")
    setTextViewText(R.id.textview_widget_layout2, "Updated text2")
}
appWidgetManager.updateAppWidget(appWidgetId, remoteViews)

val appWidgetManager = AppWidgetManager.getInstance(context)
val remoteViews = RemoteViews(context.packageName, R.layout.widgetlayout).apply {
    setTextViewText(R.id.textview_widget_layout, "Updated text")
}
appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews)

val appWidgetManager = AppWidgetManager.getInstance(context)
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview)

Uygulamanızın UID'si ilgili AppWidgetProvider sınıfıyla aynı olduğu sürece bu yöntemleri uygulamanızın herhangi bir yerinden çağırabilirsiniz.

Widget'ın ne sıklıkta güncelleneceğini belirleme

Widget'lar, updatePeriodMillis özelliği için sağlanan değere bağlı olarak düzenli aralıklarla güncellenir. Widget, kullanıcı etkileşimine, yayın güncellemelerine veya her ikisine yanıt olarak güncellenebilir.

Periyodik olarak güncelleme

appwidget-provider XML'de AppWidgetProviderInfo.updatePeriodMillis için bir değer belirterek periyodik güncellemenin sıklığını kontrol edebilirsiniz. Her güncelleme, widget'ı güncellemek için kodu yerleştirebileceğiniz AppWidgetProvider.onUpdate() yöntemini tetikler. Ancak widget'ınızın verileri eşzamansız olarak yüklemesi gerekiyorsa veya güncelleme işlemi 10 saniyeden uzun sürüyorsa aşağıdaki bölümde açıklanan yayın alıcı güncellemelerine yönelik alternatifleri inceleyin. Bunun nedeni, sistemin 10 saniye sonra BroadcastReceiver öğesini yanıt vermiyor olarak kabul etmesidir.

updatePeriodMillis, 30 dakikadan kısa değerleri desteklemez. Ancak periyodik güncellemeleri devre dışı bırakmak istiyorsanız 0 değerini belirtebilirsiniz.

Kullanıcıların bir yapılandırmadaki güncelleme sıklığını ayarlamasına izin verebilirsiniz. Örneğin, borsa fiyatı göstergesinin 15 dakikada bir veya günde yalnızca dört kez güncellenmesini isteyebilirler. Bu durumda, updatePeriodMillis değerini 0 olarak ayarlayın ve bunun yerine WorkManager kullanın.

Kullanıcı etkileşimine yanıt olarak güncelleme

Kullanıcı etkileşimine göre widget'ı güncellemek için önerilen yöntemlerden bazıları şunlardır:

  • Uygulamanın bir etkinliğinden: Kullanıcının dokunması gibi bir kullanıcı etkileşimine yanıt olarak doğrudan AppWidgetManager.updateAppWidget yöntemini çağırın.

  • Bildirim veya uygulama widget'ı gibi uzaktan etkileşimlerden: PendingIntent oluşturun, ardından çağrılan Activity, Broadcast veya Service üzerinden widget'ı güncelleyin. Kendi önceliğinizi seçebilirsiniz. Örneğin, PendingIntent için bir Broadcast seçerseniz BroadcastReceiver önceliği vermek için bir ön plan yayını seçebilirsiniz.

Yayın etkinliğine yanıt olarak güncelleme

Kullanıcının fotoğraf çekmesi, widget'ın güncellenmesini gerektiren bir yayın etkinliğine örnektir. Bu durumda, yeni bir fotoğraf algılandığında widget'ı güncellemek istersiniz.

WorkManager ile iş planlayabilir ve Constraints.Builder.addContentUriTrigger yöntemini kullanarak bir içerik URI'si tetikleyicisi belirtebilirsiniz.

Yayın için bir BroadcastReceiver da kaydedebilirsiniz. Örneğin, ACTION_LOCALE_CHANGED için dinleme. Ancak bu işlem cihaz kaynaklarını tükettiğinden dikkatli kullanın ve yalnızca belirli yayını dinleyin. Android 7.0 (API düzeyi 24) ve Android 8.0'da (API düzeyi 26) yayın sınırlamalarının getirilmesiyle birlikte uygulamalar, belirli istisnalar dışında manifest dosyalarında dolaylı yayınları kaydedemez.

BroadcastReceiver'dan widget güncellerken dikkat edilmesi gerekenler

Widget, AppWidgetProvider dahil olmak üzere bir BroadcastReceiver üzerinden güncelleniyorsa widget güncellemesinin süresi ve önceliğiyle ilgili aşağıdaki hususlara dikkat edin.

Güncellemenin süresi

Sistem, genellikle uygulamanın ana iş parçacığında çalışan yayın alıcılarının 10 saniyeye kadar çalışmasına izin verir. Bu sürenin ardından yanıt vermediğini kabul eder ve Uygulama Yanıt Vermiyor (ANR) hatasını tetikler. Yayın işlenirken ana iş parçacığının engellenmesini önlemek için goAsync yöntemini kullanın. Widget'ın güncellenmesi daha uzun sürüyorsa WorkManager kullanarak bir görev planlayabilirsiniz.

Caution: Any work you do here blocks further broadcasts until it completes,
so it can slow the receiving of later events.

Daha fazla bilgi için Güvenlikle ilgili dikkat edilmesi gereken noktalar ve en iyi uygulamalar başlıklı makaleyi inceleyin.

Güncellemenin önceliği

Varsayılan olarak, AppWidgetProvider.onUpdate kullanılarak yapılanlar da dahil olmak üzere yayınlar arka plan işlemleri olarak çalışır. Bu, aşırı yüklenen sistem kaynaklarının, yayın alıcısının çağrılmasında gecikmeye neden olabileceği anlamına gelir. Yayınlamaya öncelik vermek için bunu ön plan işlemi yapın.

Örneğin, kullanıcı widget'ın belirli bir bölümüne dokunduğunda PendingIntent.getBroadcast öğesine iletilen Intent öğesine Intent.FLAG_RECEIVER_FOREGROUND işaretini ekleyin.