Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Intent dan Filter Intent

Intent adalah objek perpesanan yang bisa Anda gunakan untuk meminta tindakan dari komponen aplikasi. Meskipun intent mempermudah komunikasi antar komponen dengan beberapa cara, ada tiga kasus penggunaan yang mendasar:

  • Memulai aktivitas

    Activity merepresentasikan satu layar dalam aplikasi. Anda bisa memulai instance baru Activity dengan meneruskan Intent ke startActivity(). Intent menjelaskan aktivitas yang akan dimulai dan membawa data yang diperlukan.

    Jika Anda ingin menerima hasil dari aktivitas setelah selesai, panggil startActivityForResult(). Aktivitas Anda menerima hasil sebagai objek Intent terpisah dalam callback onActivityResult() aktivitas Anda. Untuk 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 bisa memulai layanan dengan JobScheduler. Untuk informasi selengkapnya tentang JobScheduler, lihat API-reference documentation-nya.

    Untuk versi sebelum Android 5.0 (API level 21), Anda bisa memulai layanan menggunakan metode class Service. Anda bisa memulai layanan untuk melakukan operasi satu-kali (misalnya mendownload file) dengan meneruskan Intent ke startService(). Intent menjelaskan layanan yang akan dimulai dan membawa data yang diperlukan.

    Jika layanan didesain dengan antarmuka pengguna klien-server, Anda bisa menautkan ke layanan dari komponen lain dengan meneruskan Intent ke bindService(). Untuk informasi selengkapnya, lihat panduan Layanan.

  • Mengirimkan siaran

    Siaran adalah pesan yang bisa diterima aplikasi apa saja. Sistem mengirimkan beragam siaran untuk peristiwa sistem, seperti saat sistem melakukan booting atau perangkat mulai mengisi daya. Anda bisa mengirimkan siaran ke aplikasi lain dengan meneruskan Intent ke sendBroadcast() atau sendOrderedBroadcast().

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 aplikasi mana yang akan memenuhi persyaratan intent, dengan menyediakan nama paket aplikasi target maupun nama class komponen yang sepenuhnya memenuhi syarat. Anda biasanya akan menggunakan intent eksplisit untuk memulai sebuah komponen pada aplikasi Anda sendiri, karena Anda mengetahui nama class dari aktivitas atau layanan yang ingin dimulai. Misalnya, Anda mungkin memulai aktivitas baru pada aplikasi sebagai respons terhadap tindakan pengguna, atau mulai layanan untuk mendownload file di latar belakang.
  • Intent implisit tidak menetapkan komponen tertentu, melainkan mendeklarasikan tindakan umum yang akan dilakukan, yang memungkinkan komponen aplikasi lain untuk menanganinya. Misalnya, jika ingin menampilkan sebuah lokasi pengguna di peta, Anda bisa menggunakan intent implisit untuk meminta aplikasi lain yang mampu menunjukkan lokasi yang telah ditetapkan di peta tersebut.

Gambar 1 menunjukkan cara intent digunakan saat memulai aktivitas. Jika objek Intent memberi nama komponen aktivitas tertentu secara eksplisit, sistem akan segera memulai komponen tersebut.

Gambar 1. Cara intent implisit disampaikan melalui sistem untuk memulai aktivitas lain: [1] Aktivitas A membuat sebuah Intent dengan keterangan tindakan dan meneruskannya ke startActivity(). [2] Sistem Android akan menelusuri semua aplikasi untuk filter intent yang cocok dengan intent tersebut. Jika ada yang cocok, [3] sistem akan memulai aktivitas mencocokkan (Aktivitas B) dengan memanggil metode onCreate() dan meneruskannya ke Intent.

Jika Anda menggunakan intent implisit, sistem Android akan menemukan komponen yang sesuai untuk memulai 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 mengiriminya objek Intent. Jika banyak filter intent yang kompatibel, sistem menampilkan dialog sehingga pengguna bisa memilih aplikasi yang akan digunakan.

