Intent Filter adalah deklarasi deklaratif dalam AndroidManifest.xml yang memberi tahu sistem niat implisit apa yang dapat diproses oleh komponen aplikasi. Menurut Android Developer Guide, filter berisi action, category dan data, yang menjadi dasar sistem merutekan panggilan dari aplikasi lain dan peristiwa sistem. Pengembangan Android menggunakan Intent Filter sebagai mekanisme utama kopling lemah antar komponen dari aplikasi yang berbeda.
Poin Penting
Intent Filter adalah elemen konfigurasi aplikasi Android yang memberi tahu sistem tentang kemampuan komponen untuk memproses tipe tertentu dari niat implisit. Berbeda dengan Intent eksplisit yang menunjuk ke kelas tertentu, Intent implisit hanya berisi deskripsi tindakan yang diminta, dan sistem sendiri menemukan komponen yang cocok berdasarkan filter yang terdaftar.
Filter dideklarasikan di dalam komponen — Activity, Service atau BroadcastReceiver — dalam file AndroidManifest.xml. Setiap filter dapat berisi beberapa elemen action, category dan data. Sebuah komponen dapat memiliki jumlah Intent Filter yang tidak terbatas, masing-masing menggambarkan skenario pemrosesan yang terpisah.
Intent Filter menerapkan prinsip kopling lemah antara komponen aplikasi. Aplikasi A tidak perlu mengetahui keberadaan aplikasi B — ia hanya mengirim Intent dengan deskripsi tindakan, dan sistem merutekannya berdasarkan filter. Mekanisme ini mendasari Share Sheet, pemilihan browser, dan pemrosesan deep link.
Intent eksplisit menunjuk ke kelas spesifik komponen yang akan dijalankan. Mereka digunakan untuk navigasi internal dalam satu aplikasi, ketika pengembang tahu persis Activity mana yang harus dibuka. Intent implisit hanya berisi deskripsi tindakan, dan komponen ditentukan secara dinamis oleh sistem.
Intent Filter bekerja secara eksklusif dengan Intent implisit. Jika dalam Intent ditentukan kelas tertentu, sistem mengabaikan semua filter dan langsung menjalankan komponen yang ditunjuk. Filter hanya diperiksa saat menyelesaikan panggilan implisit, yang menjadikannya elemen kunci interaksi antar aplikasi.
| Karakteristik | Intent Eksplisit | Intent Implisit |
|---|---|---|
| Komponen | Ditentukan secara eksplisit (className) | Ditentukan oleh sistem |
| Intent Filter | Tidak diperlukan | Wajib |
| Contoh | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse("https://example.com")) |
| Keamanan | Lebih tinggi (tanpa penyadapan) | Lebih rendah (kemungkinan konflik) |
Setiap Intent Filter terdiri dari tiga kelompok elemen — action, category dan data — yang kombinasinya menentukan Intent apa yang akan diterima komponen. Filter dianggap berhasil jika Intent sesuai dengan setidaknya satu elemen dari setiap kelompok.
Action menjelaskan tindakan yang dilakukan — melihat, mengedit, mengirim. Category menambahkan konteks pemrosesan tambahan — misalnya kemampuan untuk dijalankan dari browser. Data menentukan format informasi yang diproses melalui URI atau tipe MIME.
Contoh Intent Filter untuk Activity yang membuka tautan ke profil pengguna. Filter mencakup ketiga kelompok elemen untuk perutean yang tepat.
<activity android:name=".ProfileActivity">
<intent-filter>
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile" />
</intent-filter>
</activity>
Perhatikan penyebutan wajib category DEFAULT — tanpanya sistem tidak akan mengirimkan Intent implisit ke komponen. Kategori BROWSABLE ditambahkan jika tautan harus diproses dari browser.
Deep link di Android dikonfigurasi melalui Intent Filter dengan action VIEW dan tag data yang berisi skema, host dan jalur. Saat mengklik tautan berbentuk myapp://profile/42, sistem menemukan Activity dengan filter yang cocok dan menjalankannya dengan URI yang dikirimkan. Penting untuk mengonfigurasi pathPrefix, pathPattern atau path dengan benar untuk pencocokan yang tepat.
Mulai Android 6 (API 23) muncul dukungan untuk App Links — deep link terverifikasi melalui HTTPS. Untuk App Links digunakan Intent Filter yang sama, tetapi dengan verifikasi domain tambahan melalui Digital Asset Links. Setelah verifikasi, sistem secara otomatis membuka aplikasi tanpa dialog pemilihan.
Contoh filter untuk App Link dengan verifikasi melalui tautan HTTPS. Dalam kasus ini skema selalu https, dan host sesuai dengan domain yang ditentukan dalam Digital Asset Links.
<intent-filter android:autoVerify="true">
<action
android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/profile" />
</intent-filter>
Atribut autoVerify memerintahkan sistem untuk memeriksa Digital Asset Links saat pemasangan aplikasi. Jika verifikasi berhasil, aplikasi secara otomatis menjadi penangan default untuk domain dan jalur yang ditentukan.
Setelah sistem memilih komponen untuk memproses Intent, pengembang harus mengekstrak data dari niat masuk ke dalam komponen target. Untuk Activity digunakan metode getIntent() di onCreate(), untuk BroadcastReceiver — metode onReceive(), di mana Intent dikirimkan sebagai parameter.
Ekstraksi data meliputi pengambilan action untuk menentukan tipe operasi, data untuk URI dan parameter ekstra untuk informasi tambahan. Masing-masing elemen ini mungkin tidak ada, sehingga pemeriksaan null sebelum penggunaan adalah wajib.
Contoh pemrosesan deep link masuk dalam Activity di Kotlin. Kode mengekstrak URI dari Intent dan berdasarkan host dan jalur mengambil keputusan navigasi.
class ProfileActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri = intent?.data
if (uri?.host == "profile") {
val userId = uri.lastPathSegment
loadProfile(userId)
}
}
}
Disarankan menggunakan safe call operator untuk memeriksa intent dan data terhadap null, karena aktivitas dapat dijalankan tanpa deep link masuk. Juga perlu memeriksa host dan pathSegment terhadap null sebelum digunakan dalam navigasi.
Jika beberapa aplikasi mendaftarkan Intent Filter yang cocok untuk Intent implisit yang sama, sistem menampilkan dialog pemilihan kepada pengguna. Pengguna dapat memilih aplikasi untuk penggunaan satu kali atau mengatur penangan default. Mulai Android 10, dialog pemilihan hanya ditampilkan pada panggilan pertama, setelah itu sistem mengingat pilihan pengguna.
Untuk mengelola prioritas digunakan atribut android:priority dalam tag intent-filter. Semakin tinggi nilainya, semakin tinggi prioritas komponen dalam penyelesaian konflik. Namun prioritas tidak berfungsi untuk filter dari aplikasi yang berbeda — dalam kasus ini selalu ditampilkan dialog pemilihan, jika tidak ada aplikasi yang ditetapkan sebagai default.
Pengembang dapat secara terprogram memanggil dialog pemilihan melalui Intent.createChooser(), mengirimkan Intent target dan judul. Ini berguna ketika aplikasi ingin secara eksplisit menawarkan pengguna untuk memilih penangan, bahkan jika aplikasi default telah ditetapkan. Misalnya, saat mengirim gambar ke jejaring sosial melalui ACTION_SEND dengan createChooser memastikan dialog ditampilkan terlepas dari pengaturan default.
Salah satu kesalahan paling umum adalah tidak adanya kategori DEFAULT dalam Intent Filter. Pengembang menyalin konfigurasi dari contoh, tetapi lupa menambahkan kategori ini, akibatnya Activity tidak menerima Intent implisit. Sistem tidak melihat filter untuk panggilan implisit, meskipun Intent eksplisit tetap berfungsi.
Kesalahan umum kedua adalah penentuan scheme yang salah dalam tag data tanpa URI lengkap. Jika hanya skema yang ditentukan tetapi host tidak ditentukan, filter akan menerima semua tautan dengan skema ini dari sumber mana pun, yang dapat menyebabkan panggilan yang tidak diinginkan dari sumber yang tidak terverifikasi. Disarankan untuk selalu menentukan setidaknya scheme dan host.
Kesalahan ketiga adalah tidak adanya pemeriksaan intent.data terhadap null dalam kode Activity. Jika Activity dijalankan bukan melalui deep link, tetapi secara standar dari launcher, Intent tidak mengandung URI. Akses ke intent.data tanpa pemeriksaan menyebabkan NullPointerException dan crash aplikasi. Selalu gunakan intent?.data?.toString() dengan operator safe call.
Pertanyaan yang Sering Diajukan
Ya, untuk menerima Intent implisit kategori DEFAULT wajib ada. Tanpanya sistem tidak akan mengirimkan panggilan implisit ke komponen, dan Intent Filter hanya akan bekerja untuk Intent eksplisit yang tidak memeriksa filter.
Tidak ada batasan. Satu Activity dapat berisi berapa pun jumlah Intent Filter. Setiap filter menggambarkan skenario pemrosesan terpisah, misalnya satu filter untuk deep link, lainnya untuk pemrosesan file, ketiga untuk Share Sheet.
Intent Filter adalah mekanisme umum untuk memproses Intent implisit. App Link adalah kasus khusus Intent Filter dengan verifikasi melalui Digital Asset Links, yang secara otomatis menetapkan aplikasi sebagai penangan default untuk tautan HTTPS di domain tertentu.
Ya, Intent Filter dapat dideklarasikan tidak hanya untuk Activity, tetapi juga untuk Service dan BroadcastReceiver. Untuk Service, ini memungkinkan menjalankan layanan latar belakang dari aplikasi lain, untuk BroadcastReceiver — menerima pesan siaran sistem.
Tipe MIME ditentukan dalam tag data melalui atribut mimeType. Filter menentukan tipe data apa yang dapat diproses komponen — misalnya image/* untuk semua gambar atau text/plain hanya untuk teks biasa. Tipe MIME dapat digabungkan dengan skema URI.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga