Intent
adalah objek pesan yang dapat Anda gunakan untuk meminta tindakan
dari komponen aplikasi lain.
Meskipun memfasilitasi komunikasi antar-komponen dalam beberapa cara, ada tiga kasus penggunaan mendasar:
- Memulai aktivitas
Activity
mewakili satu layar dalam aplikasi. Anda dapat memulai instanceActivity
baru dengan meneruskanIntent
kestartActivity()
.Intent
mendeskripsikan aktivitas yang akan dimulai dan membawa data yang diperlukan.Jika Anda ingin menerima hasil dari aktivitas saat selesai, panggil
startActivityForResult()
. Aktivitas Anda akan menerima hasil sebagai objekIntent
terpisah dalam callbackonActivityResult()
aktivitas Anda. Untuk mengetahui informasi selengkapnya, lihat panduan Aktivitas. - Memulai layanan
Service
adalah komponen yang melakukan operasi di latar belakang tanpa antarmuka pengguna. Dengan Android 5.0 (API level 21) dan yang lebih baru, Anda dapat memulai layanan denganJobScheduler
. Untuk mengetahui informasi selengkapnya tentangJobScheduler
, lihatAPI-reference documentation
-nya.Untuk versi yang lebih lama dari Android 5.0 (level API 21), Anda dapat memulai layanan dengan menggunakan metode class
Service
. Anda dapat memulai layanan untuk melakukan operasi satu kali (seperti mendownload file) dengan meneruskanIntent
kestartService()
.Intent
menjelaskan layanan yang akan dimulai dan membawa data yang diperlukan.Jika layanan dirancang dengan antarmuka klien-server, Anda dapat mengikat ke layanan dari komponen lain dengan meneruskan
Intent
kebindService()
. Untuk mengetahui informasi selengkapnya, lihat panduan Layanan. - Menayangkan siaran
Siaran adalah pesan yang bisa diterima aplikasi apa saja. Sistem mengirimkan berbagai siaran untuk peristiwa sistem, seperti saat sistem melakukan booting atau perangkat mulai mengisi daya. Anda dapat mengirim siaran ke aplikasi lain dengan meneruskan
Intent
kesendBroadcast()
atausendOrderedBroadcast()
.
Selebihnya dari halaman ini menjelaskan cara intent bekerja dan cara menggunakannya. Untuk informasi terkait, lihat Berinteraksi dengan Aplikasi Lain dan Membagikan Konten.
Tipe intent
Ada dua tipe intent:
- Intent eksplisit menentukan komponen aplikasi mana yang akan memenuhi intent, dengan menentukan
ComponentName
lengkap. Biasanya, Anda akan menggunakan intent eksplisit untuk memulai komponen di aplikasi Anda sendiri, karena Anda mengetahui nama class aktivitas atau layanan yang ingin Anda mulai. Misalnya, Anda dapat memulai aktivitas baru dalam aplikasi sebagai respons terhadap tindakan pengguna, atau memulai layanan untuk mendownload file di latar belakang. - Intent implisit tidak menyebutkan komponen tertentu, tetapi mendeklarasikan tindakan umum yang akan dilakukan, sehingga komponen dari aplikasi lain dapat menanganinya. Misalnya, jika Anda ingin menampilkan lokasi kepada pengguna di peta, Anda dapat menggunakan intent implisit untuk meminta aplikasi lain yang kompatibel menampilkan lokasi tertentu di peta.
Gambar 1 menunjukkan cara intent digunakan saat memulai aktivitas. Jika objek
Intent
menyebutkan komponen aktivitas tertentu secara eksplisit, sistem akan
langsung memulai komponen tersebut.