Filter intent adalah ekspresi dalam file manifes aplikasi yang menetapkan tipe intent yang akan diterima komponen. Misalnya, dengan mendeklarasikan filter intent untuk aktivitas, Anda akan memungkinkan aplikasi lain untuk langsung memulai aktivitas Anda dengan intent tertentu. Demikian pula, jika Anda tidak mendeklarasikan filter intent untuk suatu aktivitas, maka aktivitas tersebut hanya bisa dimulai dengan intent eksplisit.

Perhatian: Untuk memastikan aplikasi Anda aman, selalu gunakan intent eksplisit saat memulai Service dan jangan mendeklarasikan filter intent untuk layanan. Menggunakan intent implisit untuk memulai layanan akan menimbulkan bahaya keamanan karena Anda tidak bisa memastikan layanan apa yang akan merespons intent, dan pengguna tidak bisa melihat layanan mana yang dimulai. Mulai dari Android 5.0 (API level 21), sistem 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 (misalnya nama persis dari suatu komponen atau kategori komponen yang seharusnya menerima intent), ditambah informasi yang digunakan komponen penerima untuk melakukan tindakan dengan benar (misalnya tindakan yang harus dilakukan dan data yang harus diolah).

Informasi utama yang dimuat dalam Intent adalah sebagai berikut:

Nama komponen
Nama komponen yang akan dimulai.

Ini opsional, namun merupakan bagian informasi penting yang membuat intent menjadi eksplisit, yaitu intent harus dikirim hanya ke komponen aplikasi yang ditentukan oleh nama komponen. Tanpa nama komponen, intent menjadi implisit dan sistem akan memutuskan komponen mana yang harus menerima intent berdasarkan informasi intent lain (misalnya tindakan, data, dan kategori—yang dijelaskan di bawah ini). Jika ingin memulai komponen tertentu dalam aplikasi, Anda harus menetapkan nama komponen tersebut.

Catatan: Saat memulai Service, selalu tetapkan nama komponen. Jika tidak, maka Anda tidak bisa memastikan layanan apa yang akan merespons intent tersebut, dan pengguna tidak bisa melihat layanan mana yang dimulai.

Kolom Intent ini adalah objek ComponentName, yang bisa Anda tetapkan menggunakan nama class yang sepenuhnya memenuhi syarat dari komponen target, termasuk nama paket aplikasi, misalnya, com.example.ExampleActivity. Anda bisa menyetel nama komponen dengan setComponent(), setClass(), setClassName(), atau dengan konstruktor Intent.

Aksi
String yang menetapkan tindakan generik untuk dilakukan (misalnya lihat atau pilih).

Dalam kasus intent siaran, hal ini merupakan tindakan yang terjadi dan sedang dilaporkan. Sebagian besar tindakan menentukan bagaimana sisa intent terstruktur—khususnya informasi yang terkandung pada data dan informasi tambahan.

Anda bisa menetapkan tindakan sendiri yang akan digunakan oleh intent dalam aplikasi (atau digunakan oleh aplikasi lain untuk memanggil komponen dalam aplikasi), namun Anda selalu menetapkan konstanta yang ditentukan class Intent atau class framework lain. Berikut ini adalah beberapa tindakan umum untuk memulai sebuah aktivitas:

ACTION_VIEW
Gunakan tindakan ini dalam intent dengan startActivity() jika Anda memiliki beberapa informasi yang bisa ditampilkan aktivitas kepada pengguna, misalnya foto yang bisa dilihat dalam aplikasi galeri, atau alamat yang bisa dilihat dalam aplikasi peta.
ACTION_SEND
Juga dikenal dengan intent berbagi, Anda harus menggunakannya dalam intent bersama startActivity() jika Anda memiliki data yang bisa digunakan pengguna untuk berbagi melalui aplikasi lain, seperti aplikasi email atau aplikasi berbagi jejaring sosial.

Lihat referensi class Intent untuk konstanta selengkapnya yang mendefinisikan tindakan generik. Tindakan lain yang didefinisikan di tempat lain dalam framework Android, misalnya dalam Settings untuk tindakan yang membuka layar tertentu dalam aplikasi Setelan di sistem.

Anda bisa menetapkan tindakan untuk sebuah intent dengan setAction() atau dengan konstruktor Intent.

