Android ana ekranı, Android destekli çoğu cihazda bulunur ve kullanıcının içeriğe hızlıca erişmesi için uygulama widget'ları (veya widget'lar) yerleştirmesine olanak tanır. Ana ekranın yerini alacak veya benzer bir uygulama geliştiriyorsanız AppWidgetHost
'i uygulayarak kullanıcının widget yerleştirmesine de izin verebilirsiniz. Bu, çoğu uygulamanın yapması gereken bir işlem değildir ancak kendi barındırıcınızı oluşturuyorsanız barındırıcının zımnen kabul ettiği sözleşmeden doğan yükümlülükleri anlamanız önemlidir.
Bu sayfada, özel AppWidgetHost
uygulamayla ilgili sorumluluklar ele alınmaktadır. AppWidgetHost
öğesinin nasıl uygulanacağına dair belirli bir örnek için Android ana ekranının LauncherAppWidgetHost
kaynak koduna bakın.
Aşağıda, özel bir AppWidgetHost
kullanımıyla ilgili temel sınıflar ve kavramlara genel bir bakış verilmiştir:
Uygulama widget'ı ana makinesi:
AppWidgetHost
, kullanıcı arayüzüne widget yerleştiren uygulamalar için AppWidget hizmetiyle etkileşim sağlar.AppWidgetHost
, barındırıcının kendi paketinde benzersiz bir kimliğe sahip olmalıdır. Bu kimlik, ana makinenin tüm kullanımlarında devam eder. Kimlik, genellikle uygulamanızda atadığınız sabit kodlu bir değerdir.Uygulama widget'ı kimliği: Her widget örneğine, bağlama sırasında benzersiz bir kimlik atanır.
bindAppWidgetIdIfAllowed()
konusuna ve daha ayrıntılı bilgi için aşağıdaki Widget'ları bağlama bölümüne bakın. Barındırıcı,allocateAppWidgetId()
kullanarak benzersiz kimliği alır. Bu kimlik, barındırıcıdan silinene kadar widget'ın kullanım süresi boyunca varlığını korur. Barındırıcıya özgü tüm durumlar (ör. widget'ın boyutu ve konumu) barındırma paketi tarafından devam ettirilmeli ve uygulama widget'ı kimliğiyle ilişkilendirilmelidir.Uygulama widget'ı ana makinesi görünümü:
AppWidgetHostView
, widget'ın gösterilmesi gerektiğinde içine yerleştirildiği bir çerçeve olarak düşünülebilir. Bir widget, barındırıcı tarafından her şişirildiğinde birAppWidgetHostView
ile ilişkilendirilir.- Sistem varsayılan olarak bir
AppWidgetHostView
oluşturur ancak ana makine,AppWidgetHostView
'yi genişleterek kendiAppWidgetHostView
alt sınıfını oluşturabilir. - Android 12 (API düzeyi 31) sürümünden itibaren
AppWidgetHostView
, dinamik olarak aşırı yüklenmiş renkleri işlemek içinsetColorResources()
veresetColorResources()
yöntemlerini kullanıma sunar. Bu yöntemlere renkleri eklemek yayın sahibinin sorumluluğundadır.
- Sistem varsayılan olarak bir
Seçenekler paketi:
AppWidgetHost
, widget'ın nasıl görüntülendiği (ör. boyut aralıkları listesi) ve widget'ın kilit ekranında mı yoksa ana ekranda mı bulunduğuyla ilgili bilgileriAppWidgetProvider
'e iletmek için seçenekler paketini kullanır. Bu bilgiler,AppWidgetProvider
'nin widget'ın içeriğini ve görünümünü nasıl ve nerede gösterildiğine göre özelleştirmesine olanak tanır. Widget paketini değiştirmek içinupdateAppWidgetOptions()
veupdateAppWidgetSize()
tuşlarını kullanabilirsiniz. Bu yöntemlerin her ikisi deAppWidgetProvider
içinonAppWidgetOptionsChanged()
geri çağırma işlevini tetikler.
Widget'ları bağlama
Kullanıcı bir ana makineye widget eklediğinde bağlama adı verilen bir işlem gerçekleşir. Bağlama, belirli bir uygulama widget'ı kimliğinin belirli bir ana makineyle ve belirli bir AppWidgetProvider
ile ilişkilendirilmesini ifade eder.
Bağlama API'leri, ana makinenin bağlama için özel bir kullanıcı arayüzü sağlamasına da olanak tanır. Bu süreci kullanmak için uygulamanızın, BIND_APPWIDGET
iznini barındırıcının manifest dosyasında beyan etmesi gerekir:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
Ancak bu sadece başlangıç. Çalışma zamanında, kullanıcının barındırıcıya widget eklemesine izin vermek için uygulamanıza açıkça izin vermesi gerekir. Uygulamanızın widget'ı ekleme izni olup olmadığını test etmek için bindAppWidgetIdIfAllowed()
yöntemini kullanın. bindAppWidgetIdIfAllowed()
false
döndürürse uygulamanız, kullanıcıdan izin vermesini isteyen bir iletişim kutusu göstermelidir: Mevcut widget ekleme işlemi için "izin ver" veya gelecekteki tüm widget ekleme işlemlerini kapsayacak şekilde "her zaman izin ver".
Bu snippet'te iletişim kutusunun nasıl gösterileceğine dair bir örnek verilmiştir:
Kotlin
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName) // This is the options bundle described in the preceding section. putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options) } startActivityForResult(intent, REQUEST_BIND_APPWIDGET)
Java
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName); // This is the options bundle described in the preceding section. intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); startActivityForResult(intent, REQUEST_BIND_APPWIDGET);
Ana makine, kullanıcının eklediği widget'ın yapılandırılmaya ihtiyacı olup olmadığını kontrol etmelidir. Daha fazla bilgi için Kullanıcıların uygulama widget'larını yapılandırmasını etkinleştirme başlıklı makaleyi inceleyin.
Barındırıcının sorumlulukları
AppWidgetProviderInfo
meta verilerini kullanarak widget'lar için çeşitli yapılandırma ayarları belirtebilirsiniz.
Aşağıdaki bölümlerde daha ayrıntılı olarak açıklanan bu yapılandırma seçeneklerini, bir widget sağlayıcıyla ilişkilendirilmiş AppWidgetProviderInfo
nesnesinden alabilirsiniz.
Hedeflediğiniz Android sürümünden bağımsız olarak tüm ana makinelerin aşağıdaki sorumlulukları vardır:
Widget eklerken widget kimliğini daha önce açıklandığı şekilde ayırın. Bir widget ana makineden kaldırıldığında widget kimliğini ayırmak için
deleteAppWidgetId()
çağrısı yapın.Widget eklerken yapılandırma etkinliğinin başlatılması gerekip gerekmediğini kontrol edin. Genellikle, ana makinenin, widget'ın yapılandırma etkinliğini (varsa ve isteğe bağlı olarak işaretlenmediyse) hem
configuration_optional
hem dereconfigurable
işaretlerini belirterek başlatması gerekir. Ayrıntılar için Widget'ı yapılandırma etkinliğinden güncelleme başlıklı makaleyi inceleyin. Bu, birçok widget'ın gösterilebilmesi için gerekli bir adımdır.Widget'lar,
AppWidgetProviderInfo
meta verilerinde varsayılan bir genişlik ve yükseklik belirtir. Bu değerler,targetCellWidth
vetargetCellHeight
belirtilmişse Android 12'den itibaren hücrelerde veya yalnızcaminWidth
veminHeight
belirtilmişse dp/sn olarak tanımlanır. Widget boyutlandırma özellikleri bölümüne bakın.Widget'ın en az bu kadar dps ile yerleştirildiğinden emin olun. Örneğin, birçok ana makine simgeleri ve widget'ları bir ızgara şeklinde düzenler. Bu senaryoda, ana makine varsayılan olarak
minWidth
veminHeight
kısıtlamalarını karşılayan minimum sayıda hücre kullanarak bir widget ekler.
Belirli platform sürümleri, önceki bölümde listelenen şartlara ek olarak barındırıcıya yeni sorumluluklar yükleyen özellikler sunar.
Hedeflenen Android sürümüne göre yaklaşımınızı belirleme
Android 12
Android 12 (API seviyesi 31), seçenekler paketinde bir widget örneğinin alabileceği olası boyutların listesini dpi cinsinden içeren ek bir List<SizeF>
paketler.
Sağlanan boyut sayısı, ana makine uygulamasına bağlıdır. Barındıranlar genellikle telefonlar için dikey ve yatay olmak üzere iki boyut, katlanabilir cihazlar için ise dört boyut sağlar.
Bir AppWidgetProvider
'nin RemoteViews
'a sağlayabileceği farklı RemoteViews
sayısı MAX_INIT_VIEW_COUNT
(16) ile sınırlıdır.
AppWidgetProvider
nesneleri, RemoteViews
nesnesini List<SizeF>
içindeki her boyutla eşleştirdiğinden MAX_INIT_VIEW_COUNT
boyuttan fazla sağlamaz.
Android 12, dps cinsinden maxResizeWidth
ve maxResizeHeight
özelliklerini de kullanıma sunar. Bu özelliklerden en az birini kullanan widget'ların, özellikler tarafından belirtilen boyutu aşmamasını öneririz.
Ek kaynaklar
Glance
referans dokümanlarına bakın.