Gambar 1. Cara intent implisit dikirimkan melalui sistem untuk memulai aktivitas lain: [1] Aktivitas A membuat Intent
dengan deskripsi tindakan dan meneruskannya ke startActivity()
. [2] Sistem Android menelusuri semua aplikasi untuk menemukan filter intent yang cocok dengan intent. Jika kecocokan ditemukan, [3] sistem akan memulai aktivitas yang cocok (Activity B) dengan memanggil metode onCreate()
dan meneruskan Intent
ke aktivitas tersebut.
Saat Anda menggunakan intent implisit, sistem Android akan menemukan komponen yang sesuai untuk dimulai
dengan membandingkan konten intent dengan filter intent yang dideklarasikan dalam file manifes aplikasi lain di
perangkat. Jika intent cocok dengan filter intent, sistem akan memulai komponen tersebut dan mengirimkan objek Intent
ke komponen tersebut. Jika beberapa filter intent kompatibel, sistem akan menampilkan dialog sehingga pengguna dapat memilih aplikasi yang akan digunakan.
Filter intent adalah ekspresi dalam file manifes aplikasi yang menentukan jenis intent yang ingin diterima komponen. Misalnya, dengan mendeklarasikan filter intent untuk suatu aktivitas, Anda memungkinkan aplikasi lain memulai aktivitas Anda secara langsung dengan jenis intent tertentu. Demikian pula, jika Anda tidak mendeklarasikan filter intent untuk aktivitas, maka aktivitas tersebut hanya dapat dimulai dengan intent eksplisit.
Perhatian: Untuk memastikan bahwa aplikasi Anda aman, selalu
gunakan intent
eksplisit saat memulai Service
dan jangan
menyatakan filter intent untuk layanan Anda. Menggunakan intent implisit untuk memulai layanan dapat
membahayakan keamanan, karena Anda tidak dapat memastikan layanan yang akan merespons intent tersebut,
dan pengguna tidak dapat melihat layanan yang dimulai. Mulai dari Android 5.0 (level API 21), sistem akan
melontarkan pengecualian jika Anda memanggil bindService()
dengan intent implisit.
Membuat intent
Objek Intent
membawa informasi yang digunakan sistem Android untuk menentukan komponen mana yang akan dimulai (seperti nama komponen yang tepat atau kategori komponen yang harus menerima intent), ditambah informasi yang digunakan komponen penerima untuk melakukan tindakan dengan benar (seperti tindakan yang akan dilakukan dan data yang akan ditindaklanjuti).
Informasi utama yang terdapat dalam Intent
adalah sebagai berikut:
- Nama komponen
- Nama komponen yang akan dimulai.
Ini bersifat opsional, tetapi merupakan informasi penting yang membuat intent menjadi eksplisit, yang berarti bahwa intent hanya boleh dikirimkan ke komponen aplikasi yang ditentukan oleh nama komponen. Tanpa nama komponen, intent bersifat implisit dan sistem memutuskan komponen mana yang harus menerima intent berdasarkan informasi intent lainnya (seperti tindakan, data, dan kategori—yang dijelaskan di bawah). Jika perlu memulai komponen tertentu di aplikasi, Anda harus menentukan nama komponen.
Catatan: Saat memulai
Service
, selalu tentukan nama komponen. Jika tidak, Anda tidak dapat memastikan layanan yang akan merespons intent tersebut, dan pengguna tidak dapat melihat layanan yang dimulai.Kolom
Intent
ini adalah objekComponentName
, yang dapat Anda tentukan menggunakan nama class yang sepenuhnya memenuhi syarat dari komponen target, termasuk nama paket aplikasi, misalnya,com.example.ExampleActivity
. Anda dapat menetapkan nama komponen dengansetComponent()
,setClass()
,setClassName()
, atau dengan konstruktorIntent
. - Tindakan
- String yang menentukan tindakan generik yang akan dilakukan (seperti lihat atau pilih).
Dalam kasus intent siaran, hal ini merupakan tindakan yang terjadi dan sedang dilaporkan. Tindakan sebagian besar menentukan struktur intent lainnya—terutama informasi yang ada dalam data dan ekstra.
Anda dapat menentukan tindakan Anda sendiri untuk digunakan oleh intent dalam aplikasi Anda (atau untuk digunakan oleh aplikasi lain untuk memanggil komponen dalam aplikasi Anda), tetapi biasanya Anda menentukan konstanta tindakan yang ditentukan oleh class
Intent
atau class framework lainnya. Berikut beberapa tindakan umum untuk memulai aktivitas:ACTION_VIEW
- Gunakan tindakan ini dalam intent dengan
startActivity()
saat Anda memiliki beberapa informasi yang dapat ditampilkan aktivitas kepada pengguna, seperti foto untuk dilihat di aplikasi galeri, atau alamat untuk dilihat di aplikasi peta. ACTION_SEND
- Juga dikenal sebagai intent berbagi, Anda harus menggunakannya dalam intent dengan
startActivity()
saat Anda memiliki beberapa data yang dapat dibagikan pengguna melalui aplikasi lain, seperti aplikasi email atau aplikasi berbagi media sosial.
Lihat referensi class
Intent
untuk mengetahui konstanta lain yang menentukan tindakan umum. Tindakan lain ditentukan di tempat lain dalam framework Android, seperti diSettings
untuk tindakan yang membuka layar tertentu di aplikasi Setelan sistem.Anda dapat menentukan tindakan untuk intent dengan
setAction()
atau dengan konstruktorIntent
.Jika Anda menentukan tindakan sendiri, pastikan untuk menyertakan nama paket aplikasi Anda sebagai awalan, seperti yang ditunjukkan dalam contoh berikut:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- Data
- URI (objek
Uri
) yang mereferensikan data yang akan ditindaklanjuti dan/atau jenis MIME data tersebut. Jenis data yang diberikan umumnya ditentukan oleh tindakan maksud. Misalnya, jika tindakan adalahACTION_EDIT
, data harus berisi URI dokumen yang akan diedit.Saat membuat intent, sering kali penting untuk menentukan jenis data (jenis MIME-nya) selain URI-nya. Misalnya, aktivitas yang dapat menampilkan gambar mungkin tidak dapat memutar file audio, meskipun format URI-nya bisa serupa. Menentukan jenis MIME data Anda membantu sistem Android menemukan komponen terbaik untuk menerima intent Anda. Namun, jenis MIME terkadang dapat disimpulkan dari URI—terutama saat data adalah URI
content:
. URIcontent:
menunjukkan bahwa data berada di perangkat dan dikontrol olehContentProvider
, yang membuat jenis MIME data terlihat oleh sistem.Untuk menetapkan hanya URI data, panggil
setData()
. Untuk menetapkan hanya jenis MIME, panggilsetType()
. Jika perlu, Anda dapat menetapkan keduanya secara eksplisit dengansetDataAndType()
.Perhatian: Jika Anda ingin menetapkan URI dan jenis MIME, jangan panggil
setData()
dansetType()
karena masing-masing akan membatalkan nilai yang lain. Selalu gunakansetDataAndType()
untuk menetapkan URI dan jenis MIME. - Kategori
- String yang berisi informasi tambahan tentang jenis komponen yang harus menangani intent. Sejumlah deskripsi kategori dapat ditempatkan dalam maksud, tetapi sebagian besar maksud tidak memerlukan kategori.
Berikut beberapa kategori umum:
CATEGORY_BROWSABLE
- Aktivitas target memungkinkan dirinya dimulai oleh browser web untuk menampilkan data yang dirujuk oleh link, seperti gambar atau pesan email.
CATEGORY_LAUNCHER
- Aktivitas adalah aktivitas awal tugas dan tercantum di peluncur aplikasi sistem.
Lihat deskripsi class
Intent
untuk daftar lengkap kategori.Anda dapat menentukan kategori dengan
addCategory()
.
Properti yang tercantum di atas (nama komponen, tindakan, data, dan kategori) mewakili karakteristik yang menentukan dari suatu intent. Dengan membaca properti ini, sistem Android dapat menentukan komponen aplikasi mana yang harus dimulai. Namun, intent dapat membawa informasi tambahan yang tidak memengaruhi cara intent diselesaikan ke komponen aplikasi. Intent juga bisa menyediakan informasi berikut:
- Tambahan
- Pasangan nilai kunci yang membawa informasi tambahan yang diperlukan untuk menyelesaikan
tindakan yang diminta.
Seperti halnya beberapa tindakan menggunakan jenis tertentu URI data, beberapa tindakan juga menggunakan tambahan tertentu.
Anda dapat menambahkan data tambahan dengan berbagai metode
putExtra()
, yang masing-masing menerima dua parameter: nama kunci dan nilai. Anda juga dapat membuat objekBundle
dengan semua data tambahan, lalu menyisipkanBundle
diIntent
denganputExtras()
.Misalnya, saat membuat intent untuk mengirim email dengan
ACTION_SEND
, Anda dapat menentukan penerima to dengan kunciEXTRA_EMAIL
, dan menentukan subject dengan kunciEXTRA_SUBJECT
.Class
Intent
menentukan banyak konstantaEXTRA_*
untuk jenis data standar. Jika Anda perlu mendeklarasikan kunci tambahan Anda sendiri (untuk intent yang diterima aplikasi Anda), pastikan untuk menyertakan nama paket aplikasi Anda sebagai awalan, seperti yang ditunjukkan dalam contoh berikut:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Perhatian: Jangan gunakan data
Parcelable
atauSerializable
saat mengirim intent yang Anda harapkan diterima oleh aplikasi lain. Jika aplikasi mencoba mengakses data dalam objekBundle
, tetapi tidak memiliki akses ke class yang di-parcel atau diserialkan, sistem akan memunculkanRuntimeException
. - Tanda
- Flag ditentukan dalam class
Intent
yang berfungsi sebagai metadata untuk intent. Flag dapat menginstruksikan sistem Android cara meluncurkan aktivitas (misalnya, tugas mana yang harus dimiliki aktivitas) dan cara memperlakukannya setelah diluncurkan (misalnya, apakah aktivitas tersebut termasuk dalam daftar aktivitas terbaru).Untuk mengetahui informasi selengkapnya, lihat metode
setFlags()
.
Contoh intent eksplisit
Intent eksplisit adalah intent yang Anda gunakan untuk meluncurkan komponen aplikasi tertentu, seperti
aktivitas atau layanan tertentu di aplikasi Anda. Untuk membuat intent eksplisit, tentukan
nama komponen untuk objek Intent
—semua
properti intent lainnya bersifat opsional.
Misalnya, jika Anda membuat layanan di aplikasi, bernama DownloadService
, yang dirancang untuk mendownload file dari web, Anda dapat memulainya dengan kode berikut:
Kotlin
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png" val downloadIntent = Intent(this, DownloadService::class.java).apply { data =Uri.parse
(fileUrl) } startService(downloadIntent)
Java
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png" Intent downloadIntent = new Intent(this, DownloadService.class); downloadIntent.setData(Uri.parse
(fileUrl)); startService(downloadIntent);
Konstruktor Intent(Context, Class)
menyediakan Context
aplikasi dan
komponen objek Class
. Dengan demikian, intent ini secara eksplisit memulai class DownloadService
di aplikasi.
Untuk mengetahui informasi selengkapnya tentang cara membuat dan memulai layanan, lihat panduan Layanan.
Contoh intent implisit
Intent implisit menentukan tindakan yang dapat memanggil aplikasi apa pun di perangkat yang dapat melakukan tindakan tersebut. Menggunakan intent implisit berguna saat aplikasi Anda tidak dapat melakukan tindakan, tetapi aplikasi lain mungkin dapat melakukannya dan Anda ingin pengguna memilih aplikasi mana yang akan digunakan.
Misalnya, jika Anda memiliki konten yang ingin Anda bagikan kepada orang lain, buat intent dengan tindakan ACTION_SEND
dan tambahkan ekstra yang menentukan konten yang akan dibagikan. Saat Anda memanggil
startActivity()
dengan maksud tersebut, pengguna dapat
memilih aplikasi yang akan digunakan untuk membagikan konten.
Kotlin
// Create the text message with a string. val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Try to invoke the intent. try { startActivity(sendIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Saat startActivity()
dipanggil, sistem akan memeriksa semua aplikasi yang diinstal untuk menentukan aplikasi mana yang dapat menangani jenis intent ini (intent dengan tindakan ACTION_SEND
dan yang membawa data "text/plain"). Jika hanya ada satu aplikasi yang dapat menanganinya, aplikasi tersebut akan langsung terbuka dan diberi
intent. Jika tidak ada aplikasi lain yang dapat menanganinya, aplikasi Anda dapat menangkap
ActivityNotFoundException
yang terjadi. Jika beberapa aktivitas menerima intent, sistem akan menampilkan dialog seperti yang ditunjukkan pada Gambar 2, sehingga pengguna dapat memilih aplikasi yang akan digunakan.
Informasi selengkapnya tentang meluncurkan aplikasi lain juga diberikan dalam panduan tentang mengirim pengguna ke aplikasi lain.