Jika mendefinisikan tindakan Anda sendiri, pastikan untuk memasukkan nama paket aplikasi Anda sebagai awalan, seperti yang ditampilkan pada 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 merujuk data untuk diolah dan/atau tipe MIME dari data tersebut. Tipe data yang disediakan umumnya didikte oleh tindakan intent. Misalnya, jika tindakan merupakan ACTION_EDIT, data harus berisi URI dari dokumen untuk diedit.

Saat membuat intent, penting untuk menentukan tipe data (tipe MIME) selain URI-nya. Misalnya, aktivitas yang dapat menampilkan gambar mungkin tidak akan dapat memutar file audio, meskipun format URI bisa serupa. Menentukan tipe data MIME Anda membantu sistem Android menemukan komponen terbaik untuk menerima intent Anda. Namun, tipe MIME terkadang dapat disimpulkan dari URI—khususnya jika data merupakan URI content:. URI content: menunjukkan data terdapat di perangkat dan dikendalikan oleh ContentProvider, yang membuat tipe MIME data terlihat oleh sistem.

Untuk menyetel hanya URI data, panggil setData(). Untuk menyetel hanya tipe MIME, panggil setType(). Jika perlu, Anda bisa menyetel keduanya secara eksplisit dengan setDataAndType().

Perhatian: Jika ingin menyetel tipe URI dan MIME, jangan panggil setData() dan setType() karena keduanya saling menghapuskan nilai satu sama lain. Selalu gunakan setDataAndType() untuk menyetel tipe URI dan MIME.

Kategori
String yang berisi informasi tambahan tentang jenis komponen yang harus menangani intent. Keterangan kategori dalam jumlah berapa pun bisa dimasukkan dalam intent, namun sebagian besar intent tidak memerlukan kategori. Berikut ini adalah beberapa kategori umum:
CATEGORY_BROWSABLE
Aktivitas target memungkinkannya dimulai oleh browser web untuk menampilkan data yang dirujuk oleh tautan, misalnya gambar atau pesan e-mail.
CATEGORY_LAUNCHER
Aktivitas tersebut adalah aktivitas awal dari sebuah tugas dan dicantumkan dalam peluncur aplikasi sistem.

Lihat keterangan class Intent untuk mengetahui daftar lengkap kategori.

Anda bisa menetapkan kategori dengan addCategory().

Properti yang tercantum di atas (nama komponen, tindakan, data, dan kategori) menyatakan karakteristik yang mendefinisikan intent. Dengan membaca properti ini, sistem Android mampu memutuskan komponen aplikasi mana yang harus dimulai. Akan tetapi, intent bisa membawa informasi tambahan yang tidak memengaruhi cara intent ditetapkan pada komponen aplikasi. Intent juga bisa menyediakan informasi berikut:

Tambahan
Key-value pair 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 bisa menambahkan data ekstra dengan beragam metode putExtra(), masing-masing menerima dua parameter: nilai dan nama kunci. Anda juga bisa membuat objek Bundle dengan semua data ekstra, kemudian menyisipkan Bundle di dalam Intent dengan putExtras().

Misalnya, saat membuat intent yang akan mengirimkan email dengan ACTION_SEND, Anda bisa menetapkan penerima kepada dengan kunci EXTRA_EMAIL, dan menetapkan subjek dengan kunci EXTRA_SUBJECT.

Class Intent menetapkan beberapa konstanta EXTRA_* untuk tipe data standar. Jika Anda ingin mendeklarasikan kunci ekstra sendiri (untuk intent yang diterima aplikasi Anda), pastikan untuk memasukkan nama paket aplikasi sebagai awalan, seperti yang ditampilkan pada 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 atau Serializable saat mengirim intent yang Anda harapkan diterima aplikasi lain. Jika aplikasi berupaya mengakses data dalam objek Bundle, tetapi memiliki akses ke class yang dibagi atau diserialkan, sistem akan memunculkan RuntimeException.

