Bu sayfada, daha iyi bir kullanıcı deneyimi için daha gelişmiş bir widget oluşturmayla ilgili ö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üketimini azaltmak 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'ı söz konusu olduğunda veri yenileme. Her birinin farklı hesaplama maliyetleri ve sonuçları vardır.
Aşağıda her 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)işlevini çağırın. Bu işlem, daha önce sağlananRemoteViewsile yeni birRemoteViewsdeğerini 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 belirli bölümlerini güncellemek için call
AppWidgetManager.partiallyUpdateAppWidgetkullanılır. Bu işlem, yeniRemoteViewsile daha önce sağlananRemoteViews'yı birleştirir. Bir widget,updateAppWidget(int[], RemoteViews)üzerinden 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 call
AppWidgetManager.notifyAppWidgetViewDataChangedişlevini kullanın. Bu işlem,RemoteViewsFactory.onDataSetChangedtetiklenir. Bu süre zarfında eski veriler widget'ta gösterilir. Bu yöntemle maliyetli görevleri güvenli bir şekilde senkron olarak gerçekleştirebilirsiniz.
val appWidgetManager = AppWidgetManager.getInstance(context) appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview)
Uygulama, ilgili AppWidgetProvider sınıfıyla aynı UID'ye sahip olduğu sürece bu yöntemleri uygulamanızın herhangi bir yerinden çağırabilirsiniz.
Widget'ları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 yanıt olarak, güncellemeleri yayınlayarak veya her ikisini de yaparak güncellenebilir.
Düzenli olarak güncelleme
appwidget-provider XML'sinde AppWidgetProviderInfo.updatePeriodMillis için bir değer belirterek düzenli 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 10 saniyeden uzun sürüyorsa yayın alıcı güncellemeleriyle ilgili alternatifleri göz önünde bulundurun. Çünkü 10 saniye sonra sistem, BroadcastReceiver öğesini yanıt vermiyor olarak kabul eder.
updatePeriodMillis, 30 dakikadan kısa değerleri desteklemez. Ancak, düzenli güncellemeleri devre dışı bırakmak istiyorsanız 0 değerini belirtebilirsiniz.
Kullanıcıların bir yapılandırmadaki güncellemelerin sıklığını ayarlamasına izin verebilirsiniz. Örneğin, 15 dakikada bir veya günde yalnızca dört kez güncellenen bir borsa sembolü 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 bazı yöntemler şunlardır:
Uygulama etkinliğinden: Kullanıcı etkileşimine (ör. kullanıcının dokunması) yanıt olarak doğrudan
AppWidgetManager.updateAppWidgetçağrısı yapın.Bildirim veya uygulama widget'ı gibi uzaktan etkileşimlerden: Bir
PendingIntentoluşturun, ardından widget'ı çağrılanActivity,BroadcastveyaService'dan güncelleyin. Kendi önceliğinizi seçebilirsiniz. Örneğin,PendingIntentiçinBroadcastseçersenizBroadcastReceiver'e öncelik vermek için ön planda yayın'ı seçebilirsiniz.
Anons etkinliğine yanıt olarak güncelleme
Güncellenmesi için widget gerektiren bir yayın etkinliğine örnek olarak kullanıcının fotoğraf çekmesi verilebilir. Bu durumda, yeni bir fotoğraf algılandığında widget'ı güncellemek istersiniz.
WorkManager ile çalışmayı 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 dinleme.
Ancak bu işlem cihaz kaynaklarını tükettiğinden dikkatli bir şekilde kullanın ve yalnızca belirli yayını dinleyin. Android 7.0 (API düzeyi 24) ve Android 8.0 (API düzeyi 26) sürümlerinde yayın sınırlamalarının kullanıma sunulmasıyla birlikte, uygulamalar belirli istisnalar dışında manifestlerinde örtülü yayınları kaydedemez.
Bir widget'ı BroadcastReceiver'dan güncellerken dikkat edilmesi gerekenler
Widget, BroadcastReceiver'dan güncelleniyorsa (AppWidgetProvider dahil) widget güncellemesinin süresi ve önceliğiyle ilgili aşağıdaki hususları göz önünde bulundurun.
Güncellemenin süresi
Genel olarak sistem, genellikle uygulamanın ana iş parçacığında çalışan yayın alıcıların yanıt vermediğini düşünmeden ve Uygulama Yanıt Vermiyor (ANR) hatasını tetiklemeden önce 10 saniyeye kadar çalışmasına izin verir. 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 hususlar 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 nedenle, aşırı yüklenmiş sistem kaynakları yayın alıcısının çağrılmasında gecikmeye neden olabilir. Yayın önceliği vermek için yayını ön plan işlemi yapın.
Örneğin, kullanıcı widget'ın belirli bir bölümüne dokunduğunda PendingIntent.getBroadcast'e iletilen Intent öğesine Intent.FLAG_RECEIVER_FOREGROUND
işaretini ekleyin.