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&mdash;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&mdash;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&mdash;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&mdash;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} &mdash;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 &lt;intent-filter&gt;}</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 &lt;intent-filter&gt;}</a>
470dalam file manifes aplikasi, yang tersarang dalam komponen aplikasi terkait (seperti
471elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
472). Di dalam <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code &lt;intent-filter&gt;}</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 &lt;action&gt;}</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 &lt;data&gt;}</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 &lt;category&gt;}</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&lt;activity android:name="ShareActivity">
504    &lt;intent-filter>
505        &lt;action android:name="android.intent.action.SEND"/>
506        &lt;category android:name="android.intent.category.DEFAULT"/>
507        &lt;data android:mimeType="text/plain"/>
508    &lt;/intent-filter>
509&lt;/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 &lt;action&gt;}</a>,
514<a href="{@docRoot}guide/topics/manifest/data-element.html">{@code &lt;data&gt;}</a>, atau
515<a href="{@docRoot}guide/topics/manifest/category-element.html">{@code &lt;category&gt;}</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&lt;activity android:name="MainActivity">
571    &lt;!-- This activity is the main entry, should appear in app launcher -->
572    &lt;intent-filter>
573        &lt;action android:name="android.intent.action.MAIN" />
574        &lt;category android:name="android.intent.category.LAUNCHER" />
575    &lt;/intent-filter>
576&lt;/activity>
577
578&lt;activity android:name="ShareActivity">
579    &lt;!-- This activity handles "SEND" actions with text data -->
580    &lt;intent-filter&gt;
581        &lt;action android:name="android.intent.action.SEND"/>
582        &lt;category android:name="android.intent.category.DEFAULT"/>
583        &lt;data android:mimeType="text/plain"/>
584    &lt;/intent-filter&gt;
585    &lt;!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
586    &lt;intent-filter&gt;
587        &lt;action android:name="android.intent.action.SEND"/>
588        &lt;action android:name="android.intent.action.SEND_MULTIPLE"/>
589        &lt;category android:name="android.intent.category.DEFAULT"/>
590        &lt;data android:mimeType="application/vnd.google.panorama360+jpg"/>
591        &lt;data android:mimeType="image/*"/>
592        &lt;data android:mimeType="video/*"/>
593    &lt;/intent-filter&gt;
594&lt;/activity&gt;
595</pre>
596
597<p>Aktivitas pertama, {@code MainActivity}, merupakan titik masuk utama aplikasi&mdash;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 &lt;activity&gt;}</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 &lt;application&gt;}</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&lt;action&gt;}</a>.  Misalnya:</p>
708
709<pre>
710&lt;intent-filter&gt;
711    &lt;action android:name="android.intent.action.EDIT" /&gt;
712    &lt;action android:name="android.intent.action.VIEW" /&gt;
713    ...
714&lt;/intent-filter&gt;
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&lt;category&gt;}</a>.  Misalnya:</p>
732
733<pre>
734&lt;intent-filter&gt;
735    &lt;category android:name="android.intent.category.DEFAULT" /&gt;
736    &lt;category android:name="android.intent.category.BROWSABLE" /&gt;
737    ...
738&lt;/intent-filter&gt;
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&mdash;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 &lt;intent-filter&gt;} 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&lt;data&gt;}</a>.  Misalnya:</p>
763
764<pre>
765&lt;intent-filter&gt;
766    &lt;data android:mimeType="video/mpeg" android:scheme="http" ... /&gt;
767    &lt;data android:mimeType="audio/mpeg" android:scheme="http" ... /&gt;
768    ...
769&lt;/intent-filter&gt;
770</pre>
771
772<p>Tiap elemen <code><a href="{@docRoot}guide/topics/manifest/data-element.html">&lt;data&gt;</a></code>
773bisa menetapkan struktur URI dan tipe data (tipe media MIME).  Ada atribut
774terpisah &mdash; {@code scheme}, {@code host}, {@code port},
775dan {@code path} &mdash; untuk setiap bagian URI:
776</p>
777
778<p style="margin-left: 2em">{@code &lt;scheme&gt;://&lt;host&gt;:&lt;port&gt;/&lt;path&gt;}</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 &lt;data&gt;}</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 &lt;data&gt;}</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&lt;intent-filter&gt;
848    &lt;data android:mimeType="image/*" /&gt;
849    ...
850&lt;/intent-filter&gt;</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 &lt;data&gt;}</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&lt;intent-filter&gt;
866    &lt;data android:scheme="http" android:type="video/*" /&gt;
867    ...
868&lt;/intent-filter&gt;</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