Flag
Flag didefinisikan dalam class Intent yang berfungsi sebagai metadata untuk intent. Flag menginstruksikan cara meluncurkan aktivitas (misalnya, tugas mana yang harus dimiliki suatu aktivitas) dan cara memperlakukannya setelah diluncurkan (misalnya, apakah aktivitas tersebut masuk ke dalam daftar aktivitas terbaru) pada sistem Android.

Untuk informasi selengkapnya, lihat metode setFlags().

Contoh intent eksplisit

Intent eksplisit adalah intent yang Anda gunakan untuk meluncurkan komponen aplikasi tertentu, seperti aktivitas tertentu atau layanan dalam aplikasi Anda. Untuk membuat intent eksplisit, definisikan nama komponen untuk objek Intent —semua properti intent lainnya bersifat opsional.

Misalnya, jika Anda membuat layanan dalam aplikasi, bernama DownloadService, yang didesain untuk mendownload file dari web, Anda bisa memulainya dengan kode berikut ini:

Kotlin

// Executed in an Activity, so 'this' is the Context
// 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 the Context
// 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 objek Class pada komponen. Dengan demikian, intent ini secara eksplisit memulai class DownloadService dalam aplikasi.

Untuk informasi selengkapnya tentang membuat dan memulai layanan, lihat panduan Layanan.

Contoh intent implisit

Intent implisit menetapkan tindakan yang bisa memanggil aplikasi pada perangkat yang mampu melakukan tindakan. Menggunakan intent implisit berguna jika aplikasi Anda tidak bisa melakukan tindakan, namun aplikasi lain mungkin bisa melakukannya dan Anda ingin pengguna untuk memilih aplikasi mana yang ingin digunakan.

Misalnya, jika memiliki konten yang Anda ingin agar pengguna berbagi konten tersebut dengan orang lain, buatlah intent dengan tindakan ACTION_SEND dan tambahkan ekstra yang menetapkan materi yang akan dibagikan. Jika Anda memanggil startActivity() dengan intent tersebut, pengguna bisa memilih aplikasi yang akan digunakan untuk berbagi konten.

Perhatian: Ada kemungkinan pengguna tidak memiliki suatu aplikasi yang menangani intent implisit yang Anda kirimkan ke startActivity(). Atau, aplikasi mungkin tidak dapat diakses karena batasan profil atau setelan yang diberlakukan oleh administrator. Jika terjadi hal tersebut, panggilan akan gagal dan aplikasi Anda error. Untuk memverifikasi bahwa aktivitas akan menerima intent, panggil resolveActivity() pada objek Intent Anda. Jika hasilnya bukan nol, berarti setidaknya ada satu aplikasi yang bisa menangani intent tersebut dan aman untuk memanggil startActivity(). Jika hasilnya nol, Anda tidak boleh menggunakan intent tersebut dan, jika memungkinkan, Anda harus menonaktifkan fitur yang mengeluarkan intent tersebut. Contoh berikut menampilkan cara memverifikasi bahwa intent menyelesaikan suatu aktivitas. Contoh ini tidak menggunakan URI, tetapi tipe data intent dinyatakan untuk menentukan konten yang dibawa oleh aktivitas tambahan.

Kotlin

// Create the text message with a string
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, textMessage)
    type = "text/plain"
}

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(packageManager) != null) {
    startActivity(sendIntent)
}

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");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

Saat startActivity() dipanggil, sistem akan memeriksa semua aplikasi yang terinstal untuk menentukan aplikasi mana yang bisa menangani intent jenis ini (intent dengan tindakan ACTION_SEND dan yang membawa data "teks/polos"). Jika hanya ada satu aplikasi yang bisa menanganinya, aplikasi tersebut akan langsung terbuka dan diberi intent. Jika beberapa aktivitas menerima intent, sistem akan menampilkan dialog seperti yang ditampilkan pada Gambar2, sehingga pengguna bisa memilih aplikasi mana yang akan digunakan.

Informasi selengkapnya tentang meluncurkan aplikasi lain juga disediakan dalam Mengirimkan Pengguna ke Aplikasi Lain.

Gambar 2. Dialog pemilih.

Memaksakan pemilih aplikasi

