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.
- Tam güncelleme: Widget'ı tamamen güncellemek için
AppWidgetManager.updateAppWidget(int, android.widget.RemoteViews)yöntemini çağırın. Bu işlem, daha önce sağlananRemoteViewsdeğerini yeni birRemoteViewsile değiştirir. Bu, hesaplama açısından en maliyetli güncellemedir.
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)
- Kısmi güncelleme: Widget'ın bölümlerini güncellemek için
AppWidgetManager.partiallyUpdateAppWidgetöğesini çağırın. Bu işlem, yeniRemoteViewsile daha önce sağlananRemoteViewsdeğerini birleştirir. Bir widget,updateAppWidget(int[], RemoteViews)aracılığıyla en az bir tam güncelleme almazsa bu yöntem yok sayılır.
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)
- Koleksiyon verilerini yenileme: Widget'ınızdaki bir koleksiyon görünümünün verilerini geçersiz kılmak için
AppWidgetManager.notifyAppWidgetViewDataChangedyöntemini çağırın. Bu işlem,RemoteViewsFactory.onDataSetChangedtetikler. Bu süre zarfında widget'ta eski veriler gösterilir. Bu yöntemle, maliyetli görevleri eşzamanlı olarak güvenli bir şekilde gerçekleştirebilirsiniz.
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.updateAppWidgetyöntemini çağırın.Bildirim veya uygulama widget'ı gibi uzaktan etkileşimlerden:
PendingIntentoluşturun, ardından çağrılanActivity,BroadcastveyaServiceüzerinden widget'ı güncelleyin. Kendi önceliğinizi seçebilirsiniz. Örneğin,PendingIntentiçin birBroadcastseçersenizBroadcastReceiverö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.