Layar utama Android, yang tersedia di sebagian besar perangkat berteknologi Android, memungkinkan pengguna menyematkan widget aplikasi (atau widget) untuk akses cepat ke konten. Jika membuat pengganti layar utama atau aplikasi serupa, Anda juga dapat mengizinkan pengguna menyematkan widget dengan menerapkan AppWidgetHost
. Tidak semua aplikasi perlu melakukan hal ini, tetapi jika Anda membuat host sendiri, sebaiknya pahami kewajiban kontraktual yang disetujui host secara implisit.
Halaman ini berfokus pada tanggung jawab yang termasuk dalam penerapan
AppWidgetHost
kustom. Untuk contoh spesifik cara menerapkan AppWidgetHost
, lihat kode sumber untuk LauncherAppWidgetHost
layar utama Android.
Berikut adalah ringkasan class dan konsep utama yang termasuk dalam penerapan
AppWidgetHost
kustom:
Host widget aplikasi:
AppWidgetHost
menyediakan interaksi dengan layanan AppWidget untuk aplikasi yang menyematkan widget dalam UI-nya.AppWidgetHost
harus memiliki ID yang unik dalam paket host sendiri. ID ini akan dipertahankan di seluruh penggunaan host. ID biasanya berupa nilai hard code yang Anda tetapkan di aplikasi.ID widget aplikasi: setiap instance widget diberi ID unik pada saat binding. Lihat
bindAppWidgetIdIfAllowed()
dan, untuk mengetahui detail selengkapnya, bagian Mengikat widget yang ada di bawahnya. Host mendapatkan ID unik menggunakanallocateAppWidgetId()
. ID ini akan tetap ada selama masa aktif widget hingga dihapus dari host. Semua status khusus host—seperti ukuran dan lokasi widget—harus dipertahankan oleh paket hosting dan dikaitkan dengan ID widget aplikasi.Tampilan host widget aplikasi: anggap
AppWidgetHostView
sebagai bingkai yang menggabungkan widget setiap kali perlu ditampilkan. Widget dikaitkan denganAppWidgetHostView
setiap kali widget diluaskan oleh host.- Secara default, sistem membuat
AppWidgetHostView
, tetapi host dapat membuat subclassAppWidgetHostView
sendiri dengan memperluasnya. - Mulai Android 12 (level API 31),
AppWidgetHostView
memperkenalkan metodesetColorResources()
danresetColorResources()
untuk menangani warna yang dimuat berlebih secara dinamis. Host bertanggung jawab untuk memberikan warna ke metode ini.
- Secara default, sistem membuat
Paket opsi:
AppWidgetHost
menggunakan paket opsi untuk menyampaikan informasi keAppWidgetProvider
tentang cara widget ditampilkan—misalnya, daftar rentang ukuran—dan apakah widget berada di layar kunci atau layar utama. Informasi ini memungkinkanAppWidgetProvider
menyesuaikan konten dan tampilan widget berdasarkan cara dan lokasi widget ditampilkan. Anda dapat menggunakanupdateAppWidgetOptions()
danupdateAppWidgetSize()
untuk mengubah paket widget. Kedua metode ini memicu callbackonAppWidgetOptionsChanged()
keAppWidgetProvider
.
Mengikat widget
Saat pengguna menambahkan widget ke host, akan terjadi proses yang disebut binding. Pengikatan
mengacu pada pengaitan ID widget aplikasi tertentu dengan host tertentu dan
AppWidgetProvider
tertentu.
Binding API juga memungkinkan host menyediakan UI kustom untuk binding. Untuk menggunakan proses ini, aplikasi Anda harus menyatakan izin
BIND_APPWIDGET
dalam manifes host:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
Namun, ini hanyalah langkah pertama. Saat runtime, pengguna harus memberikan izin secara eksplisit ke aplikasi Anda agar aplikasi dapat menambahkan widget ke host. Untuk menguji apakah aplikasi Anda memiliki izin untuk menambahkan widget, gunakan metode bindAppWidgetIdIfAllowed()
. Jika bindAppWidgetIdIfAllowed()
menampilkan false
, aplikasi Anda harus menampilkan
dialog yang meminta pengguna untuk memberikan izin: "izinkan" untuk penambahan widget saat ini, atau "selalu izinkan" untuk mencakup semua penambahan widget selanjutnya.
Cuplikan berikut menunjukkan contoh cara menampilkan dialog:
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);
Host harus memeriksa apakah widget yang ditambahkan pengguna memerlukan konfigurasi. Untuk mengetahui informasi selengkapnya, lihat Memungkinkan pengguna mengonfigurasi widget aplikasi.
Tanggung jawab host
Anda dapat menentukan sejumlah setelan konfigurasi untuk widget menggunakan
metadata AppWidgetProviderInfo
.
Anda dapat mengambil opsi konfigurasi ini, yang dibahas lebih mendetail di bagian berikut, dari objek AppWidgetProviderInfo
yang terkait dengan penyedia widget.
Terlepas dari versi Android yang Anda targetkan, semua host memiliki tanggung jawab berikut:
Saat menambahkan widget, alokasikan ID widget seperti yang dijelaskan sebelumnya. Saat widget dihapus dari host, panggil
deleteAppWidgetId()
untuk menghapus alokasi ID widget.Saat menambahkan widget, periksa apakah aktivitas konfigurasi perlu diluncurkan. Biasanya, host perlu meluncurkan aktivitas konfigurasi widget jika ada dan tidak ditandai sebagai opsional dengan menentukan flag
configuration_optional
danreconfigurable
. Lihat Memperbarui widget dari aktivitas konfigurasi untuk mengetahui detailnya. Langkah ini perlu dilakukan agar banyak widget dapat ditampilkan.Widget menentukan lebar dan tinggi default dalam metadata
AppWidgetProviderInfo
. Nilai ini ditentukan dalam sel—mulai di Android 12, jikatargetCellWidth
dantargetCellHeight
ditentukan—atau dps jika hanyaminWidth
danminHeight
yang ditentukan. Lihat Atribut ukuran widget.Pastikan tata letak widget setidaknya sesuai dengan ukuran dalam dp ini. Misalnya, sebagian besar host meratakan ikon dan widget dalam formasi petak. Dalam skenario ini, secara default host menambahkan widget menggunakan jumlah sel minimum yang memenuhi batasan
minWidth
danminHeight
.
Selain persyaratan yang tercantum di bagian sebelumnya, versi platform tertentu memperkenalkan fitur yang memberikan tanggung jawab baru kepada host.
Tentukan pendekatan Anda berdasarkan versi Android yang ditargetkan
Android 12
Android 12 (level API 31) menggabungkan List<SizeF>
tambahan yang berisi daftar kemungkinan ukuran dalam dps yang dapat diambil oleh instance widget dalam paket opsi.
Jumlah ukuran yang disediakan bergantung pada implementasi host. Biasanya, host menyediakan dua ukuran untuk ponsel—potret dan lanskap—dan empat ukuran untuk perangkat foldable.
Ada batasan MAX_INIT_VIEW_COUNT
(16) jumlah
RemoteViews
berbeda yang dapat diberikan AppWidgetProvider
kepada
RemoteViews
.
Karena objek AppWidgetProvider
memetakan objek RemoteViews
ke setiap ukuran dalam
List<SizeF>
, jangan berikan lebih dari MAX_INIT_VIEW_COUNT
ukuran.
Android 12 juga memperkenalkan atribut
maxResizeWidth
dan
maxResizeHeight
dalam dps. Sebaiknya widget yang menggunakan setidaknya salah satu atribut ini tidak melebihi ukuran yang ditentukan oleh atribut.
Referensi lainnya
- Lihat dokumentasi referensi
Glance
.