Jika ada lebih dari satu aplikasi yang merespons intent implisit Anda, pengguna bisa memilih aplikasi mana yang digunakan dan membuat aplikasi tersebut pilihan default untuk tindakan tersebut. Kemampuan untuk memilih default sangat membantu saat melakukan tindakan di mana pengguna mungkin ingin menggunakan aplikasi yang sama untuk seterusnya, seperti saat membuka halaman web (pengguna biasanya memilih hanya satu browser web).

Akan tetapi, jika ada banyak aplikasi yang bisa merespons intent tersebut dan pengguna mungkin ingin menggunakan aplikasi yang berbeda untuk setiap kalinya, Anda harus menampilkan dialog pemilih secara eksplisit. Dialog pemilih akan meminta pengguna memilih aplikasi mana yang akan digunakan untuk tindakan (pengguna tidak bisa memilih aplikasi default untuk tindakan tersebut). Misalnya, jika aplikasi Anda melakukan "berbagi" dengan tindakan ACTION_SEND, pengguna mungkin ingin berbagi menggunakan aplikasi berbeda sesuai dengan situasi mereka saat itu, sehingga Anda harus selalu menggunakan dialog pemilih, seperti yang ditampilkan pada Gambar 2.

Untuk menampilkan pemilih, buat Intent menggunakan createChooser() dan teruskan ke startActivity(), seperti yang ditampilkan pada 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);
}

Menerima intent implisit

Untuk mengiklankan intent implisit yang bisa diterima aplikasi Anda, deklarasikan satu atau beberapa filter intent untuk setiap komponen aplikasi dengan elemen <intent-filter> dalam file manifes Anda. Setiap filter intent menetapkan tipe intent yang diterimanya berdasarkan aksi, data, dan kategori intent. Sistem akan mengirim intent implisit ke komponen aplikasi Anda hanya jika intent tersebut bisa diteruskan melalui salah satu filter intent.

Catatan: Intent eksplisit selalu dikirimkan ke targetnya, terlepas dari filter intent yang dideklarasikan komponen.

Komponen aplikasi harus mendeklarasikan filter terpisah untuk masing-masing tugas unik yang bisa dilakukannya. Misalnya, satu aktivitas dalam aplikasi galeri gambar bisa memiliki dua filter: satu filter untuk melihat gambar, dan filter lainnya untuk mengedit gambar. Jika aktivitas dimulai, aktivitas akan memeriksa Intent dan menentukan cara berperilaku berdasarkan informasi dalam Intent (misalnya menampilkan kontrol editor atau tidak).

Setiap filter intent didefinisikan oleh elemen <intent-filter> dalam file manifes aplikasi, yang bertumpuk pada komponen aplikasi terkait (seperti elemen <activity>). Di dalam <intent-filter>, Anda bisa menetapkan tipe intent yang akan diterima dengan menggunakan salah satu atau beberapa dari tiga elemen ini:

<action>
Mendeklarasikan aksi intent yang diterima, dalam atribut name. Nilai harus berupa nilai string literal dari tindakan, bukan konstanta class.
<data>
Mendeklarasikan tipe data yang diterima, menggunakan salah satu atau beberapa atribut yang menetapkan beragam aspek URI data (scheme, host, port, path) dan tipe 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. Metode startActivity() dan startActivityForResult() memperlakukan semua intent seolah-olah mendeklarasikan kategori CATEGORY_DEFAULT. Jika tidak mendeklarasikan kategori ini dalam filter intent Anda, tidak ada intent implisit yang ditetapkan untuk aktivitas Anda.

Misalnya, ini adalah deklarasi aktivitas dengan filter intent yang diterima intent ACTION_SEND jika tipe data berupa teks:

<activity android:name="ShareActivity">
    <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 bisa membuat filter yang mencantumkan lebih dari satu instance <action>, <data>, atau <category>. Jika Anda melakukannya, Anda harus yakin bahwa komponen tersebut dapat menangani setiap dan semua kombinasi elemen filter tersebut.

Jika ingin menangani beragam jenis intent, namun hanya dalam kombinasi tindakan, data, dan tipe kategori tertentu, maka Anda harus membuat banyak filter intent.

