1page.title=Intent dan Filter Intent 2page.tags="IntentFilter" 3@jd:body 4 5<div id="qv-wrapper"> 6<div id="qv"> 7 8<h2>Dalam dokumen ini</h2> 9<ol> 10 <li><a href="#Types">Tipe Intent</a></li> 11 <li><a href="#Building">Membangun Intent</a> 12 <ol> 13 <li><a href="#ExampleExplicit">Contoh intent eksplisit</a></li> 14 <li><a href="#ExampleSend">Contoh intent implisit</a></li> 15 <li><a href="#ForceChooser">Memaksakan pemilih aplikasi</a></li> 16 </ol> 17 </li> 18 <li><a href="#Receiving">Menerima Intent Implisit</a> 19 <ol> 20 <li><a href="#ExampleFilters">Contoh filter</a></li> 21 </ol> 22 </li> 23 <li><a href="#PendingIntent">Menggunakan Intent Tertunda</a></li> 24 <li><a href="#Resolution">Resolusi Intent</a> 25 <ol> 26 <li><a href="#ActionTest">Pengujian tindakan</a></li> 27 <li><a href="#CategoryTest">Pengujian kategori</a></li> 28 <li><a href="#DataTest">Pengujian data</a></li> 29 <li><a href="#imatch">Pencocokan intent</a></li> 30 </ol> 31 </li> 32</ol> 33 34<h2>Lihat juga</h2> 35<ol> 36<li><a href="{@docRoot}training/basics/intents/index.html">Berinteraksi dengan Aplikasi Lain</a></li> 37<li><a href="{@docRoot}training/sharing/index.html">Berbagi Konten</a></li> 38</ol> 39 40</div> 41</div> 42 43 44 45 46<p>{@link android.content.Intent} merupakan objek pertukaran pesan yang bisa Anda gunakan untuk meminta tindakan 47dari <a href="{@docRoot}guide/components/fundamentals.html#Components">komponen aplikasi</a> lain. 48Walaupun intent memudahkan komunikasi antarkomponen dalam beberapa cara, ada tiga 49kasus-penggunaan dasar:</p> 50 51<ul> 52<li><b>Untuk memulai aktivitas:</b> 53<p>{@link android.app.Activity} menyatakan satu layar dalam aplikasi. Anda bisa memulai instance 54baru {@link android.app.Activity} dengan meneruskan {@link android.content.Intent} 55ke {@link android.content.Context#startActivity startActivity()}. {@link android.content.Intent} 56menjelaskan aktivitas yang akan dimulai dan membawa data yang diperlukan.</p> 57 58<p>Jika Anda ingin menerima hasil dari aktivitas bila selesai, 59panggil {@link android.app.Activity#startActivityForResult 60startActivityForResult()}. Aktivitas Anda menerima hasil 61sebagai objek {@link android.content.Intent} terpisah dalam callback {@link 62android.app.Activity#onActivityResult onActivityResult()} aktivitas Anda. 63Untuk informasi selengkapnya, lihat panduan <a href="{@docRoot}guide/components/activities.html">Aktivitas</a>.</p></li> 64 65<li><b>Untuk memulai layanan:</b> 66<p>{@link android.app.Service} adalah komponen yang melakukan operasi di latar belakang 67tanpa antarmuka pengguna. Anda bisa memulai layanan untuk melakukan operasi satu-kali 68(misalnya mengunduh file) dengan meneruskan {@link android.content.Intent} 69ke {@link android.content.Context#startService startService()}. {@link android.content.Intent} 70menjelaskan layanan yang akan dimulai dan membawa data yang diperlukan.</p> 71 72<p>Jika layanan didesain dengan antarmuka pengguna klien-server, Anda bisa mengikat ke layanan 73dari komponen lain dengan meneruskan {@link android.content.Intent} ke {@link 74android.content.Context#bindService bindService()}</code>. Untuk informasi selengkapnya, lihat panduan <a href="{@docRoot}guide/components/services.html">Layanan</a>.</p></li> 75 76<li><b>Untuk mengirim siaran:</b> 77<p>Siaran adalah pesan yang bisa diterima aplikasi apa saja. Sistem menyampaikan beragam siaran 78untuk kejadian sistem, misalnya saat sistem booting atau saat perangkat mulai mengisi daya. 79Anda bisa mengirim siaran ke aplikasi lain dengan meneruskan {@link android.content.Intent} 80ke {@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, 81{@link android.content.Context#sendOrderedBroadcast(Intent, String) 82sendOrderedBroadcast()}, atau {@link 83android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</p> 84</li> 85</ul> 86 87 88 89 90<h2 id="Types">Tipe Intent</h2> 91 92<p>Ada dua tipe intent:</p> 93 94<ul> 95<li><b>Intent eksplisit</b> menetapkan komponen untuk memulai dengan nama ( 96nama kelas yang sepenuhnya memenuhi syarat). Anda biasanya akan menggunakan intent eksplisit untuk memulai sebuah komponen 97dalam aplikasi sendiri, karena Anda mengetahui nama kelas dari aktivitas atau layanan yang ingin dimulai. 98Misalnya, mulai aktivitas baru sebagai respons terhadap tindakan pengguna atau mulai layanan untuk mengunduh 99file di latar belakang.</li> 100 101<li><b>Intent implisit</b> tidak menetapkan komponen tertentu, melainkan mendeklarasikan tindakan umum 102yang dilakukan, yang memungkinkan komponen aplikasi lain untuk menanganinya. Misalnya, jika Anda ingin 103menampilkan sebuah lokasi di peta pada pengguna, Anda bisa menggunakan intent implisit untuk meminta aplikasi lain 104yang mampu untuk menunjukkan lokasi yang telah ditetapkan di peta tersebut.</li> 105</ul> 106 107<p>Saat Anda membuat intent eksplisit untuk memulai aktivitas atau layanan, sistem akan segera 108memulai komponen aplikasi yang telah ditetapkan dalam objek {@link android.content.Intent}.</p> 109 110<div class="figure" style="width:446px"> 111<img src="{@docRoot}images/components/intent-filters@2x.png" width="446" alt="" /> 112<p class="img-caption"><strong>Gambar 1.</strong> Ilustrasi yang menggambarkan cara intent implisit 113disampaikan melalui sistem untuk memulai aktivitas lain: <b>[1]</b> <em>Aktivitas A</em> membuat sebuah 114{@link android.content.Intent} dengan keterangan tindakan dan meneruskannya ke {@link 115android.content.Context#startActivity startActivity()}. <b>[2]</b> Sistem Android akan mencari semua 116aplikasi untuk filter intent yang cocok dengan intent tersebut. Bila cocok, <b>[3]</b> sistem akan 117memulai aktivitas mencocokkan (<em>Aktivitas B</em>) dengan memanggil metode {@link 118android.app.Activity#onCreate onCreate()} dan meneruskannya ke {@link android.content.Intent}. 119</p> 120</div> 121 122<p>Bila Anda membuat intent implisit, sistem Android akan menemukan komponen yang sesuai untuk memulai 123dengan membandingkan konten intent dengan <em>filter intent</em> yang dideklarasikan dalam <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">file manifes</a> aplikasi lain di 124perangkat. Jika intent cocok dengan filter intent, sistem akan memulai komponen tersebut dan mengiriminya 125objek {@link android.content.Intent}. Jika banyak filter intent yang kompatibel, sistem 126menampilkan dialog sehingga pengguna bisa memilih aplikasi yang akan digunakan.</p> 127 128<p>Filter intent adalah ekspresi dalam file manifes aplikasi yang 129menetapkan tipe intent yang akan diterima 130komponen. Misalnya, dengan mendeklarasikan intent filter untuk aktivitas, 131Anda akan memungkinkan aplikasi lain untuk langsung memulai aktivitas Anda dengan intent tertentu. 132Demikian pula, jika Anda <em>tidak</em> mendeklarasikan filter intent untuk suatu aktivitas, maka aktivitas tersebut hanya bisa dimulai 133dengan intent eksplisit.</p> 134 135<p class="caution"><strong>Perhatian:</strong> Untuk memastikan aplikasi Anda aman, selalu gunakan intent 136eksplisit saat memulai {@link android.app.Service} dan jangan 137mendeklarasikan filter intent untuk layanan. Menggunakan intent implisit untuk memulai layanan akan menimbulkan 138bahaya keamanan karena Anda tidak bisa memastikan layanan apa yang akan merespons intent, 139dan pengguna tidak bisa melihat layanan mana yang dimulai. Mulai dari Android 5.0 (API level 21), sistem 140melontarkan eksepsi jika Anda memanggil {@link android.content.Context#bindService bindService()} 141dengan intent implisit.</p> 142 143 144 145 146 147<h2 id="Building">Membangun Intent</h2> 148 149<p>Objek {@link android.content.Intent} membawa informasi yang digunakan sistem Android 150untuk menentukan komponen mana yang akan dimulai (misalnya nama persis dari suatu komponen atau kategori 151komponen yang seharusnya menerima intent), ditambah informasi yang digunakan komponen penerima untuk 152melakukan tindakan dengan benar (misalnya tindakan yang harus dilakukan dan data yang harus diolah).</p> 153 154 155<p>Informasi utama yang dimuat dalam {@link android.content.Intent} adalah sebagai berikut:</p> 156 157<dl> 158 159<dt><b>Nama komponen</b></dt> 160<dd>Nama komponen yang akan dimulai. 161 162<p>Ini opsional, namun merupakan bagian informasi penting yang membuat intent 163menjadi <b>eksplisit</b>, yaitu intent harus dikirim hanya ke komponen aplikasi 164yang didefinisikan oleh nama komponen. Tanpa nama komponen, intent menjadi <b>implisit</b> dan 165sistem akan memutuskan komponen mana yang harus menerima intent berdasarkan informasi intent lain 166(misalnya tindakan, data, dan kategori—yang dijelaskan di bawah ini). Jadi jika Anda ingin memulai komponen 167tertentu dalam aplikasi, Anda harus menetapkan nama komponen tersebut.</p> 168 169<p class="note"><strong>Catatan:</strong> Saat memulai {@link android.app.Service}, Anda harus 170<strong>selalu menetapkan nama komponen</strong>. Jika tidak, maka Anda tidak bisa memastikan layanan apa 171yang akan merespons intent tersebut, dan pengguna tidak bisa melihat layanan mana yang dimulai.</p> 172 173<p>Bidang {@link android.content.Intent} ini adalah objek 174{@link android.content.ComponentName}, yang bisa Anda tetapkan menggunakan 175nama kelas yang sepenuhnya memenuhi syarat dari komponen target, termasuk nama paket aplikasi. Misalnya, 176{@code com.example.ExampleActivity}. Anda bisa mengatur nama komponen dengan {@link 177android.content.Intent#setComponent setComponent()}, {@link android.content.Intent#setClass 178setClass()}, {@link android.content.Intent#setClassName(String, String) setClassName()}, atau dengan konstruktor 179{@link android.content.Intent}.</p> 180 181</dd> 182 183<p><dt><b>Tindakan</b></dt> 184<dd>String yang menetapkan tindakan generik untuk dilakukan (misalnya <em>lihat</em> atau <em>pilih</em>). 185 186<p>Dalam hal intent siaran, ini adalah tindakan yang terjadi dan dilaporkan. 187Tindakan ini sangat menentukan bagaimana keseluruhan intent disusun—terutama 188apa yang dimuat dalam data dan ekstra. 189 190<p>Anda bisa menetapkan tindakan sendiri yang akan digunakan oleh intent dalam aplikasi Anda (atau digunakan oleh aplikasi 191lain untuk memanggil komponen dalam aplikasi Anda), namun Anda harus menggunakan konstanta tindakan 192yang didefinisikan oleh kelas {@link android.content.Intent} atau kelas kerangka kerja lain. Berikut ini adalah beberapa 193tindakan umum untuk memulai sebuah aktivitas:</p> 194 195<dl> 196<dt>{@link android.content.Intent#ACTION_VIEW}</dt> 197 <dd>Gunakan tindakan ini dalam intent dengan {@link 198 android.content.Context#startActivity startActivity()} saat Anda memiliki beberapa informasi yang 199 bisa ditampilkan aktivitas kepada pengguna, misalnya foto yang bisa dilihat dalam aplikasi galeri, atau alamat 200 yang bisa dilihat dalam aplikasi peta.</dd> 201 202<dt>{@link android.content.Intent#ACTION_SEND}</dt> 203 <dd>Juga dikenal dengan intent "berbagi", Anda harus menggunakannya dalam intent dengan {@link 204 android.content.Context#startActivity startActivity()} bila Anda memiliki data yang bisa digunakan pengguna untuk 205 berbagi melalui aplikasi lain, misalnya aplikasi email atau aplikasi jaringan sosial.</dd> 206</dl> 207 208<p>Lihat referensi kelas {@link android.content.Intent} untuk konstanta 209selengkapnya yang mendefinisikan tindakan generik. Tindakan lain yang didefinisikan 210di tempat lain dalam kerangka kerja Android, misalnya dalam {@link android.provider.Settings} untuk tindakan 211yang membuka layar tertentu dalam aplikasi Settings di sistem.</p> 212 213<p>Anda bisa menetapkan tindakan untuk sebuah intent dengan {@link android.content.Intent#setAction 214setAction()} atau dengan konstruktor {@link android.content.Intent}.</p> 215 216<p>Jika mendefinisikan tindakan Anda sendiri, pastikan untuk memasukkan nama paket aplikasi Anda 217sebagai awalan. Misalnya:</p> 218<pre>static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";</pre> 219</dd> 220 221<dt><b>Data</b></dt> 222<dd>URI (objek {@link android.net.Uri}) yang mengacu data untuk diolah dan/atau 223tipe MIME dari data tersebut. Tipe data yang disediakan umumnya didikte oleh tindakan intent. 224Misalnya, jika tindakan merupakan {@link android.content.Intent#ACTION_EDIT}, data harus berisi 225URI dari dokumen untuk diedit. 226 227<p>Saat membuat intent, 228seringkali tipe data (tipe MIME-nya) selain URI perlu ditetapkan. 229Misalnya, aktivitas yang mampu menampilkan gambar mungkin tidak mampu 230memutar file audio, walaupun format URI mungkin serupa. 231Jadi menetapkan tipe MIME data Anda akan membantu sistem 232Android menemukan komponen terbaik untuk diterima intent. 233Akan tetapi, tipe MIME seringkali bisa diambil dari URI—terutama saat datanya merupakan URI 234{@code content:}, yang menunjukkan data tersebut berada di perangkat dan dikontrol oleh 235{@link android.content.ContentProvider}, yang membuat data tipe MIME terlihat di sistem.</p> 236 237<p>Untuk mengatur data URI saja, panggil {@link android.content.Intent#setData setData()}. 238Untuk mengatur tipe MIME saja, panggil {@link android.content.Intent#setType setType()}. Jika perlu, Anda 239bisa mengatur keduanya secara eksplisit dengan {@link 240android.content.Intent#setDataAndType setDataAndType()}.</p> 241 242<p class="caution"><strong>Perhatian:</strong> Jika ingin mengatur tipe URI dan MIME, 243<strong>jangan</strong> panggil {@link android.content.Intent#setData setData()} dan 244{@link android.content.Intent#setType setType()} karena mereka saling menghapuskan nilai satu sama lain. 245Selalu gunakan {@link android.content.Intent#setDataAndType setDataAndType()} untuk mengatur 246tipe URI maupun MIME.</p> 247</dd> 248 249<p><dt><b>Kategori</b></dt> 250<dd>String yang berisi informasi tambahan tentang jenis komponen 251yang harus menangani intent. Keterangan kategori dalam jumlah berapa pun bisa 252dimasukkan dalam intent, namun sebagian besar intent tidak memerlukan kategori. 253Berikut ini adalah beberapa kategori umum: 254 255<dl> 256<dt>{@link android.content.Intent#CATEGORY_BROWSABLE}</dt> 257 <dd>Aktivitas target memungkinkannya dimulai oleh browser web untuk menampilkan data 258yang diacu oleh tautan—misalnya gambar atau pesan e-mail. 259 </dd> 260<dt>{@link android.content.Intent#CATEGORY_LAUNCHER}</dt> 261 <dd>Aktivitas tersebut adalah aktivitas awal dari sebuah tugas dan dicantumkan dalam 262 launcher aplikasi sistem. 263 </dd> 264</dl> 265 266<p>Lihat keterangan kelas {@link android.content.Intent} untuk mengetahui daftar lengkap 267kategori.</p> 268 269<p>Anda bisa menetapkan kategori dengan {@link android.content.Intent#addCategory addCategory()}.</p> 270</dd> 271</dl> 272 273 274<p>Properti yang tercantum di atas (nama komponen, tindakan, data, dan kategori) menyatakan 275karakteristik yang mendefinisikan intent. Dengan membaca properti ini, sistem Android 276mampu memutuskan komponen aplikasi yang harus dimulainya.</p> 277 278<p>Akan tetapi, intent bisa membawa informasi tambahan yang tidak memengaruhi 279cara intent ditetapkan pada komponen aplikasi. Intent juga bisa menyediakan:</p> 280 281<dl> 282<dt><b>Ekstra</b></dt> 283<dd>Pasangan nilai-kunci yang membawa informasi yang diperlukan untuk menghasilkan tindakan yang diminta. 284Seperti halnya beberapa tindakan menggunakan jenis tertentu URI data, beberapa tindakan juga menggunakan ekstra tertentu. 285 286<p>Anda bisa menambahkan data ekstra dengan beragam metode {@link android.content.Intent#putExtra putExtra()}, 287masing-masing menerima dua parameter: nama kunci dan nilainya. 288Anda juga bisa membuat objek {@link android.os.Bundle} dengan semua data ekstra, kemudian memasukkan 289{@link android.os.Bundle} dalam {@link android.content.Intent} dengan {@link 290android.content.Intent#putExtras putExtras()}.</p> 291 292<p>Misalnya, saat membuat intent yang akan dikirimkan bersama email 293{@link android.content.Intent#ACTION_SEND}, Anda bisa menetapkan penerima "kepada" dengan kunci 294{@link android.content.Intent#EXTRA_EMAIL}, dan menetapkan "subjek" dengan kunci 295{@link android.content.Intent#EXTRA_SUBJECT}.</p> 296 297<p>Kelas {@link android.content.Intent} menetapkan beberapa konstanta {@code EXTRA_*} 298untuk tipe data standar. Jika Anda ingin mendeklarasikan kunci ekstra sendiri (untuk intent yang 299diterima aplikasi Anda), pastikan untuk memasukkan nama paket aplikasi 300sebagai awalan. Misalnya:</p> 301<pre>static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";</pre> 302</dd> 303 304<dt><b>Flag</b></dt> 305<dd>Flag didefinisikan dalam kelas {@link android.content.Intent} yang berfungsi sebagai metadata untuk 306intent. Flag menginstruksikan cara meluncurkan aktivitas (misalnya, 307<a href="{@docRoot}guide/components/tasks-and-back-stack.html">tugas</a> mana yang harus dimiliki suatu aktivitas 308) dan cara memperlakukannya setelah diluncurkan (misalnya, apakah aktivitas tersebut masuk ke dalam daftar aktivitas 309terbaru) pada sistem Android. 310 311<p>Untuk informasi selengkapnya, lihat metode {@link android.content.Intent#setFlags setFlags()} .</p> 312</dd> 313 314</dl> 315 316 317 318 319<h3 id="ExampleExplicit">Contoh intent eksplisit</h3> 320 321<p>Intent eksplisit adalah intent yang Anda gunakan untuk meluncurkan komponen aplikasi tertentu, seperti 322aktivitas tertentu atau layanan dalam aplikasi Anda. Untuk membuat intent eksplisit, definisikan 323nama komponen untuk objek {@link android.content.Intent} —semua 324properti intent lain bersifat opsional.</p> 325 326<p>Misalnya, jika Anda ingin membangun layanan dalam aplikasi Anda, bernama {@code DownloadService}, 327yang didesain untuk mengunduh file dari web, Anda bisa memulainya dengan kode berikut ini:</p> 328 329<pre> 330// Executed in an Activity, so 'this' is the {@link android.content.Context} 331// The fileUrl is a string URL, such as "http://www.example.com/image.png" 332Intent downloadIntent = new Intent(this, DownloadService.class); 333downloadIntent.setData({@link android.net.Uri#parse Uri.parse}(fileUrl)); 334startService(downloadIntent); 335</pre> 336 337<p>Konstruktor {@link android.content.Intent#Intent(Context,Class)} 338 menyediakan {@link android.content.Context} aplikasi dan 339objek {@link java.lang.Class} pada komponen. Dengan demikian, 340intent ini memulai secara eksplisit kelas {@code DownloadService} dalam aplikasi.</p> 341 342<p>Untuk informasi selengkapnya tentang membangun dan memulai layanan, lihat panduan 343<a href="{@docRoot}guide/components/services.html">Layanan</a>.</p> 344 345 346 347 348<h3 id="ExampleSend">Contoh intent implisit</h3> 349 350<p>Intent implisit menetapkan tindakan yang bisa memanggil aplikasi pada perangkat yang mampu 351melakukan tindakan. Menggunakan intent implisit berguna bila aplikasi Anda tidak bisa melakukan 352tindakan, namun aplikasi lain mungkin bisa melakukannya dan Anda ingin pengguna untuk memilih aplikasi mana yang ingin digunakan.</p> 353 354<p>Misalnya, jika memiliki konten yang Anda ingin agar pengguna berbagi konten itu dengan orang lain, buatlah intent 355dengan tindakan {@link android.content.Intent#ACTION_SEND} 356dan tambahkan ekstra yang menetapkan konten yang akan dibagikan. Bila Anda memanggil 357{@link android.content.Context#startActivity startActivity()} dengan intent tersebut, pengguna bisa 358memilih aplikasi yang akan digunakan untuk berbagi konten.</p> 359 360<p class="caution"><strong>Perhatian:</strong> Ada kemungkinan pengguna tidak memiliki <em>suatu</em> 361aplikasi yang menangani intent implisit yang Anda kirimkan ke {@link android.content.Context#startActivity 362startActivity()}. Jika itu terjadi, panggilan akan gagal dan aplikasi Anda akan crash. Untuk memeriksa 363apakah aktivitas bisa menerima intent, panggil {@link android.content.Intent#resolveActivity 364resolveActivity()} pada objek {@link android.content.Intent} Anda. Jika hasilnya bukan nol, 365berarti setidaknya ada satu aplikasi yang bisa menangani intent tersebut dan aman untuk memanggil 366{@link android.content.Context#startActivity startActivity()}. Jika hasilnya nol, 367Anda tidak boleh menggunakan intent tersebut dan, jika memungkinkan, Anda harus menonaktifkan fitur yang mengeluarkan 368intent tersebut.</p> 369 370 371<pre> 372// Create the text message with a string 373Intent sendIntent = new Intent(); 374sendIntent.setAction(Intent.ACTION_SEND); 375sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); 376sendIntent.setType("text/plain"); 377 378// Verify that the intent will resolve to an activity 379if (sendIntent.resolveActivity(getPackageManager()) != null) { 380 startActivity(sendIntent); 381} 382</pre> 383 384<p class="note"><strong>Catatan:</strong> Dalam hal ini, URI tidak digunakan, namun tipe data intent 385dideklarasikan untuk menetapkan konten yang dibawa oleh ekstra.</p> 386 387 388<p>Saat {@link android.content.Context#startActivity startActivity()} dipanggil, sistem akan 389memeriksa semua aplikasi yang terinstal untuk menentukan aplikasi mana yang bisa menangani intent jenis ini ( 390intent dengan tindakan {@link android.content.Intent#ACTION_SEND} dan yang membawa data 391"teks/polos"). Jika hanya ada satu aplikasi yang bisa menanganinya, aplikasi tersebut akan langsung terbuka dan diberi 392intent tersebut. Jika banyak aktivitas menerima intent, sistem akan 393menampilkan dialog sehingga pengguna bisa memilih aplikasi mana yang digunakan.</p> 394 395 396<div class="figure" style="width:200px"> 397 <img src="{@docRoot}images/training/basics/intent-chooser.png" alt=""> 398 <p class="img-caption"><strong>Gambar 2.</strong> Dialog pemilih.</p> 399</div> 400 401<h3 id="ForceChooser">Memaksakan pemilih aplikasi</h3> 402 403<p>Bila ada lebih dari satu aplikasi yang merespons intent implisit Anda, 404pengguna bisa memilih aplikasi mana yang digunakan dan membuat aplikasi tersebut pilihan default untuk 405tindakan tersebut. Ini sangat membantu saat melakukan tindakan di mana pengguna 406mungkin ingin menggunakan aplikasi yang sama untuk seterusnya, seperti saat membuka halaman web (pengguna 407biasanya memilih hanya satu browser web).</p> 408 409<p>Akan tetapi, jika ada banyak aplikasi yang bisa merespons intent tersebut dan pengguna mungkin ingin menggunakan aplikasi 410yang berbeda untuk setiap kalinya, Anda harus menampilkan dialog pemilih secara eksplisit. Dialog pemilih akan meminta 411pengguna memilih aplikasi yang akan digunakan untuk tindakan tertentu setiap kali (pengguna tidak bisa memilih aplikasi default untuk 412tindakan tersebut). Misalnya, saat aplikasi Anda melakukan "berbagi" dengan tindakan {@link 413android.content.Intent#ACTION_SEND}, pengguna mungkin ingin berbagi menggunakan aplikasi berbeda sesuai 414dengan situasi mereka saat itu, jadi Anda harus selalu menggunakan dialog pemilih, seperti yang ditampilkan dalam gambar 2.</p> 415 416 417 418 419<p>Untuk menampilkan pemilih, buatlah {@link android.content.Intent} menggunakan {@link 420android.content.Intent#createChooser createChooser()} dan teruskan ke {@link 421android.app.Activity#startActivity startActivity()}. Misalnya:</p> 422 423<pre> 424Intent sendIntent = new Intent(Intent.ACTION_SEND); 425... 426 427// Always use string resources for UI text. 428// This says something like "Share this photo with" 429String title = getResources().getString(R.string.chooser_title); 430// Create intent to show the chooser dialog 431Intent chooser = Intent.createChooser(sendIntent, title); 432 433// Verify the original intent will resolve to at least one activity 434if (sendIntent.resolveActivity(getPackageManager()) != null) { 435 startActivity(chooser); 436} 437</pre> 438 439<p>Ini menampilkan dialog dengan daftar aplikasi yang merespons intent yang diteruskan ke metode {@link 440android.content.Intent#createChooser createChooser()} dan menggunakan teks yang disediakan sebagai 441judul dialog.</p> 442 443 444 445 446 447 448 449 450 451<h2 id="Receiving">Menerima Intent Implisit</h2> 452 453<p>Untuk mengiklankan intent implisit yang bisa diterima aplikasi Anda, deklarasikan satu atau beberapa filter intent untuk 454tiap komponen aplikasi dengan elemen <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a> 455dalam <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">file manifes</a> Anda. 456Tiap filter intent menetapkan tipe intent yang diterimanya berdasarkan tindakan intent, 457data, dan kategori. Sistem akan mengirim intent implisit ke komponen aplikasi Anda hanya jika 458intent tersebut bisa diteruskan melalui salah satu filter intent.</p> 459 460<p class="note"><strong>Catatan:</strong> Intent eksplisit selalu dikirimkan ke targetnya, 461apa pun filter intent yang dideklarasikan komponen.</p> 462 463<p>Komponen aplikasi harus mendeklarasikan filter terpisah untuk setiap pekerjaan unik yang bisa dilakukannya. 464Misalnya, satu aktivitas dalam aplikasi galeri gambar bisa memiliki dua filter: satu filter 465untuk melihat gambar, dan filter lainnya untuk mengedit gambar. Bila aktivitas dimulai, 466aktivitas akan memeriksa {@link android.content.Intent} dan menentukan cara berperilaku berdasarkan informasi 467dalam {@link android.content.Intent} (misalnya menampilkan kontrol editor atau tidak).</p> 468 469<p>Tiap filter intent didefinisikan oleh elemen <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a> 470dalam file manifes aplikasi, yang tersarang dalam komponen aplikasi terkait (seperti 471elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 472). Di dalam <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a>, 473Anda bisa menetapkan tipe intent yang akan diterima dengan menggunakan salah satu atau beberapa 474dari tiga elemen ini:</p> 475 476<dl> 477<dt><a href="{@docRoot}guide/topics/manifest/action-element.html">{@code <action>}</a></dt> 478 <dd>Mendeklarasikan tindakan intent yang diterima, dalam atribut {@code name}. Nilai 479 haruslah nilai string literal dari tindakan, bukan konstanta kelas.</dd> 480<dt><a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a></dt> 481 <dd>Mendeklarasikan tipe data yang diterima, menggunakan salah satu atau beberapa atribut yang menetapkan beragam 482 aspek URI data (<code>scheme</code>, <code>host</code>, <code>port</code>, 483 <code>path</code>, dll.) dan tipe MIME.</dd> 484<dt><a href="{@docRoot}guide/topics/manifest/category-element.html">{@code <category>}</a></dt> 485 <dd>Mendeklarasikan kategori intent yang diterima, dalam atribut {@code name}. Nilai 486 haruslah nilai string literal dari tindakan, bukan konstanta kelas. 487 488 <p class="note"><strong>Catatan:</strong> Untuk menerima intent implisit, Anda 489 <strong>harus menyertakan</strong> kategori 490{@link android.content.Intent#CATEGORY_DEFAULT} dalam filter intent. Metode 491 {@link android.app.Activity#startActivity startActivity()}dan 492 {@link android.app.Activity#startActivityForResult startActivityForResult()} memperlakukan semua intent 493 seolah-olah mendeklarasikan kategori {@link android.content.Intent#CATEGORY_DEFAULT}. 494 Jika tidak mendeklarasikan kategori ini dalam filter intent Anda, tidak ada intent implisit yang ditetapkan untuk 495 aktivitas Anda.</p> 496 </dd> 497</dl> 498 499<p>Misalnya, ini adalah deklarasi aktivitas dengan filter intent yang diterima intent 500{@link android.content.Intent#ACTION_SEND} bila tipe data berupa teks:</p> 501 502<pre> 503<activity android:name="ShareActivity"> 504 <intent-filter> 505 <action android:name="android.intent.action.SEND"/> 506 <category android:name="android.intent.category.DEFAULT"/> 507 <data android:mimeType="text/plain"/> 508 </intent-filter> 509</activity> 510</pre> 511 512<p>Anda bisa membuat filter yang menyertakan lebih dari satu instance 513<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code <action>}</a>, 514<a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a>, atau 515<a href="{@docRoot}guide/topics/manifest/category-element.html">{@code <category>}</a>. 516Jika Anda melakukannya, Anda hanya perlu memastikan bahwa komponen bisa menangani semua kombinasi 517elemen filter tersebut.</p> 518 519<p>Bila ingin menangani beragam jenis intent, namun hanya dalam kombinasi 520tindakan, data, dan tipe kategori tertentu, maka Anda harus membuat banyak filter intent.</p> 521 522 523<div class="sidebox-wrapper"> 524<div class="sidebox"> 525<h2>Membatasi akses ke komponen</h2> 526<p>Menggunakan filter intent bukanlah cara yang aman untuk mencegah aplikasi lain memulai 527komponen Anda. Walaupun filter intent membatasi komponen agar hanya merespons 528jenis intent implisit tertentu, aplikasi lain bisa saja memulai komponen aplikasi Anda 529dengan menggunakan intent eksplisit jika pengembangnya menentukan nama komponen Anda. 530Jika perlu <em>hanya aplikasi Anda sendiri</em> yang mampu memulai salah satu komponen, 531atur atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#exported">{@code 532exported}</a> ke {@code "false"} untuk komponen itu. 533</p> 534</div> 535</div> 536 537<p>Intent implisit diuji terhadap filter dengan membandingkan intent dengan masing-masing 538dari ketiga elemen. Agar dikirim ke komponen, intent harus lolos ketiga pengujian tersebut. 539Jika intent gagal dalam salah satu pengujian, sistem Android tidak akan mengirim intent ke 540komponen. Akan tetapi, karena sebuah komponen dapat memiliki beberapa filter intent, intent yang tidak 541lolos melalui salah satu filter komponen mungkin akan lolos di filter lain. 542Informasi selengkapnya tentang cara sistem menetapkan intent disediakan dalam bagian di bawah ini 543tentang <a href="#Resolution">Resolusi Intent</a>.</p> 544 545<p class="caution"><strong>Perhatian:</strong> Untuk menghindari menjalankan 546{@link android.app.Service} aplikasi yang berbeda secara tidak sengaja, selalu gunakan intent eksplisit untuk memulai layanan Anda sendiri dan jangan 547deklarasikan filter intent untuk layanan Anda.</p> 548 549<p class="note"><strong>Catatan:</strong> 550Untuk semua aktivitas, Anda harus mendeklarasikan filter intent dalam file manifes. 551Akan tetapi, filter untuk penerima siaran bisa didaftarkan secara dinamis dengan memanggil 552{@link android.content.Context#registerReceiver(BroadcastReceiver, IntentFilter, String, 553Handler) registerReceiver()}. Anda nanti bisa mencabut pendaftaran penerima dengan {@link 554android.content.Context#unregisterReceiver unregisterReceiver()}. Dengan begitu aplikasi Anda 555bisa mendengarkan siaran tertentu hanya selama periode waktu yang telah ditetapkan saat aplikasi Anda 556berjalan.</p> 557 558 559 560 561 562 563 564<h3 id="ExampleFilters">Contoh filter</h3> 565 566<p>Untuk lebih memahami beberapa perilaku filter intent, lihatlah cuplikan berikut 567dari file manifes aplikasi berbagi di jaringan sosial.</p> 568 569<pre> 570<activity android:name="MainActivity"> 571 <!-- This activity is the main entry, should appear in app launcher --> 572 <intent-filter> 573 <action android:name="android.intent.action.MAIN" /> 574 <category android:name="android.intent.category.LAUNCHER" /> 575 </intent-filter> 576</activity> 577 578<activity android:name="ShareActivity"> 579 <!-- This activity handles "SEND" actions with text data --> 580 <intent-filter> 581 <action android:name="android.intent.action.SEND"/> 582 <category android:name="android.intent.category.DEFAULT"/> 583 <data android:mimeType="text/plain"/> 584 </intent-filter> 585 <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> 586 <intent-filter> 587 <action android:name="android.intent.action.SEND"/> 588 <action android:name="android.intent.action.SEND_MULTIPLE"/> 589 <category android:name="android.intent.category.DEFAULT"/> 590 <data android:mimeType="application/vnd.google.panorama360+jpg"/> 591 <data android:mimeType="image/*"/> 592 <data android:mimeType="video/*"/> 593 </intent-filter> 594</activity> 595</pre> 596 597<p>Aktivitas pertama, {@code MainActivity}, merupakan titik masuk utama aplikasi—aplikasi yang 598terbuka saat pengguna meluncurkan aplikasi dengan ikon launcher:</p> 599<ul> 600 <li>Tindakan {@link android.content.Intent#ACTION_MAIN} 601 menunjukkan ini adalah titik masuk utama dan tidak mengharapkan data intent apa pun.</li> 602 <li>Kategori {@link android.content.Intent#CATEGORY_LAUNCHER} menunjukjkan bahwa ikon 603 aktivitas ini harus ditempatkan dalam launcher aplikasi sistem. Jika elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> 604 tidak menetapkan ikon dengan{@code icon}, maka sistem akan menggunakan ikon dari elemen 605<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a>.</li> 606</ul> 607<p>Keduanya harus dipasangkan bersama agar aktivitas muncul dalam launcher aplikasi.</p> 608 609<p>Aktivitas kedua, {@code ShareActivity}, dimaksudkan untuk memudahkan berbagi teks dan konten 610media. Walaupun pengguna mungkin memasuki aktivitas ini dengan mengarah ke aktivitas dari {@code MainActivity}, 611pengguna juga bisa memasukkan {@code ShareActivity} secara langsung dari aplikasi lain yang mengeluarkan intent 612implisit yang cocok dengan salah satu dari kedua filter intent.</p> 613 614<p class="note"><strong>Catatan:</strong> Tipe MIME, 615<a href="https://developers.google.com/panorama/android/">{@code 616application/vnd.google.panorama360+jpg}</a>, merupakan tipe data khusus yang menetapkan 617foto panorama, yang bisa Anda tangani dengan API <a href="{@docRoot}reference/com/google/android/gms/panorama/package-summary.html">panorama 618Google</a>.</p> 619 620 621 622 623 624 625 626 627 628 629 630 631 632<h2 id="PendingIntent">Menggunakan Intent Tertunda</h2> 633 634<p>Objek {@link android.app.PendingIntent} merupakan pembungkus objek {@link 635android.content.Intent}. Tujuan utama {@link android.app.PendingIntent} 636adalah memberikan izin pada aplikasi asing 637untuk menggunakan {@link android.content.Intent} yang termuat seolah-olah dieksekusi dari 638proses aplikasi Anda sendiri.</p> 639 640<p>Kasus penggunaan utama untuk intent tertunda antara lain:</p> 641<ul> 642 <li>Mendeklarasikan intent untuk dieksekusi saat pengguna melakukan tindakan dengan <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Pemberitahuan</a> 643 ({@link android.app.NotificationManager} 644 sistem Android akan mengeksekusi {@link android.content.Intent}) Anda. 645 <li>Mendeklarasikan intent untuk dieksekusi saat pengguna melakukan tindakan dengan 646<a href="{@docRoot}guide/topics/appwidgets/index.html">App Widget</a> 647 (aplikasi layar Home mengeksekusi {@link android.content.Intent}). 648 <li>Mendeklarasikan intent untuk dieksekusi di waktu yang telah ditetapkan di masa mendatang 649({@link android.app.AlarmManager} sistem Android akan mengeksekusi {@link android.content.Intent}). 650</ul> 651 652<p>Karena setiap objek {@link android.content.Intent} didesain untuk ditangani oleh tipe 653tertentu dari komponen aplikasi (baik {@link android.app.Activity}, {@link android.app.Service}, maupun 654 {@link android.content.BroadcastReceiver}), jadi {@link android.app.PendingIntent} harus 655dibuat dengan pertimbangan yang sama. Saat menggunakan intent tertunda, aplikasi Anda tidak akan 656mengeksekusi intent dengan panggilan seperti {@link android.content.Context#startActivity 657startActivity()}. Anda harus mendeklarasikan tipe komponen yang dimaksud saat membuat 658{@link android.app.PendingIntent} dengan memanggil metode kreator masing-masing:</p> 659 660<ul> 661 <li>{@link android.app.PendingIntent#getActivity PendingIntent.getActivity()} untuk 662 {@link android.content.Intent} yang memulai {@link android.app.Activity}.</li> 663 <li>{@link android.app.PendingIntent#getService PendingIntent.getService()} untuk 664 {@link android.content.Intent} yang memulai {@link android.app.Service}.</li> 665 <li>{@link android.app.PendingIntent#getBroadcast PendingIntent.getBroadcast()} untuk 666 {@link android.content.Intent} yang memulai {@link android.content.BroadcastReceiver}.</li> 667</ul> 668 669<p>Kecuali jika aplikasi Anda <em>menerima</em> intent tertunda dari aplikasi lain, 670metode di atas untuk membuat {@link android.app.PendingIntent} menjadi satu-satunya metode 671{@link android.app.PendingIntent} yang mungkin Anda butuhkan.</p> 672 673<p>Tiap metode mengambil {@link android.content.Context} aplikasi saat itu, 674{@link android.content.Intent} yang ingin Anda bungkus, dan satu atau beberapa flag yang menetapkan 675cara penggunaan intent (misalnya apakah intent bisa digunakan lebih dari sekali).</p> 676 677<p>Informasi selengkapnya tentang intent tertunda disediakan pada dokumentasi untuk setiap 678kasus penggunaan yang bersangkutan, seperti dalam panduan API <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notifications</a> 679dan <a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a>.</p> 680 681 682 683 684 685 686 687<h2 id="Resolution">Resolusi Intent</h2> 688 689 690<p>Saat sistem menerima intent implisit yang memulai suatu aktivitas, sistem tersebut akan mencari 691aktivitas terbaik untuk intent dengan membandingkan intent dengan filter intent berdasarkan tiga aspek:</p> 692 693<ul> 694 <li>Tindakan intent 695 <li>Data intent (baik URI maupun tipe data) 696 <li>Kategori intent 697</ul> 698 699<p>Bagian berikut menjelaskan cara pencocokan intent dengan komponen yang sesuai 700sehubungan dengan cara pendeklarasian filter intent dalam file manifes aplikasi.</p> 701 702 703<h3 id="ActionTest">Pengujian tindakan</h3> 704 705<p>Untuk menetapkan tindakan intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen 706<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 707<action>}</a>. Misalnya:</p> 708 709<pre> 710<intent-filter> 711 <action android:name="android.intent.action.EDIT" /> 712 <action android:name="android.intent.action.VIEW" /> 713 ... 714</intent-filter> 715</pre> 716 717<p>Untuk melewati filter ini, tindakan yang ditetapkan dalam {@link android.content.Intent} 718harus sesuai dengan salah satu tindakan yang tercantum dalam filter.</p> 719 720<p>Jika filter tidak mencantumkan tindakan apa pun, maka tidak ada intent 721yang dicocokkan, jadi semua intent gagal dalam pengujian. Akan tetapi, jika sebuah {@link android.content.Intent} 722tidak menetapkan suatu tindakan, maka akan lolos pengujian (asalkan filter 723berisi setidaknya satu tindakan).</p> 724 725 726 727<h3 id="CategoryTest">Pengujian kategori</h3> 728 729<p>Untuk menetapkan kategori intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen 730<a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 731<category>}</a>. Misalnya:</p> 732 733<pre> 734<intent-filter> 735 <category android:name="android.intent.category.DEFAULT" /> 736 <category android:name="android.intent.category.BROWSABLE" /> 737 ... 738</intent-filter> 739</pre> 740 741<p>Agar intent bisa lolos pengujian kategori, setiap kategori dalam {@link android.content.Intent} 742harus sesuai dengan kategori dalam filter. Kebalikannya tidak diperlukan—filter intent bisa 743mendeklarasikan kategori lebih banyak daripada yang ditetapkan dalam {@link android.content.Intent} dan 744{@link android.content.Intent} tetap akan lolos. Oleh karena itu, intent tanpa kategori harus 745selalu lolos pengujian ini, kategori apa pun yang dideklarasikan dalam filter.</p> 746 747<p class="note"><strong>Catatan:</strong> 748Android secara otomatis menerapkan kategori {@link android.content.Intent#CATEGORY_DEFAULT} 749untuk semua intent implisit yang diteruskan ke {@link 750android.content.Context#startActivity startActivity()} dan {@link 751android.app.Activity#startActivityForResult startActivityForResult()}. 752Jadi jika ingin aktivitas Anda menerima intent implisit, aktivitas tersebut harus 753menyertakan kategori untuk{@code "android.intent.category.DEFAULT"} dalam filter intent (seperti 754yang ditampilkan dalam contoh{@code <intent-filter>} sebelumnya.</p> 755 756 757 758<h3 id="DataTest">Pengujian data</h3> 759 760<p>Untuk menetapkan data intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen 761<a href="{@docRoot}guide/topics/manifest/data-element.html">{@code 762<data>}</a>. Misalnya:</p> 763 764<pre> 765<intent-filter> 766 <data android:mimeType="video/mpeg" android:scheme="http" ... /> 767 <data android:mimeType="audio/mpeg" android:scheme="http" ... /> 768 ... 769</intent-filter> 770</pre> 771 772<p>Tiap elemen <code><a href="{@docRoot}guide/topics/manifest/data-element.html"><data></a></code> 773bisa menetapkan struktur URI dan tipe data (tipe media MIME). Ada atribut 774terpisah — {@code scheme}, {@code host}, {@code port}, 775dan {@code path} — untuk setiap bagian URI: 776</p> 777 778<p style="margin-left: 2em">{@code <scheme>://<host>:<port>/<path>}</p> 779 780<p> 781Misalnya: 782</p> 783 784<p style="margin-left: 2em">{@code content://com.example.project:200/folder/subfolder/etc}</p> 785 786<p>Dalam URI ini, skemanya adalah {@code content}, host-nya adalah {@code com.example.project}, 787port-nya adalah {@code 200}, dan path-nya adalah {@code folder/subfolder/etc}. 788</p> 789 790<p>Tiap atribut bersifat opsional dalam elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a>, 791namun ada dependensi linear:</p> 792<ul> 793 <li>Jika skema tidak ditetapkan, host akan diabaikan.</li> 794 <li>Jika host tidak ditetapkan, port akan diabaikan.</li> 795 <li>Jika skema dan host tidak ditetapkan, path akan diabaikan.</li> 796</ul> 797 798<p>Bila URI dalam intent dibandingkan dengan spesifikasi URI dalam filter, 799pembandingannya hanya dengan bagian URI yang disertakan dalam filter. Misalnya:</p> 800<ul> 801 <li>Jika sebuah filter menetapkan hanya satu skema, semua URI dengan skema tersebut akan cocok 802dengan filter.</li> 803 <li>Jika sebuah filter menetapkan satu skema dan satu otoritas namun tanpa path, semua URI 804dengan skema dan otoritas yang sama akan lolos dari filter, apa pun path-nya.</li> 805 <li>Jika sebuah filter menetapkan satu skema, otoritas dan path, hanya URI dengan skema, 806otoritas, dan path sama yang bisa lolos dari filter.</li> 807</ul> 808 809<p class="note"><strong>Catatan:</strong> Spesifikasi path bisa berisi 810wildcard bintang (*) untuk hanya mencocokkan nama path secara parsial.</p> 811 812<p>Pengujian data membandingkan URI maupun tipe MIME dalam intent dengan URI 813dan tipe MIME yang ditetapkan dalam filter. Aturannya adalah sebagai berikut: 814</p> 815 816<ol type="a"> 817<li>Intent yang tidak berisi URI maupun tipe MIME hanya akan lolos 818pengujian jika filter tersebut tidak menetapkan URI atau tipe MIME apa pun.</li> 819 820<li>Intent yang berisi URI namun tidak berisi tipe MIME (baik secara eksplisit maupun tidak langsung dari 821URI) hanya akan lolos pengujian jika URI-nya cocok dengan format URI filter 822dan filternya juga tidak menetapkan tipe MIME.</li> 823 824<li>Intent yang berisi tipe MIME namun tidak berisi URI hanya akan lolos pengujian 825jika filter mencantumkan tipe MIME yang sama dan tidak menetapkan format URI.</li> 826 827<li>Intent yang berisi URI maupun tipe MIME (baik secara eksplisit maupun tidak langsung dari 828URI) hanya akan lolos pengujian bagian tipe MIME jika 829tipe tersebut cocok dengan tipe yang dicantumkan dalam filter. Ini akan lolos pengujian bagian URI 830jika URI-nya cocok dengan URI dalam filter atau memiliki {@code content:} 831atau URI {@code file:} dan filter tidak menetapkan URI. Dengan kata lain, 832komponen dianggap mendukung data {@code content:} dan {@code file:} jika 833filternya <em>hanya</em> mencantumkan tipe MIME.</p></li> 834</ol> 835 836<p> 837Aturan terakhir ini, aturan (d), mencerminkan harapan 838bahwa komponen mampu mendapatkan data lokal dari file atau penyedia konten. 839Oleh karena itu, filter mereka mencatumkan tipe data saja dan tidak secara eksplisit 840harus menamai skema {@code content:} dan {@code file:}. 841Ini adalah kasus umum. Elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a> 842seperti berikut ini, misalnya, memberi tahu Android bahwa komponen bisa mengambil data gambar dari penyedia 843konten dan menampilkannya: 844</p> 845 846<pre> 847<intent-filter> 848 <data android:mimeType="image/*" /> 849 ... 850</intent-filter></pre> 851 852<p> 853Karena sebagian besar data yang tersedia dikeluarkan oleh penyedia konten, filter yang 854menetapkan tipe data namun bukan URI mungkin adalah yang paling umum. 855</p> 856 857<p> 858Konfigurasi umum yang lain adalah filter dengan skema dan tipe data. Misalnya 859, elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a> 860 seperti berikut ini akan memberi tahu Android bahwa 861komponen bisa mengambil data video dari jaringan untuk melakukan tindakan: 862</p> 863 864<pre> 865<intent-filter> 866 <data android:scheme="http" android:type="video/*" /> 867 ... 868</intent-filter></pre> 869 870 871 872<h3 id="imatch">Pencocokan intent</h3> 873 874<p>Intent dicocokkan dengan filter intent selain untuk menemukan komponen 875target yang akan diaktifkan, juga untuk menemukan sesuatu tentang rangkaian 876komponen pada perangkat. Misalnya, aplikasi Home akan menempatkan launcher aplikasi 877dengan mencari semua aktivitas dengan filter intent yang menetapkan tindakan 878{@link android.content.Intent#ACTION_MAIN} dan 879kategori {@link android.content.Intent#CATEGORY_LAUNCHER}.</p> 880 881<p>Aplikasi Anda bisa menggunakan pencocokan intent dengan cara serupa. 882{@link android.content.pm.PackageManager} memiliki seperangkat metode {@code query...()} 883yang mengembalikan semua komponen yang bisa menerima intent tertentu, dan 884serangkaian metode{@code resolve...()} serupa yang menentukan komponen 885terbaik untuk merespons intent. Misalnya, 886{@link android.content.pm.PackageManager#queryIntentActivities 887queryIntentActivities()} akan mengembalikan daftar semua aktivitas yang bisa melakukan 888intent yang diteruskan sebagai argumen, dan {@link 889android.content.pm.PackageManager#queryIntentServices 890queryIntentServices()} akan mengembalikan daftar layanan serupa. 891Tidak ada metode yang akan mengaktifkan komponen; mereka hanya mencantumkan komponen yang 892bisa merespons. Ada metode serupa, 893{@link android.content.pm.PackageManager#queryBroadcastReceivers 894queryBroadcastReceivers()}, untuk penerima siaran. 895</p> 896 897 898 899 900