Gambar 2. Dialog pilihan.
Memaksakan pemilih aplikasi
Jika ada lebih dari satu aplikasi yang merespons intent implisit Anda, pengguna dapat memilih aplikasi yang akan digunakan dan menjadikannya pilihan default untuk tindakan tersebut. Kemampuan untuk memilih aplikasi default berguna saat melakukan tindakan yang berkaitan dengan situasi saat pengguna mungkin ingin selalu menggunakan aplikasi yang sama, seperti saat membuka halaman web (pengguna sering kali lebih memilih satu browser web saja).
Namun, jika beberapa aplikasi dapat merespons intent dan pengguna mungkin ingin menggunakan aplikasi yang berbeda setiap kali, Anda harus menampilkan dialog pemilih secara eksplisit. Dialog pemilih akan meminta
pengguna untuk memilih aplikasi yang akan digunakan untuk tindakan tersebut (pengguna tidak dapat memilih aplikasi default untuk
tindakan tersebut). Misalnya, saat aplikasi Anda melakukan "berbagi" dengan tindakan ACTION_SEND
, pengguna mungkin ingin berbagi menggunakan aplikasi lain, bergantung pada situasi mereka saat ini, jadi Anda harus selalu menggunakan dialog pilihan, seperti yang ditunjukkan pada Gambar 2.
Untuk menampilkan pemilih, buat Intent
menggunakan createChooser()
dan teruskan ke startActivity()
, seperti yang ditunjukkan dalam contoh berikut.
Contoh ini menampilkan dialog berisi daftar aplikasi yang merespons intent yang diteruskan ke metode createChooser()
dan menggunakan teks yang disediakan sebagai judul dialog.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) ... // Always use string resources for UI text. // This says something like "Share this photo with" val title: String = resources.getString(R.string.chooser_title) // Create intent to show the chooser dialog val chooser: Intent = Intent.createChooser(sendIntent, title) // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(chooser) }
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
Mendeteksi peluncuran intent yang tidak aman
Aplikasi Anda mungkin meluncurkan intent untuk beralih di antara komponen di dalam aplikasi, atau menjalankan tindakan atas nama aplikasi lain. Untuk meningkatkan keamanan platform, Android 12 (level API 31) dan yang lebih tinggi menyediakan fitur proses debug yang memperingatkan Anda jika aplikasi Anda melakukan peluncuran intent yang tidak aman. Misalnya, aplikasi Anda mungkin melakukan peluncuran intent bertingkat yang tidak aman, yaitu intent yang diteruskan sebagai tambahan dalam intent lain.
Jika aplikasi Anda melakukan kedua tindakan berikut, sistem akan mendeteksi peluncuran intent yang tidak aman, dan pelanggaran StrictMode akan terjadi:
- Aplikasi Anda memisahkan intent bertingkat dari tambahan intent yang dikirim.
- Aplikasi Anda akan segera memulai komponen
aplikasi menggunakan intent bertingkat tersebut,
seperti meneruskan intent ke
startActivity()
,startService()
, ataubindService()
.
Untuk mengetahui detail selengkapnya tentang cara mengidentifikasi situasi ini dan melakukan perubahan pada aplikasi Anda, baca postingan blog tentang Intent Bertingkat Android di Medium.
Memeriksa peluncuran intent yang tidak aman
Untuk memeriksa peluncuran intent yang tidak aman di aplikasi Anda, panggil
detectUnsafeIntentLaunch()
saat Anda mengonfigurasi VmPolicy
, seperti yang ditunjukkan dalam cuplikan kode berikut. Jika
aplikasi Anda mendeteksi adanya pelanggaran StrictMode, Anda mungkin ingin menghentikan eksekusi aplikasi untuk
melindungi informasi yang berpotensi sensitif.
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()) }
Java
protected void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()); }
Menggunakan intent dengan lebih bertanggung jawab
Untuk meminimalkan kemungkinan peluncuran intent yang tidak aman dan pelanggaran StrictMode, ikuti praktik terbaik berikut.
Salin saja tambahan esensial ke dalam intent dan lakukan
pembersihan dan validasi yang diperlukan. Aplikasi Anda mungkin akan menyalin tambahan dari satu intent ke intent lain yang digunakan untuk meluncurkan komponen baru. Hal ini terjadi saat aplikasi Anda
memanggil
putExtras(Intent)
atau
putExtras(Bundle)
.
Jika aplikasi Anda melakukan salah satu operasi ini, salin saja tambahan yang
diharapkan komponen penerima. Jika intent lain (yang menerima salinan)
meluncurkan komponen yang tidak
diekspor, bersihkan dan
validasikan tambahan sebelum menyalinnya ke intent yang meluncurkan
komponen.
Jangan mengekspor komponen aplikasi Anda secara tidak perlu. Misalnya, jika Anda
bermaksud meluncurkan komponen aplikasi menggunakan intent bertingkat internal, tetapkan
atribut android:exported
komponen tersebut ke false
.
Gunakan PendingIntent
, bukan
intent bertingkat. Dengan demikian, saat aplikasi lain memisahkan PendingIntent
dari
Intent
yang memuatnya, aplikasi lain dapat meluncurkan PendingIntent
menggunakan
identitas aplikasi Anda. Konfigurasi ini memungkinkan aplikasi lain meluncurkan
komponen apa pun dengan aman, termasuk komponen yang tidak diekspor, di aplikasi Anda.
Diagram pada gambar 2 menunjukkan cara sistem meneruskan kontrol dari aplikasi (klien) Anda ke aplikasi (layanan) lain, dan kembali ke aplikasi Anda:
- Aplikasi Anda membuat intent yang memanggil aktivitas di aplikasi lain. Dalam
intent tersebut, Anda menambahkan objek
PendingIntent
sebagai tambahan. Pending intent ini memanggil komponen di aplikasi Anda; komponen ini tidak diekspor. - Setelah menerima intent aplikasi Anda, aplikasi lain akan mengekstrak objek
PendingIntent
bertingkat. - Aplikasi lain memanggil metode
send()
pada objekPendingIntent
. - Setelah meneruskan kembali kontrol ke aplikasi Anda, sistem akan memanggil intent yang tertunda menggunakan konteks aplikasi Anda.
Gambar 2. Diagram komunikasi antaraplikasi saat menggunakan pending intent bertingkat.
Menerima intent implisit
Untuk mengiklankan intent implisit yang dapat diterima aplikasi Anda, deklarasikan satu atau beberapa filter intent untuk
setiap komponen aplikasi Anda dengan elemen <intent-filter>
dalam file manifes.
Setiap filter intent menentukan jenis intent yang diterimanya berdasarkan tindakan, data, dan kategori intent. Sistem mengirimkan intent implisit ke komponen aplikasi Anda hanya jika
intent dapat melewati salah satu filter intent Anda.
Catatan: Intent eksplisit selalu dikirim ke targetnya, terlepas dari filter intent yang dideklarasikan komponen.
Komponen aplikasi harus mendeklarasikan filter terpisah untuk setiap tugas unik yang dapat dilakukannya.
Misalnya, satu aktivitas di aplikasi galeri gambar dapat memiliki dua filter: satu filter
untuk melihat gambar, dan filter lainnya untuk mengedit gambar. Saat aktivitas dimulai, aktivitas akan memeriksa Intent
dan memutuskan cara berperilaku berdasarkan informasi di Intent
(seperti menampilkan atau tidak menampilkan kontrol editor).
Setiap filter intent ditentukan oleh elemen <intent-filter>
dalam file manifes aplikasi, yang disarangkan dalam komponen aplikasi yang sesuai (seperti
elemen <activity>
).
Di setiap komponen aplikasi yang menyertakan elemen <intent-filter>
,
tetapkan nilai untuk
android:exported
secara eksplisit.
Atribut ini menunjukkan apakah komponen aplikasi dapat diakses oleh aplikasi lain. Dalam beberapa situasi, seperti aktivitas yang filter intent-nya menyertakan kategori LAUNCHER
, sebaiknya tetapkan atribut ini ke true
. Jika tidak,
lebih aman untuk menetapkan atribut ini ke false
.
Peringatan: Jika aktivitas, layanan, atau penerima siaran
di aplikasi Anda menggunakan filter intent dan tidak menetapkan nilai
untuk android:exported
secara eksplisit, aplikasi Anda tidak dapat diinstal di perangkat yang
menjalankan Android 12 atau yang lebih tinggi.
Di dalam <intent-filter>
,
Anda dapat menentukan jenis intent yang akan diterima menggunakan satu atau beberapa
dari tiga elemen ini:
<action>
- Mendeklarasikan tindakan intent yang diterima, dalam atribut
name
. Nilai harus berupa nilai string literal dari tindakan, bukan konstanta class. <data>
- Mendeklarasikan jenis data yang diterima, menggunakan satu atau beberapa atribut yang menentukan berbagai
aspek URI data (
scheme
,host
,port
,path
) dan jenis MIME. <category>
- Mendeklarasikan kategori intent yang diterima, dalam atribut
name
. Nilai harus berupa nilai string literal dari tindakan, bukan konstanta class.Catatan: Untuk menerima intent implisit, Anda harus menyertakan kategori
CATEGORY_DEFAULT
dalam filter intent. MetodestartActivity()
danstartActivityForResult()
memperlakukan semua intent seolah-olah mendeklarasikan kategoriCATEGORY_DEFAULT
. Jika Anda tidak mendeklarasikan kategori ini dalam filter intent, tidak ada intent implisit yang akan dicocokkan ke aktivitas Anda.
Misalnya, berikut adalah deklarasi aktivitas dengan filter intent untuk menerima intent
ACTION_SEND
saat jenis datanya adalah teks:
<activity android:name="ShareActivity" android:exported="false"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Anda dapat membuat filter yang menyertakan lebih dari satu instance
<action>
,
<data>
, atau
<category>
.
Jika Anda melakukannya, Anda harus memastikan bahwa komponen dapat menangani semua
kombinasi elemen filter tersebut.
Jika Anda ingin menangani beberapa jenis intent, tetapi hanya dalam kombinasi jenis tindakan, data, dan kategori tertentu, Anda perlu membuat beberapa filter intent.
Maksud implisit diuji terhadap filter dengan membandingkan maksud dengan masing-masing tiga elemen. Agar dikirim ke komponen, intent harus lolos ketiga pengujian tersebut. Jika gagal mencocokkan salah satunya, sistem Android tidak akan mengirimkan intent ke komponen. Namun, karena komponen dapat memiliki beberapa filter intent, intent yang tidak melewati salah satu filter komponen dapat melewati filter lain. Informasi selengkapnya tentang cara sistem menyelesaikan intent diberikan di bagian di bawah tentang Penyelesaian Intent.
Perhatian: Menggunakan filter intent bukanlah cara yang aman untuk mencegah aplikasi lain memulai komponen Anda. Meskipun filter intent membatasi komponen untuk merespons hanya jenis intent implisit tertentu, aplikasi lain berpotensi memulai komponen aplikasi Anda dengan menggunakan intent eksplisit jika developer menentukan nama komponen Anda.
Jika penting agar hanya aplikasi Anda sendiri yang dapat memulai salah satu komponen Anda,
jangan deklarasikan filter intent dalam manifes Anda. Sebagai gantinya, tetapkan
atribut exported
ke "false"
untuk komponen tersebut.
Demikian pula, untuk menghindari menjalankan Service
aplikasi lain secara tidak sengaja, selalu gunakan intent eksplisit untuk memulai layanan Anda sendiri.
Catatan:
Untuk semua aktivitas, Anda harus mendeklarasikan filter intent dalam file manifes.
Namun, filter untuk penerima siaran dapat didaftarkan secara dinamis dengan memanggil
registerReceiver()
. Kemudian, Anda dapat membatalkan pendaftaran penerima dengan unregisterReceiver()
. Dengan melakukannya, aplikasi Anda dapat memproses siaran tertentu hanya selama jangka waktu yang ditentukan saat aplikasi Anda berjalan.
Contoh filter
Untuk menunjukkan beberapa perilaku filter intent, berikut contoh dari file manifes aplikasi berbagi media sosial:
<activity android:name="MainActivity" android:exported="true"> <!-- This activity is the main entry, should appear in app launcher --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ShareActivity" android:exported="false"> <!-- This activity handles "SEND" actions with text data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <action android:name="android.intent.action.SEND_MULTIPLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.google.panorama360+jpg"/> <data android:mimeType="image/*"/> <data android:mimeType="video/*"/> </intent-filter> </activity>
Aktivitas pertama, MainActivity
, adalah titik entri utama aplikasi—aktivitas yang terbuka saat pengguna pertama kali meluncurkan aplikasi dengan ikon peluncur:
- Tindakan
ACTION_MAIN
menunjukkan bahwa ini adalah titik entri utama dan tidak mengharapkan data intent apa pun. - Kategori
CATEGORY_LAUNCHER
menunjukkan bahwa ikon aktivitas ini harus ditempatkan di peluncur aplikasi sistem. Jika elemen<activity>
tidak menentukan ikon denganicon
, sistem akan menggunakan ikon dari elemen<application>
.
Keduanya harus dipasangkan bersama agar aktivitas muncul dalam peluncur aplikasi.
Aktivitas kedua, ShareActivity
, dimaksudkan untuk memfasilitasi berbagi konten teks dan media. Meskipun pengguna dapat memasuki aktivitas ini dengan menavigasi ke aktivitas tersebut dari MainActivity
, mereka juga dapat memasuki ShareActivity
secara langsung dari aplikasi lain yang mengeluarkan intent implisit yang cocok dengan salah satu dari dua filter intent.
Catatan: Jenis MIME,
application/vnd.google.panorama360+jpg
, adalah jenis data khusus yang menentukan
foto panorama, yang dapat Anda tangani dengan Google
Panorama API.
Mencocokkan intent dengan filter intent aplikasi lain
Jika aplikasi lain menargetkan Android 13 (level API 33) atau yang lebih tinggi, aplikasi tersebut dapat menangani intent aplikasi Anda hanya jika intent Anda cocok dengan tindakan dan kategori elemen
<intent-filter>
di aplikasi lain tersebut. Jika sistem tidak menemukan kecocokan, sistem akan menampilkan
ActivityNotFoundException
.
Aplikasi pengirim harus menangani
pengecualian ini.
Demikian pula, jika Anda mengupdate aplikasi sehingga menargetkan Android 13
atau yang lebih tinggi, semua intent yang berasal dari aplikasi eksternal hanya akan dikirim ke
komponen aplikasi yang diekspor jika intent tersebut cocok dengan tindakan dan
kategori elemen <intent-filter>
yang dideklarasikan aplikasi Anda. Perilaku ini terjadi terlepas dari versi SDK target aplikasi pengirim.
Dalam kasus berikut, pencocokan intent tidak diterapkan:
- Intent yang dikirim ke komponen yang tidak mendeklarasikan filter intent apa pun.
- Intent yang berasal dari dalam aplikasi yang sama.
- Intent yang berasal dari sistem; yaitu, intent yang dikirim dari
"UID sistem" (uid=1000). Aplikasi sistem mencakup
system_server
dan aplikasi yang menyetelandroid:sharedUserId
keandroid.uid.system
. - Intent yang berasal dari root.
Pelajari lebih lanjut pencocokan niat.
Menggunakan intent tertunda
Objek PendingIntent
adalah wrapper di sekitar objek Intent
. Tujuan utama PendingIntent
adalah untuk memberikan izin ke aplikasi asing
untuk menggunakan Intent
yang disertakan seolah-olah dieksekusi dari
proses aplikasi Anda sendiri.
Kasus penggunaan utama untuk intent tertunda mencakup hal berikut:
- Mendeklarasikan intent yang akan dieksekusi saat pengguna melakukan tindakan dengan Notifikasi
(
NotificationManager
sistem Android mengeksekusiIntent
). - Mendeklarasikan intent yang akan dieksekusi saat pengguna melakukan tindakan dengan
Widget Aplikasi
(aplikasi Layar utama menjalankan
Intent
). - Mendeklarasikan intent untuk dieksekusi pada waktu mendatang yang ditentukan (
AlarmManager
sistem Android mengeksekusiIntent
).
Sama seperti setiap objek Intent
yang dirancang untuk ditangani oleh jenis komponen aplikasi tertentu (baik Activity
, Service
, atau BroadcastReceiver
), PendingIntent
juga harus dibuat dengan pertimbangan yang sama. Saat menggunakan intent tertunda, aplikasi Anda tidak
mengeksekusi intent dengan panggilan seperti startActivity()
. Sebagai gantinya, Anda harus mendeklarasikan jenis komponen yang diinginkan saat membuat
PendingIntent
dengan memanggil metode pembuat yang sesuai:
PendingIntent.getActivity()
untukIntent
yang memulaiActivity
.PendingIntent.getService()
untukIntent
yang memulaiService
.PendingIntent.getBroadcast()
untukIntent
yang memulaiBroadcastReceiver
.
Kecuali jika aplikasi Anda menerima intent tertunda dari aplikasi lain,
metode di atas untuk membuat PendingIntent
mungkin merupakan satu-satunya
metode PendingIntent
yang akan Anda butuhkan.
Setiap metode mengambil Context
aplikasi saat ini, Intent
yang ingin Anda gabungkan, dan satu atau beberapa tanda yang menentukan cara penggunaan intent (seperti apakah intent dapat digunakan lebih dari sekali).
Untuk mengetahui informasi selengkapnya tentang penggunaan intent tertunda, lihat dokumentasi untuk setiap kasus penggunaan masing-masing, seperti dalam panduan API Notifikasi dan Widget Aplikasi.
Menentukan mutabilitas
Jika aplikasi Anda menargetkan Android 12 atau yang lebih tinggi, Anda harus menentukan
mutabilitas setiap objek PendingIntent
yang dibuat oleh aplikasi Anda. Untuk menyatakan bahwa objek PendingIntent
tertentu
dapat diubah atau tidak, gunakan
tanda PendingIntent.FLAG_MUTABLE
atau
PendingIntent.FLAG_IMMUTABLE
.
Jika aplikasi Anda mencoba membuat objek PendingIntent
tanpa menyetel tanda mutabilitas, sistem akan menampilkan
IllegalArgumentException
, dan
pesan berikut akan muncul di Logcat:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
Membuat intent tertunda yang tidak dapat diubah jika memungkinkan
Pada umumnya, aplikasi Anda harus membuat objek PendingIntent
yang tidak dapat diubah, seperti
yang ditampilkan dalam cuplikan kode berikut. Jika objek PendingIntent
tidak dapat diubah,
aplikasi lain tidak dapat mengubah intent untuk menyesuaikan hasil pemanggilan
intent.
Kotlin
val pendingIntent = PendingIntent.getActivity(applicationContext, REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE);
Namun, kasus penggunaan tertentu memerlukan objek PendingIntent
yang dapat diubah:
- Mendukung tindakan balasan langsung dalam
notifikasi. Balasan
langsung memerlukan perubahan pada data klip dalam objek PendingIntent
yang terkait dengan balasan. Biasanya, Anda meminta perubahan ini dengan meneruskan
FILL_IN_CLIP_DATA
sebagai tanda ke metodefillIn()
. - Mengaitkan notifikasi dengan framework Android Auto, menggunakan instance
CarAppExtender
. - Menempatkan percakapan dalam balon menggunakan instance
PendingIntent
. ObjekPendingIntent
yang dapat berubah memungkinkan sistem menerapkan flag yang benar, sepertiFLAG_ACTIVITY_MULTIPLE_TASK
danFLAG_ACTIVITY_NEW_DOCUMENT
. - Meminta informasi lokasi perangkat dengan memanggil
requestLocationUpdates()
atau API serupa. ObjekPendingIntent
yang dapat diubah memungkinkan sistem menambahkan ekstra intent yang merepresentasikan peristiwa siklus proses lokasi. Peristiwa ini mencakup perubahan lokasi dan penyedia yang tersedia. - Menjadwalkan alarm menggunakan
AlarmManager
. ObjekPendingIntent
yang dapat diubah memungkinkan sistem menambahkanEXTRA_ALARM_COUNT
ekstra intent. Ekstra ini menunjukkan berapa kali alarm berulang telah dipicu. Dengan berisi ekstra ini, intent dapat secara akurat memberi tahu aplikasi apakah alarm berulang dipicu beberapa kali, seperti saat perangkat dalam mode tidur.
Jika aplikasi Anda membuat objek PendingIntent
yang dapat diubah, sebaiknya
gunakan intent eksplisit dan isi
ComponentName
. Dengan begitu, setiap kali
aplikasi lain memanggil PendingIntent
dan meneruskan kontrol kembali ke aplikasi Anda,
komponen yang sama di aplikasi Anda akan selalu dimulai.
Menggunakan intent eksplisit dalam intent tertunda
Untuk menentukan dengan lebih baik cara aplikasi lain dapat menggunakan intent tertunda aplikasi Anda, selalu bungkus intent tertunda di sekitar intent eksplisit. Untuk membantu mengikuti praktik terbaik ini, lakukan hal berikut:
- Periksa apakah kolom tindakan, paket, dan komponen intent dasar telah ditetapkan.
-
Gunakan
FLAG_IMMUTABLE
, yang ditambahkan di Android 6.0 (level API 23), untuk membuat intent tertunda. Flag ini mencegah aplikasi yang menerimaPendingIntent
agar tidak mengisi properti yang kosong. JikaminSdkVersion
aplikasi Anda adalah22
atau lebih rendah, Anda dapat memberikan keamanan dan kompatibilitas secara bersamaan menggunakan kode berikut:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
Resolusi intent
Saat menerima intent implisit untuk memulai aktivitas, sistem akan menelusuri aktivitas terbaik untuk intent tersebut dengan membandingkannya dengan filter intent berdasarkan tiga aspek:
- Beraksi.
- Data (baik URI maupun tipe data)
- Kategori.
Bagian berikut menjelaskan cara intent dicocokkan dengan komponen yang sesuai sesuai dengan deklarasi filter intent dalam file manifes aplikasi.
Pengujian tindakan
Untuk menentukan tindakan intent yang diterima, filter intent dapat mendeklarasikan nol atau lebih elemen
<action>
, seperti yang ditunjukkan dalam contoh berikut:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
Agar lulus filter ini, tindakan yang ditentukan dalam Intent
harus cocok dengan salah satu tindakan yang tercantum dalam filter.
Jika filter tidak mencantumkan tindakan apa pun, tidak ada yang dapat dicocokkan
dengan intent, sehingga semua intent gagal dalam pengujian. Namun, jika Intent
tidak menentukan tindakan, Intent
tersebut akan lulus pengujian selama filter
berisi setidaknya satu tindakan.
Pengujian kategori
Untuk menentukan kategori intent yang diterima, filter intent dapat mendeklarasikan nol atau lebih elemen
<category>
, seperti yang ditunjukkan pada contoh berikut:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
Agar intent lulus pengujian kategori, setiap kategori di Intent
harus cocok dengan kategori dalam filter. Kebalikannya tidak diperlukan—filter intent dapat
mendeklarasikan lebih banyak kategori daripada yang ditentukan dalam Intent
dan
Intent
masih lulus. Oleh karena itu, intent tanpa kategori
selalu lulus pengujian ini, terlepas dari kategori apa yang dideklarasikan dalam filter.
Catatan:
Android secara otomatis menerapkan kategori CATEGORY_DEFAULT
ke semua intent implisit yang diteruskan ke startActivity()
dan startActivityForResult()
.
Jika Anda ingin aktivitas Anda menerima intent implisit, aktivitas tersebut harus menyertakan kategori untuk "android.intent.category.DEFAULT"
dalam filter intentnya, seperti yang ditunjukkan dalam contoh <intent-filter>
sebelumnya.
Pengujian data
Untuk menentukan data intent yang diterima, filter intent dapat mendeklarasikan nol atau lebih elemen
<data>
, seperti yang ditunjukkan dalam contoh berikut:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
Setiap elemen <data>
dapat menentukan struktur URI dan jenis data (jenis media MIME).
Setiap bagian URI adalah atribut
terpisah: scheme
, host
, port
,
dan path
:
<scheme>://<host>:<port>/<path>
Contoh berikut menampilkan nilai yang mungkin untuk atribut ini:
content://com.example.project:200/folder/subfolder/etc
Dalam URI ini, skemanya adalah content
, host-nya adalah com.example.project
,
port-nya adalah 200
, dan jalur-nya adalah folder/subfolder/etc
.
Setiap atribut ini bersifat opsional dalam elemen <data>
,
tetapi ada dependensi linear:
- Jika skema tidak ditetapkan, host akan diabaikan.
- Jika host tidak ditetapkan, porta akan diabaikan.
- Jika skema dan host tidak ditetapkan, jalur akan diabaikan.
Saat URI dalam intent dibandingkan dengan spesifikasi URI dalam filter, URI tersebut hanya dibandingkan dengan bagian URI yang disertakan dalam filter. Contoh:
- Jika filter hanya menentukan skema, semua URI dengan skema tersebut cocok dengan filter.
- Jika filter menentukan skema dan otoritas, tetapi tidak ada jalur, semua URI dengan skema dan otoritas yang sama akan lulus filter, terlepas dari jalurnya.
- Jika filter menentukan skema, otoritas, dan jalur, hanya URI dengan skema, otoritas, dan jalur yang sama yang lulus filter.
Catatan: Spesifikasi jalur dapat berisi tanda bintang (*) sebagai karakter pengganti untuk hanya mencocokkan nama jalur secara parsial.
Uji data membandingkan URI dan jenis MIME dalam intent dengan URI dan jenis MIME yang ditentukan dalam filter. Aturannya adalah sebagai berikut:
- Intent yang tidak berisi URI maupun jenis MIME akan lulus pengujian hanya jika filter tidak menentukan URI atau jenis MIME apa pun.
- Intent yang berisi URI, tetapi tidak ada jenis MIME (baik eksplisit maupun dapat disimpulkan dari URI), lulus pengujian hanya jika URI-nya cocok dengan format URI filter dan filter juga tidak menentukan jenis MIME.
- Intent yang berisi jenis MIME, tetapi bukan URI, lulus pengujian hanya jika filter mencantumkan jenis MIME yang sama dan tidak menentukan format URI.
- Intent yang berisi URI dan jenis MIME (baik eksplisit maupun dapat disimpulkan dari
URI) lulus bagian jenis MIME dari pengujian hanya jika
jenis tersebut cocok dengan jenis yang tercantum dalam filter. Item lulus bagian URI pengujian
jika URI-nya cocok dengan URI dalam filter atau jika memiliki URI
content:
ataufile:
dan filter tidak menentukan URI. Dengan kata lain, komponen dianggap mendukung datacontent:
danfile:
jika filternya hanya mencantumkan satu jenis MIME.
Catatan: Jika intent menentukan URI atau jenis MIME, pengujian data akan gagal jika tidak ada elemen <data>
dalam <intent-filter>
.
Aturan terakhir ini, aturan (d), mencerminkan ekspektasi
bahwa komponen dapat mengambil data lokal dari file atau penyedia konten.
Oleh karena itu, filter mereka dapat mencantumkan hanya jenis data dan tidak perlu secara eksplisit
menyebutkan skema content:
dan file:
.
Contoh berikut menunjukkan kasus umum saat elemen <data>
memberi tahu Android bahwa komponen dapat mengambil data gambar dari penyedia
konten dan menampilkannya:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
Filter yang menentukan jenis data, tetapi bukan URI, mungkin yang paling umum karena sebagian besar data yang tersedia diberikan oleh penyedia konten.
Konfigurasi umum yang lain adalah filter dengan skema dan tipe data. Misalnya, elemen <data>
seperti berikut memberi tahu Android bahwa
komponen dapat mengambil data video dari jaringan untuk melakukan tindakan:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Pencocokan intent
Intent dicocokkan dengan filter intent tidak hanya untuk menemukan komponen
target yang akan diaktifkan, tetapi juga untuk menemukan sesuatu tentang set
komponen di perangkat. Misalnya, aplikasi Beranda mengisi peluncur aplikasi
dengan menemukan semua aktivitas dengan filter intent yang menentukan
tindakan ACTION_MAIN
dan
kategori CATEGORY_LAUNCHER
.
Pencocokan hanya berhasil jika tindakan dan kategori dalam Intent cocok dengan filter, seperti yang dijelaskan dalam dokumentasi untuk class IntentFilter
.
Aplikasi Anda bisa menggunakan pencocokan intent dengan cara serupa.
PackageManager
memiliki serangkaian metode query...()
yang menampilkan semua komponen yang dapat menerima intent tertentu dan serangkaian metode resolve...()
serupa yang menentukan komponen terbaik untuk merespons intent. Misalnya,
queryIntentActivities()
menampilkan daftar semua aktivitas yang dapat menjalankan
intent yang diteruskan sebagai argumen, dan queryIntentServices()
menampilkan daftar layanan serupa.
Kedua metode tidak mengaktifkan komponen; keduanya hanya mencantumkan komponen yang dapat merespons. Ada metode serupa, queryBroadcastReceivers()
, untuk penerima siaran.