Intent implisit diuji terhadap filter dengan membandingkan intent dengan masing-masing dari ketiga elemen. Agar dikirim ke komponen, intent harus lolos ketiga pengujian tersebut. Jika maksud gagal dalam salah satu pengujian, sistem Android tidak akan mengirim intent ke komponen. Akan tetapi, karena sebuah komponen mungkin memiliki beberapa filter intent, intent yang tidak lulus salah satu filter komponen mungkin saja lulus di filter lainnya. Informasi selengkapnya tentang cara sistem mengatasi intent disediakan pada bagian di bawah ini tentang Resolusi Intent.

Perhatian: Menggunakan filter intent bukanlah cara yang aman untuk mencegah aplikasi lain memulai komponen Anda. Walaupun filter intent membatasi komponen agar hanya merespons jenis intent implisit tertentu, aplikasi lain bisa saja memulai komponen aplikasi Anda dengan menggunakan intent eksplisit jika developernya menentukan nama komponen Anda. Jika penting bahwa hanya aplikasi Anda sendiri yang mampu memulai salah satu komponen, jangan menyatakan filter intent di manifes Anda. Sebagai gantinya, setel atribut exported atribut menjadi "false" untuk komponen tersebut.

Demikian pula, untuk menghindari secara tidak sengaja menjalankan Service aplikasi yang berbeda, selalu gunakan intent eksplisit untuk memulai layanan Anda sendiri.

Catatan: Untuk semua aktivitas, Anda harus menyatakan filter intent di file manifes. Namun, filter untuk penerima siaran dapat didaftarkan secara dinamis dengan memanggil registerReceiver(). Anda nanti bisa membatalkan pendaftaran penerima dengan unregisterReceiver(). Dengan begitu aplikasi Anda bisa mendengarkan siaran tertentu hanya selama periode waktu yang telah ditetapkan saat aplikasi Anda berjalan.

Contoh filter

Untuk mendemonstrasikan beberapa perilaku filter intent, berikut adalah contoh dari file manifes aplikasi berbagi jejaring sosial:

<activity android:name="MainActivity">
    <!-- 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">
    <!-- 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, merupakan titik masuk utama aplikasi—aktivitas yang terbuka saat pengguna pada awalnya meluncurkan aplikasi dengan ikon peluncur:

  • Tindakan ACTION_MAIN menunjukkan ini adalah titik masuk utama dan tidak mengharapkan data intent apa pun.
  • Kategori CATEGORY_LAUNCHER menunjukkan bahwa ikon aktivitas tersebut harus ditempatkan dalam peluncur aplikasi sistem. Jika elemen <activity> tidak menetapkan ikon dengan icon, maka sistem akan menggunakan ikon dari elemen <application>.

Keduanya harus dipasangkan bersama agar aktivitas muncul dalam peluncur aplikasi.

Aktivitas kedua, ShareActivity, dimaksudkan untuk memudahkan berbagi teks dan konten media. Walaupun pengguna mungkin memasuki aktivitas ini dengan mengarah ke aktivitas dari MainActivity, pengguna juga bisa memasukkan ShareActivity secara langsung dari aplikasi lain yang mengeluarkan intent implisit yang cocok dengan salah satu dari kedua filter intent.

Catatan: Tipe MIME, application/vnd.google.panorama360+jpg, merupakan tipe data khusus yang menetapkan foto panorama, yang bisa Anda tangani dengan Google panorama API.

Menggunakan intent tertunda

Objek PendingIntent merupakan wrapper objek Intent. Tujuan utama PendingIntent adalah memberikan izin pada aplikasi asing untuk menggunakan Intent yang termuat seolah-olah dieksekusi dari proses aplikasi Anda sendiri.

Kasus penggunaan utama untuk intent tertunda mencakup hal berikut:

  • Mendeklarasikan intent untuk dieksekusi saat pengguna melakukan tindakan dengan Notifikasi (NotificationManager sistem Android akan mengeksekusi Intent) Anda.
  • Mendeklarasikan intent untuk dieksekusi saat pengguna melakukan tindakan dengan App Widget (aplikasi layar Utama mengeksekusi Intent).
  • Menyatakan intent untuk dijalankan pada masa mendatang yang telah ditetapkan (AlarmManager sistem Android akan menjalankan Intent).

Sama dengan setiap objek Intent didesain untuk ditangani oleh tipe tertentu dari komponen aplikasi (baik Activity, Service, maupun BroadcastReceiver), jadi PendingIntent harus dibuat dengan pertimbangan yang sama. Saat menggunakan intent tertunda, aplikasi Anda tidak akan menjalankan intent dengan panggilan seperti startActivity(). Sebagai gantinya, Anda harus mendeklarasikan tipe komponen yang dimaksud saat membuat PendingIntent dengan memanggil metode kreator masing-masing:

Kecuali jika aplikasi Anda menerima intent tertunda dari aplikasi lain, metode di atas untuk membuat PendingIntent menjadi satu-satunya metode PendingIntent yang mungkin Anda butuhkan.

Tiap metode mengambil Context aplikasi saat ini, Intent yang ingin Anda bungkus, dan satu atau beberapa flag yang menetapkan cara penggunaan intent (misalnya apakah intent bisa digunakan lebih dari sekali).

Informasi selengkapnya tentang intent tertunda, lihat dokumentasi untuk setiap kasus penggunaan yang bersangkutan, seperti dalam panduan Notifications dan App Widgets API.

Resolusi intent

Jika sistem menerima intent implisit untuk memulai aktivitas, sistem akan menelusuri aktivitas terbaik bagi intent tersebut dengan membandingkannya dengan filter intent, berdasarkan tiga aspek:

  • Tindakan.
  • Data (baik URI maupun tipe data)
  • Kategori.

Bagian berikut menjelaskan cara pencocokan intent dengan komponen yang sesuai sehubungan dengan cara pendeklarasian intent dalam file manifes aplikasi.

Pengujian tindakan

Untuk menetapkan tindakan intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen <action>, seperti yang ditampilkan pada contoh berikut:

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

Untuk melewati filter ini, tindakan yang ditetapkan dalam Intent harus sesuai dengan salah satu tindakan yang tercantum dalam filter.

Jika filter tidak mencantumkan tindakan apa pun, maka tidak ada intent yang dicocokkan, jadi semua intent gagal dalam pengujian. Akan tetapi, jika sebuah Intent tidak menetapkan suatu tindakan, maka akan lolos pengujian asalkan filter berisi setidaknya satu tindakan.

Pengujian kategori

Untuk menetapkan kategori intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen <category>, seperti yang ditampilkan pada contoh berikut:

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

Agar intent bisa lolos pengujian kategori, setiap kategori dalam Intent harus sesuai dengan kategori dalam filter. Kebalikannya tidak diperlukan—filter intent bisa mendeklarasikan kategori lebih banyak daripada yang ditetapkan dalam Intent dan Intent tetap lolos. Oleh karena itu, intent tanpa kategori selalu lolos pengujian ini, kategori apa pun yang dideklarasikan dalam filter.

Catatan: Android secara otomatis menerapkan CATEGORY_DEFAULT kategori ke semua intent implisit yang diteruskan ke startActivity() dan startActivityForResult(). Jika ingin aktivitas Anda menerima intent implisit, aktivitas tersebut harus menyertakan kategori untuk "android.intent.category.DEFAULT" dalam filter intent (seperti yang ditampilkan dalam contoh <intent-filter> sebelumnya.

Pengujian data

Untuk menetapkan data intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen <data>, seperti yang ditampilkan pada contoh berikut:

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>

Tiap elemen <data> bisa menetapkan struktur URI dan tipe data (tipe media MIME). Masing-masing bagian URI merupakan 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 jalurnya adalah folder/subfolder/etc.

Setiap atribut ini bersifat opsional dalam elemen <data>, namun ada beberapa dependensi linier:

  • Jika skema tidak ditetapkan, host akan diabaikan.
  • Jika host tidak ditetapkan, porta akan diabaikan.
  • Jika skema dan host tidak ditetapkan, jalur akan diabaikan.

Jika URI dalam intent dibandingkan dengan spesifikasi URI dalam filter, pembandingannya hanya dengan bagian URI yang disertakan dalam filter. Sebagai contoh:

  • Jika sebuah filter menetapkan hanya satu skema, semua URI dengan skema tersebut akan cocok dengan filter.
  • Jika sebuah filter menetapkan satu skema dan satu otoritas namun tanpa jalur, semua URI dengan skema dan otoritas yang sama akan lolos dari filter, apa pun jalurnya.
  • Jika sebuah filter menetapkan satu skema, otoritas, dan jalur, hanya URI dengan skema, otoritas, dan jalur sama yang bisa lolos dari filter.

Catatan: Spesifikasi jalur bisa berisi bintang (*) karakter pengganti untuk hanya mencocokkan nama jalur secara parsial.

Pengujian data membandingkan URI maupun tipe MIME dalam intent dengan URI dan tipe MIME yang ditetapkan dalam filter. Aturannya adalah sebagai berikut:

  1. Intent yang tidak berisi URI maupun tipe MIME hanya akan lolos pengujian jika filter tersebut tidak menetapkan URI atau tipe MIME apa pun.
  2. Intent yang berisi URI namun tidak berisi tipe MIME (baik secara eksplisit maupun tidak langsung dari URI) hanya akan lolos pengujian jika URI-nya cocok dengan format URI filter dan filternya juga tidak menetapkan tipe MIME.
  3. Intent yang berisi tipe MIME namun tidak berisi URI hanya akan lolos pengujian jika filter mencantumkan tipe MIME yang sama dan tidak menetapkan format URI.
  4. Intent yang berisi URI maupun tipe MIME (baik secara eksplisit maupun bisa ditebak dari URI) hanya akan lolos pengujian bagian tipe MIME jika tipe tersebut sama dengan tipe yang dicantumkan dalam filter. Ini meneruskan bagian URI pengujian jika URI-nya sama dengan URI dalam filter atau memiliki content: atau URI file: dan filter tidak menetapkan URI. Dengan kata lain, komponen dianggap mendukung data content: dan file: jika filternya hanya mencantumkan tipe MIME.

Catatan: Jika intent menentukan tipe URI atau MIME, pengujian data akan gagal jika tidak ada elemen <data> pada <intent-filter>.

Aturan terakhir, aturan (d), merefleksikan ekspektasi bahwa komponen bisa mendapatkan data lokal dari file atau penyedia konten. Oleh karena itu, filternya dapat mencantumkan hanya tipe data dan tidak perlu memberi nama secara eksplisit skema content: dan file:. Contoh berikut menampilkan kasus yang biasa terjadi di mana elemen <data> memberi tahu Android bahwa komponen tersebut bisa mendapatkan data gambar dari penyedia konten, lalu menampilkannya:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

Filter yang menetapkan tipe data namun bukan URI mungkin adalah yang paling umum karena sebagian besar data yang tersedia ditiadakan oleh penyedia konten.

Konfigurasi umum yang lain adalah filter dengan skema dan tipe data. Misalnya, elemen <data> seperti berikut ini akan memberi tahu Android bahwa komponen bisa 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 selain untuk menemukan komponen target yang akan diaktifkan, juga untuk menemukan sesuatu tentang rangkaian komponen pada perangkat. Misalnya, aplikasi Beranda akan menempatkan peluncur aplikasi dengan mencari semua aktivitas dengan filter intent yang menetapkan aksi ACTION_MAIN dan kategoriCATEGORY_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 bisa menerima intent tertentu, dan serangkaian metode resolve...() serupa yang menentukan komponen terbaik untuk merespons intent. Misalnya, queryIntentActivities() menampilkan daftar semua aktivitas yang dapat melakukan intent yang diteruskan sebagai argumen, dan queryIntentServices() menampilkan daftar layanan serupa. Tidak ada metode yang mengaktifkan komponen; metode hanya mencantumkan komponen yang bisa merespons. Terdapat metode yang serupa, queryBroadcastReceivers(), untuk penerima siaran.