| page.title=Intent dan Filter Intent |
| page.tags="IntentFilter" |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| |
| <h2>Dalam dokumen ini</h2> |
| <ol> |
| <li><a href="#Types">Tipe Intent</a></li> |
| <li><a href="#Building">Membangun Intent</a> |
| <ol> |
| <li><a href="#ExampleExplicit">Contoh intent eksplisit</a></li> |
| <li><a href="#ExampleSend">Contoh intent implisit</a></li> |
| <li><a href="#ForceChooser">Memaksakan pemilih aplikasi</a></li> |
| </ol> |
| </li> |
| <li><a href="#Receiving">Menerima Intent Implisit</a> |
| <ol> |
| <li><a href="#ExampleFilters">Contoh filter</a></li> |
| </ol> |
| </li> |
| <li><a href="#PendingIntent">Menggunakan Intent Tertunda</a></li> |
| <li><a href="#Resolution">Resolusi Intent</a> |
| <ol> |
| <li><a href="#ActionTest">Pengujian tindakan</a></li> |
| <li><a href="#CategoryTest">Pengujian kategori</a></li> |
| <li><a href="#DataTest">Pengujian data</a></li> |
| <li><a href="#imatch">Pencocokan intent</a></li> |
| </ol> |
| </li> |
| </ol> |
| |
| <h2>Lihat juga</h2> |
| <ol> |
| <li><a href="{@docRoot}training/basics/intents/index.html">Berinteraksi dengan Aplikasi Lain</a></li> |
| <li><a href="{@docRoot}training/sharing/index.html">Berbagi Konten</a></li> |
| </ol> |
| |
| </div> |
| </div> |
| |
| |
| |
| |
| <p>{@link android.content.Intent} merupakan objek pertukaran pesan yang bisa Anda gunakan untuk meminta tindakan |
| dari <a href="{@docRoot}guide/components/fundamentals.html#Components">komponen aplikasi</a> lain. |
| Walaupun intent memudahkan komunikasi antarkomponen dalam beberapa cara, ada tiga |
| kasus-penggunaan dasar:</p> |
| |
| <ul> |
| <li><b>Untuk memulai aktivitas:</b> |
| <p>{@link android.app.Activity} menyatakan satu layar dalam aplikasi. Anda bisa memulai instance |
| baru {@link android.app.Activity} dengan meneruskan {@link android.content.Intent} |
| ke {@link android.content.Context#startActivity startActivity()}. {@link android.content.Intent} |
| menjelaskan aktivitas yang akan dimulai dan membawa data yang diperlukan.</p> |
| |
| <p>Jika Anda ingin menerima hasil dari aktivitas bila selesai, |
| panggil {@link android.app.Activity#startActivityForResult |
| startActivityForResult()}. Aktivitas Anda menerima hasil |
| sebagai objek {@link android.content.Intent} terpisah dalam callback {@link |
| android.app.Activity#onActivityResult onActivityResult()} aktivitas Anda. |
| Untuk informasi selengkapnya, lihat panduan <a href="{@docRoot}guide/components/activities.html">Aktivitas</a>.</p></li> |
| |
| <li><b>Untuk memulai layanan:</b> |
| <p>{@link android.app.Service} adalah komponen yang melakukan operasi di latar belakang |
| tanpa antarmuka pengguna. Anda bisa memulai layanan untuk melakukan operasi satu-kali |
| (misalnya mengunduh file) dengan meneruskan {@link android.content.Intent} |
| ke {@link android.content.Context#startService startService()}. {@link android.content.Intent} |
| menjelaskan layanan yang akan dimulai dan membawa data yang diperlukan.</p> |
| |
| <p>Jika layanan didesain dengan antarmuka pengguna klien-server, Anda bisa mengikat ke layanan |
| dari komponen lain dengan meneruskan {@link android.content.Intent} ke {@link |
| android.content.Context#bindService bindService()}</code>. Untuk informasi selengkapnya, lihat panduan <a href="{@docRoot}guide/components/services.html">Layanan</a>.</p></li> |
| |
| <li><b>Untuk mengirim siaran:</b> |
| <p>Siaran adalah pesan yang bisa diterima aplikasi apa saja. Sistem menyampaikan beragam siaran |
| untuk kejadian sistem, misalnya saat sistem booting atau saat perangkat mulai mengisi daya. |
| Anda bisa mengirim siaran ke aplikasi lain dengan meneruskan {@link android.content.Intent} |
| ke {@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, |
| {@link android.content.Context#sendOrderedBroadcast(Intent, String) |
| sendOrderedBroadcast()}, atau {@link |
| android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</p> |
| </li> |
| </ul> |
| |
| |
| |
| |
| <h2 id="Types">Tipe Intent</h2> |
| |
| <p>Ada dua tipe intent:</p> |
| |
| <ul> |
| <li><b>Intent eksplisit</b> menetapkan komponen untuk memulai dengan nama ( |
| nama kelas yang sepenuhnya memenuhi syarat). Anda biasanya akan menggunakan intent eksplisit untuk memulai sebuah komponen |
| dalam aplikasi sendiri, karena Anda mengetahui nama kelas dari aktivitas atau layanan yang ingin dimulai. |
| Misalnya, mulai aktivitas baru sebagai respons terhadap tindakan pengguna atau mulai layanan untuk mengunduh |
| file di latar belakang.</li> |
| |
| <li><b>Intent implisit</b> tidak menetapkan komponen tertentu, melainkan mendeklarasikan tindakan umum |
| yang dilakukan, yang memungkinkan komponen aplikasi lain untuk menanganinya. Misalnya, jika Anda ingin |
| menampilkan sebuah lokasi di peta pada pengguna, Anda bisa menggunakan intent implisit untuk meminta aplikasi lain |
| yang mampu untuk menunjukkan lokasi yang telah ditetapkan di peta tersebut.</li> |
| </ul> |
| |
| <p>Saat Anda membuat intent eksplisit untuk memulai aktivitas atau layanan, sistem akan segera |
| memulai komponen aplikasi yang telah ditetapkan dalam objek {@link android.content.Intent}.</p> |
| |
| <div class="figure" style="width:446px"> |
| <img src="{@docRoot}images/components/intent-filters@2x.png" width="446" alt="" /> |
| <p class="img-caption"><strong>Gambar 1.</strong> Ilustrasi yang menggambarkan cara intent implisit |
| disampaikan melalui sistem untuk memulai aktivitas lain: <b>[1]</b> <em>Aktivitas A</em> membuat sebuah |
| {@link android.content.Intent} dengan keterangan tindakan dan meneruskannya ke {@link |
| android.content.Context#startActivity startActivity()}. <b>[2]</b> Sistem Android akan mencari semua |
| aplikasi untuk filter intent yang cocok dengan intent tersebut. Bila cocok, <b>[3]</b> sistem akan |
| memulai aktivitas mencocokkan (<em>Aktivitas B</em>) dengan memanggil metode {@link |
| android.app.Activity#onCreate onCreate()} dan meneruskannya ke {@link android.content.Intent}. |
| </p> |
| </div> |
| |
| <p>Bila Anda membuat intent implisit, sistem Android akan menemukan komponen yang sesuai untuk memulai |
| dengan 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 |
| perangkat. Jika intent cocok dengan filter intent, sistem akan memulai komponen tersebut dan mengiriminya |
| objek {@link android.content.Intent}. Jika banyak filter intent yang kompatibel, sistem |
| menampilkan dialog sehingga pengguna bisa memilih aplikasi yang akan digunakan.</p> |
| |
| <p>Filter intent adalah ekspresi dalam file manifes aplikasi yang |
| menetapkan tipe intent yang akan diterima |
| komponen. Misalnya, dengan mendeklarasikan intent filter untuk aktivitas, |
| Anda akan memungkinkan aplikasi lain untuk langsung memulai aktivitas Anda dengan intent tertentu. |
| Demikian pula, jika Anda <em>tidak</em> mendeklarasikan filter intent untuk suatu aktivitas, maka aktivitas tersebut hanya bisa dimulai |
| dengan intent eksplisit.</p> |
| |
| <p class="caution"><strong>Perhatian:</strong> Untuk memastikan aplikasi Anda aman, selalu gunakan intent |
| eksplisit saat memulai {@link android.app.Service} dan jangan |
| mendeklarasikan filter intent untuk layanan. Menggunakan intent implisit untuk memulai layanan akan menimbulkan |
| bahaya keamanan karena Anda tidak bisa memastikan layanan apa yang akan merespons intent, |
| dan pengguna tidak bisa melihat layanan mana yang dimulai. Mulai dari Android 5.0 (API level 21), sistem |
| melontarkan eksepsi jika Anda memanggil {@link android.content.Context#bindService bindService()} |
| dengan intent implisit.</p> |
| |
| |
| |
| |
| |
| <h2 id="Building">Membangun Intent</h2> |
| |
| <p>Objek {@link android.content.Intent} membawa informasi yang digunakan sistem Android |
| untuk menentukan komponen mana yang akan dimulai (misalnya nama persis dari suatu komponen atau kategori |
| komponen yang seharusnya menerima intent), ditambah informasi yang digunakan komponen penerima untuk |
| melakukan tindakan dengan benar (misalnya tindakan yang harus dilakukan dan data yang harus diolah).</p> |
| |
| |
| <p>Informasi utama yang dimuat dalam {@link android.content.Intent} adalah sebagai berikut:</p> |
| |
| <dl> |
| |
| <dt><b>Nama komponen</b></dt> |
| <dd>Nama komponen yang akan dimulai. |
| |
| <p>Ini opsional, namun merupakan bagian informasi penting yang membuat intent |
| menjadi <b>eksplisit</b>, yaitu intent harus dikirim hanya ke komponen aplikasi |
| yang didefinisikan oleh nama komponen. Tanpa nama komponen, intent menjadi <b>implisit</b> dan |
| sistem akan memutuskan komponen mana yang harus menerima intent berdasarkan informasi intent lain |
| (misalnya tindakan, data, dan kategori—yang dijelaskan di bawah ini). Jadi jika Anda ingin memulai komponen |
| tertentu dalam aplikasi, Anda harus menetapkan nama komponen tersebut.</p> |
| |
| <p class="note"><strong>Catatan:</strong> Saat memulai {@link android.app.Service}, Anda harus |
| <strong>selalu menetapkan nama komponen</strong>. Jika tidak, maka Anda tidak bisa memastikan layanan apa |
| yang akan merespons intent tersebut, dan pengguna tidak bisa melihat layanan mana yang dimulai.</p> |
| |
| <p>Bidang {@link android.content.Intent} ini adalah objek |
| {@link android.content.ComponentName}, yang bisa Anda tetapkan menggunakan |
| nama kelas yang sepenuhnya memenuhi syarat dari komponen target, termasuk nama paket aplikasi. Misalnya, |
| {@code com.example.ExampleActivity}. Anda bisa mengatur nama komponen dengan {@link |
| android.content.Intent#setComponent setComponent()}, {@link android.content.Intent#setClass |
| setClass()}, {@link android.content.Intent#setClassName(String, String) setClassName()}, atau dengan konstruktor |
| {@link android.content.Intent}.</p> |
| |
| </dd> |
| |
| <p><dt><b>Tindakan</b></dt> |
| <dd>String yang menetapkan tindakan generik untuk dilakukan (misalnya <em>lihat</em> atau <em>pilih</em>). |
| |
| <p>Dalam hal intent siaran, ini adalah tindakan yang terjadi dan dilaporkan. |
| Tindakan ini sangat menentukan bagaimana keseluruhan intent disusun—terutama |
| apa yang dimuat dalam data dan ekstra. |
| |
| <p>Anda bisa menetapkan tindakan sendiri yang akan digunakan oleh intent dalam aplikasi Anda (atau digunakan oleh aplikasi |
| lain untuk memanggil komponen dalam aplikasi Anda), namun Anda harus menggunakan konstanta tindakan |
| yang didefinisikan oleh kelas {@link android.content.Intent} atau kelas kerangka kerja lain. Berikut ini adalah beberapa |
| tindakan umum untuk memulai sebuah aktivitas:</p> |
| |
| <dl> |
| <dt>{@link android.content.Intent#ACTION_VIEW}</dt> |
| <dd>Gunakan tindakan ini dalam intent dengan {@link |
| android.content.Context#startActivity startActivity()} saat Anda memiliki beberapa informasi yang |
| bisa ditampilkan aktivitas kepada pengguna, misalnya foto yang bisa dilihat dalam aplikasi galeri, atau alamat |
| yang bisa dilihat dalam aplikasi peta.</dd> |
| |
| <dt>{@link android.content.Intent#ACTION_SEND}</dt> |
| <dd>Juga dikenal dengan intent "berbagi", Anda harus menggunakannya dalam intent dengan {@link |
| android.content.Context#startActivity startActivity()} bila Anda memiliki data yang bisa digunakan pengguna untuk |
| berbagi melalui aplikasi lain, misalnya aplikasi email atau aplikasi jaringan sosial.</dd> |
| </dl> |
| |
| <p>Lihat referensi kelas {@link android.content.Intent} untuk konstanta |
| selengkapnya yang mendefinisikan tindakan generik. Tindakan lain yang didefinisikan |
| di tempat lain dalam kerangka kerja Android, misalnya dalam {@link android.provider.Settings} untuk tindakan |
| yang membuka layar tertentu dalam aplikasi Settings di sistem.</p> |
| |
| <p>Anda bisa menetapkan tindakan untuk sebuah intent dengan {@link android.content.Intent#setAction |
| setAction()} atau dengan konstruktor {@link android.content.Intent}.</p> |
| |
| <p>Jika mendefinisikan tindakan Anda sendiri, pastikan untuk memasukkan nama paket aplikasi Anda |
| sebagai awalan. Misalnya:</p> |
| <pre>static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";</pre> |
| </dd> |
| |
| <dt><b>Data</b></dt> |
| <dd>URI (objek {@link android.net.Uri}) yang mengacu data untuk diolah dan/atau |
| tipe MIME dari data tersebut. Tipe data yang disediakan umumnya didikte oleh tindakan intent. |
| Misalnya, jika tindakan merupakan {@link android.content.Intent#ACTION_EDIT}, data harus berisi |
| URI dari dokumen untuk diedit. |
| |
| <p>Saat membuat intent, |
| seringkali tipe data (tipe MIME-nya) selain URI perlu ditetapkan. |
| Misalnya, aktivitas yang mampu menampilkan gambar mungkin tidak mampu |
| memutar file audio, walaupun format URI mungkin serupa. |
| Jadi menetapkan tipe MIME data Anda akan membantu sistem |
| Android menemukan komponen terbaik untuk diterima intent. |
| Akan tetapi, tipe MIME seringkali bisa diambil dari URI—terutama saat datanya merupakan URI |
| {@code content:}, yang menunjukkan data tersebut berada di perangkat dan dikontrol oleh |
| {@link android.content.ContentProvider}, yang membuat data tipe MIME terlihat di sistem.</p> |
| |
| <p>Untuk mengatur data URI saja, panggil {@link android.content.Intent#setData setData()}. |
| Untuk mengatur tipe MIME saja, panggil {@link android.content.Intent#setType setType()}. Jika perlu, Anda |
| bisa mengatur keduanya secara eksplisit dengan {@link |
| android.content.Intent#setDataAndType setDataAndType()}.</p> |
| |
| <p class="caution"><strong>Perhatian:</strong> Jika ingin mengatur tipe URI dan MIME, |
| <strong>jangan</strong> panggil {@link android.content.Intent#setData setData()} dan |
| {@link android.content.Intent#setType setType()} karena mereka saling menghapuskan nilai satu sama lain. |
| Selalu gunakan {@link android.content.Intent#setDataAndType setDataAndType()} untuk mengatur |
| tipe URI maupun MIME.</p> |
| </dd> |
| |
| <p><dt><b>Kategori</b></dt> |
| <dd>String yang berisi informasi tambahan tentang jenis komponen |
| yang harus menangani intent. Keterangan kategori dalam jumlah berapa pun bisa |
| dimasukkan dalam intent, namun sebagian besar intent tidak memerlukan kategori. |
| Berikut ini adalah beberapa kategori umum: |
| |
| <dl> |
| <dt>{@link android.content.Intent#CATEGORY_BROWSABLE}</dt> |
| <dd>Aktivitas target memungkinkannya dimulai oleh browser web untuk menampilkan data |
| yang diacu oleh tautan—misalnya gambar atau pesan e-mail. |
| </dd> |
| <dt>{@link android.content.Intent#CATEGORY_LAUNCHER}</dt> |
| <dd>Aktivitas tersebut adalah aktivitas awal dari sebuah tugas dan dicantumkan dalam |
| launcher aplikasi sistem. |
| </dd> |
| </dl> |
| |
| <p>Lihat keterangan kelas {@link android.content.Intent} untuk mengetahui daftar lengkap |
| kategori.</p> |
| |
| <p>Anda bisa menetapkan kategori dengan {@link android.content.Intent#addCategory addCategory()}.</p> |
| </dd> |
| </dl> |
| |
| |
| <p>Properti yang tercantum di atas (nama komponen, tindakan, data, dan kategori) menyatakan |
| karakteristik yang mendefinisikan intent. Dengan membaca properti ini, sistem Android |
| mampu memutuskan komponen aplikasi yang harus dimulainya.</p> |
| |
| <p>Akan tetapi, intent bisa membawa informasi tambahan yang tidak memengaruhi |
| cara intent ditetapkan pada komponen aplikasi. Intent juga bisa menyediakan:</p> |
| |
| <dl> |
| <dt><b>Ekstra</b></dt> |
| <dd>Pasangan nilai-kunci yang membawa informasi yang diperlukan untuk menghasilkan tindakan yang diminta. |
| Seperti halnya beberapa tindakan menggunakan jenis tertentu URI data, beberapa tindakan juga menggunakan ekstra tertentu. |
| |
| <p>Anda bisa menambahkan data ekstra dengan beragam metode {@link android.content.Intent#putExtra putExtra()}, |
| masing-masing menerima dua parameter: nama kunci dan nilainya. |
| Anda juga bisa membuat objek {@link android.os.Bundle} dengan semua data ekstra, kemudian memasukkan |
| {@link android.os.Bundle} dalam {@link android.content.Intent} dengan {@link |
| android.content.Intent#putExtras putExtras()}.</p> |
| |
| <p>Misalnya, saat membuat intent yang akan dikirimkan bersama email |
| {@link android.content.Intent#ACTION_SEND}, Anda bisa menetapkan penerima "kepada" dengan kunci |
| {@link android.content.Intent#EXTRA_EMAIL}, dan menetapkan "subjek" dengan kunci |
| {@link android.content.Intent#EXTRA_SUBJECT}.</p> |
| |
| <p>Kelas {@link android.content.Intent} menetapkan beberapa konstanta {@code EXTRA_*} |
| untuk tipe data standar. Jika Anda ingin mendeklarasikan kunci ekstra sendiri (untuk intent yang |
| diterima aplikasi Anda), pastikan untuk memasukkan nama paket aplikasi |
| sebagai awalan. Misalnya:</p> |
| <pre>static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";</pre> |
| </dd> |
| |
| <dt><b>Flag</b></dt> |
| <dd>Flag didefinisikan dalam kelas {@link android.content.Intent} yang berfungsi sebagai metadata untuk |
| intent. Flag menginstruksikan cara meluncurkan aktivitas (misalnya, |
| <a href="{@docRoot}guide/components/tasks-and-back-stack.html">tugas</a> mana yang harus dimiliki suatu aktivitas |
| ) dan cara memperlakukannya setelah diluncurkan (misalnya, apakah aktivitas tersebut masuk ke dalam daftar aktivitas |
| terbaru) pada sistem Android. |
| |
| <p>Untuk informasi selengkapnya, lihat metode {@link android.content.Intent#setFlags setFlags()} .</p> |
| </dd> |
| |
| </dl> |
| |
| |
| |
| |
| <h3 id="ExampleExplicit">Contoh intent eksplisit</h3> |
| |
| <p>Intent eksplisit adalah intent yang Anda gunakan untuk meluncurkan komponen aplikasi tertentu, seperti |
| aktivitas tertentu atau layanan dalam aplikasi Anda. Untuk membuat intent eksplisit, definisikan |
| nama komponen untuk objek {@link android.content.Intent} —semua |
| properti intent lain bersifat opsional.</p> |
| |
| <p>Misalnya, jika Anda ingin membangun layanan dalam aplikasi Anda, bernama {@code DownloadService}, |
| yang didesain untuk mengunduh file dari web, Anda bisa memulainya dengan kode berikut ini:</p> |
| |
| <pre> |
| // Executed in an Activity, so 'this' is the {@link android.content.Context} |
| // The fileUrl is a string URL, such as "http://www.example.com/image.png" |
| Intent downloadIntent = new Intent(this, DownloadService.class); |
| downloadIntent.setData({@link android.net.Uri#parse Uri.parse}(fileUrl)); |
| startService(downloadIntent); |
| </pre> |
| |
| <p>Konstruktor {@link android.content.Intent#Intent(Context,Class)} |
| menyediakan {@link android.content.Context} aplikasi dan |
| objek {@link java.lang.Class} pada komponen. Dengan demikian, |
| intent ini memulai secara eksplisit kelas {@code DownloadService} dalam aplikasi.</p> |
| |
| <p>Untuk informasi selengkapnya tentang membangun dan memulai layanan, lihat panduan |
| <a href="{@docRoot}guide/components/services.html">Layanan</a>.</p> |
| |
| |
| |
| |
| <h3 id="ExampleSend">Contoh intent implisit</h3> |
| |
| <p>Intent implisit menetapkan tindakan yang bisa memanggil aplikasi pada perangkat yang mampu |
| melakukan tindakan. Menggunakan intent implisit berguna bila aplikasi Anda tidak bisa melakukan |
| tindakan, namun aplikasi lain mungkin bisa melakukannya dan Anda ingin pengguna untuk memilih aplikasi mana yang ingin digunakan.</p> |
| |
| <p>Misalnya, jika memiliki konten yang Anda ingin agar pengguna berbagi konten itu dengan orang lain, buatlah intent |
| dengan tindakan {@link android.content.Intent#ACTION_SEND} |
| dan tambahkan ekstra yang menetapkan konten yang akan dibagikan. Bila Anda memanggil |
| {@link android.content.Context#startActivity startActivity()} dengan intent tersebut, pengguna bisa |
| memilih aplikasi yang akan digunakan untuk berbagi konten.</p> |
| |
| <p class="caution"><strong>Perhatian:</strong> Ada kemungkinan pengguna tidak memiliki <em>suatu</em> |
| aplikasi yang menangani intent implisit yang Anda kirimkan ke {@link android.content.Context#startActivity |
| startActivity()}. Jika itu terjadi, panggilan akan gagal dan aplikasi Anda akan crash. Untuk memeriksa |
| apakah aktivitas bisa menerima intent, panggil {@link android.content.Intent#resolveActivity |
| resolveActivity()} pada objek {@link android.content.Intent} Anda. Jika hasilnya bukan nol, |
| berarti setidaknya ada satu aplikasi yang bisa menangani intent tersebut dan aman untuk memanggil |
| {@link android.content.Context#startActivity startActivity()}. Jika hasilnya nol, |
| Anda tidak boleh menggunakan intent tersebut dan, jika memungkinkan, Anda harus menonaktifkan fitur yang mengeluarkan |
| intent tersebut.</p> |
| |
| |
| <pre> |
| // Create the text message with a string |
| Intent sendIntent = new Intent(); |
| sendIntent.setAction(Intent.ACTION_SEND); |
| sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); |
| sendIntent.setType("text/plain"); |
| |
| // Verify that the intent will resolve to an activity |
| if (sendIntent.resolveActivity(getPackageManager()) != null) { |
| startActivity(sendIntent); |
| } |
| </pre> |
| |
| <p class="note"><strong>Catatan:</strong> Dalam hal ini, URI tidak digunakan, namun tipe data intent |
| dideklarasikan untuk menetapkan konten yang dibawa oleh ekstra.</p> |
| |
| |
| <p>Saat {@link android.content.Context#startActivity startActivity()} dipanggil, sistem akan |
| memeriksa semua aplikasi yang terinstal untuk menentukan aplikasi mana yang bisa menangani intent jenis ini ( |
| intent dengan tindakan {@link android.content.Intent#ACTION_SEND} dan yang membawa data |
| "teks/polos"). Jika hanya ada satu aplikasi yang bisa menanganinya, aplikasi tersebut akan langsung terbuka dan diberi |
| intent tersebut. Jika banyak aktivitas menerima intent, sistem akan |
| menampilkan dialog sehingga pengguna bisa memilih aplikasi mana yang digunakan.</p> |
| |
| |
| <div class="figure" style="width:200px"> |
| <img src="{@docRoot}images/training/basics/intent-chooser.png" alt=""> |
| <p class="img-caption"><strong>Gambar 2.</strong> Dialog pemilih.</p> |
| </div> |
| |
| <h3 id="ForceChooser">Memaksakan pemilih aplikasi</h3> |
| |
| <p>Bila ada lebih dari satu aplikasi yang merespons intent implisit Anda, |
| pengguna bisa memilih aplikasi mana yang digunakan dan membuat aplikasi tersebut pilihan default untuk |
| tindakan tersebut. Ini sangat membantu saat melakukan tindakan di mana pengguna |
| mungkin ingin menggunakan aplikasi yang sama untuk seterusnya, seperti saat membuka halaman web (pengguna |
| biasanya memilih hanya satu browser web).</p> |
| |
| <p>Akan tetapi, jika ada banyak aplikasi yang bisa merespons intent tersebut dan pengguna mungkin ingin menggunakan aplikasi |
| yang berbeda untuk setiap kalinya, Anda harus menampilkan dialog pemilih secara eksplisit. Dialog pemilih akan meminta |
| pengguna memilih aplikasi yang akan digunakan untuk tindakan tertentu setiap kali (pengguna tidak bisa memilih aplikasi default untuk |
| tindakan tersebut). Misalnya, saat aplikasi Anda melakukan "berbagi" dengan tindakan {@link |
| android.content.Intent#ACTION_SEND}, pengguna mungkin ingin berbagi menggunakan aplikasi berbeda sesuai |
| dengan situasi mereka saat itu, jadi Anda harus selalu menggunakan dialog pemilih, seperti yang ditampilkan dalam gambar 2.</p> |
| |
| |
| |
| |
| <p>Untuk menampilkan pemilih, buatlah {@link android.content.Intent} menggunakan {@link |
| android.content.Intent#createChooser createChooser()} dan teruskan ke {@link |
| android.app.Activity#startActivity startActivity()}. Misalnya:</p> |
| |
| <pre> |
| Intent sendIntent = new Intent(Intent.ACTION_SEND); |
| ... |
| |
| // Always use string resources for UI text. |
| // This says something like "Share this photo with" |
| String title = getResources().getString(R.string.chooser_title); |
| // Create intent to show the chooser dialog |
| Intent chooser = Intent.createChooser(sendIntent, title); |
| |
| // Verify the original intent will resolve to at least one activity |
| if (sendIntent.resolveActivity(getPackageManager()) != null) { |
| startActivity(chooser); |
| } |
| </pre> |
| |
| <p>Ini menampilkan dialog dengan daftar aplikasi yang merespons intent yang diteruskan ke metode {@link |
| android.content.Intent#createChooser createChooser()} dan menggunakan teks yang disediakan sebagai |
| judul dialog.</p> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <h2 id="Receiving">Menerima Intent Implisit</h2> |
| |
| <p>Untuk mengiklankan intent implisit yang bisa diterima aplikasi Anda, deklarasikan satu atau beberapa filter intent untuk |
| tiap komponen aplikasi dengan elemen <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a> |
| dalam <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">file manifes</a> Anda. |
| Tiap filter intent menetapkan tipe intent yang diterimanya berdasarkan tindakan intent, |
| data, dan kategori. Sistem akan mengirim intent implisit ke komponen aplikasi Anda hanya jika |
| intent tersebut bisa diteruskan melalui salah satu filter intent.</p> |
| |
| <p class="note"><strong>Catatan:</strong> Intent eksplisit selalu dikirimkan ke targetnya, |
| apa pun filter intent yang dideklarasikan komponen.</p> |
| |
| <p>Komponen aplikasi harus mendeklarasikan filter terpisah untuk setiap pekerjaan unik yang bisa dilakukannya. |
| Misalnya, satu aktivitas dalam aplikasi galeri gambar bisa memiliki dua filter: satu filter |
| untuk melihat gambar, dan filter lainnya untuk mengedit gambar. Bila aktivitas dimulai, |
| aktivitas akan memeriksa {@link android.content.Intent} dan menentukan cara berperilaku berdasarkan informasi |
| dalam {@link android.content.Intent} (misalnya menampilkan kontrol editor atau tidak).</p> |
| |
| <p>Tiap filter intent didefinisikan oleh elemen <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a> |
| dalam file manifes aplikasi, yang tersarang dalam komponen aplikasi terkait (seperti |
| elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> |
| ). Di dalam <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}</a>, |
| Anda bisa menetapkan tipe intent yang akan diterima dengan menggunakan salah satu atau beberapa |
| dari tiga elemen ini:</p> |
| |
| <dl> |
| <dt><a href="{@docRoot}guide/topics/manifest/action-element.html">{@code <action>}</a></dt> |
| <dd>Mendeklarasikan tindakan intent yang diterima, dalam atribut {@code name}. Nilai |
| haruslah nilai string literal dari tindakan, bukan konstanta kelas.</dd> |
| <dt><a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a></dt> |
| <dd>Mendeklarasikan tipe data yang diterima, menggunakan salah satu atau beberapa atribut yang menetapkan beragam |
| aspek URI data (<code>scheme</code>, <code>host</code>, <code>port</code>, |
| <code>path</code>, dll.) dan tipe MIME.</dd> |
| <dt><a href="{@docRoot}guide/topics/manifest/category-element.html">{@code <category>}</a></dt> |
| <dd>Mendeklarasikan kategori intent yang diterima, dalam atribut {@code name}. Nilai |
| haruslah nilai string literal dari tindakan, bukan konstanta kelas. |
| |
| <p class="note"><strong>Catatan:</strong> Untuk menerima intent implisit, Anda |
| <strong>harus menyertakan</strong> kategori |
| {@link android.content.Intent#CATEGORY_DEFAULT} dalam filter intent. Metode |
| {@link android.app.Activity#startActivity startActivity()}dan |
| {@link android.app.Activity#startActivityForResult startActivityForResult()} memperlakukan semua intent |
| seolah-olah mendeklarasikan kategori {@link android.content.Intent#CATEGORY_DEFAULT}. |
| Jika tidak mendeklarasikan kategori ini dalam filter intent Anda, tidak ada intent implisit yang ditetapkan untuk |
| aktivitas Anda.</p> |
| </dd> |
| </dl> |
| |
| <p>Misalnya, ini adalah deklarasi aktivitas dengan filter intent yang diterima intent |
| {@link android.content.Intent#ACTION_SEND} bila tipe data berupa teks:</p> |
| |
| <pre> |
| <activity android:name="ShareActivity"> |
| <intent-filter> |
| <action android:name="android.intent.action.SEND"/> |
| <category android:name="android.intent.category.DEFAULT"/> |
| <data android:mimeType="text/plain"/> |
| </intent-filter> |
| </activity> |
| </pre> |
| |
| <p>Anda bisa membuat filter yang menyertakan lebih dari satu instance |
| <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code <action>}</a>, |
| <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a>, atau |
| <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code <category>}</a>. |
| Jika Anda melakukannya, Anda hanya perlu memastikan bahwa komponen bisa menangani semua kombinasi |
| elemen filter tersebut.</p> |
| |
| <p>Bila ingin menangani beragam jenis intent, namun hanya dalam kombinasi |
| tindakan, data, dan tipe kategori tertentu, maka Anda harus membuat banyak filter intent.</p> |
| |
| |
| <div class="sidebox-wrapper"> |
| <div class="sidebox"> |
| <h2>Membatasi akses ke komponen</h2> |
| <p>Menggunakan filter intent bukanlah cara yang aman untuk mencegah aplikasi lain memulai |
| komponen Anda. Walaupun filter intent membatasi komponen agar hanya merespons |
| jenis intent implisit tertentu, aplikasi lain bisa saja memulai komponen aplikasi Anda |
| dengan menggunakan intent eksplisit jika pengembangnya menentukan nama komponen Anda. |
| Jika perlu <em>hanya aplikasi Anda sendiri</em> yang mampu memulai salah satu komponen, |
| atur atribut <a href="{@docRoot}guide/topics/manifest/activity-element.html#exported">{@code |
| exported}</a> ke {@code "false"} untuk komponen itu. |
| </p> |
| </div> |
| </div> |
| |
| <p>Intent implisit diuji terhadap filter dengan membandingkan intent dengan masing-masing |
| dari ketiga elemen. Agar dikirim ke komponen, intent harus lolos ketiga pengujian tersebut. |
| Jika intent gagal dalam salah satu pengujian, sistem Android tidak akan mengirim intent ke |
| komponen. Akan tetapi, karena sebuah komponen dapat memiliki beberapa filter intent, intent yang tidak |
| lolos melalui salah satu filter komponen mungkin akan lolos di filter lain. |
| Informasi selengkapnya tentang cara sistem menetapkan intent disediakan dalam bagian di bawah ini |
| tentang <a href="#Resolution">Resolusi Intent</a>.</p> |
| |
| <p class="caution"><strong>Perhatian:</strong> Untuk menghindari menjalankan |
| {@link android.app.Service} aplikasi yang berbeda secara tidak sengaja, selalu gunakan intent eksplisit untuk memulai layanan Anda sendiri dan jangan |
| deklarasikan filter intent untuk layanan Anda.</p> |
| |
| <p class="note"><strong>Catatan:</strong> |
| Untuk semua aktivitas, Anda harus mendeklarasikan filter intent dalam file manifes. |
| Akan tetapi, filter untuk penerima siaran bisa didaftarkan secara dinamis dengan memanggil |
| {@link android.content.Context#registerReceiver(BroadcastReceiver, IntentFilter, String, |
| Handler) registerReceiver()}. Anda nanti bisa mencabut pendaftaran penerima dengan {@link |
| android.content.Context#unregisterReceiver unregisterReceiver()}. Dengan begitu aplikasi Anda |
| bisa mendengarkan siaran tertentu hanya selama periode waktu yang telah ditetapkan saat aplikasi Anda |
| berjalan.</p> |
| |
| |
| |
| |
| |
| |
| |
| <h3 id="ExampleFilters">Contoh filter</h3> |
| |
| <p>Untuk lebih memahami beberapa perilaku filter intent, lihatlah cuplikan berikut |
| dari file manifes aplikasi berbagi di jaringan sosial.</p> |
| |
| <pre> |
| <activity android:name="MainActivity"> |
| <!-- This activity is the main entry, should appear in app launcher --> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| |
| <activity android:name="ShareActivity"> |
| <!-- This activity handles "SEND" actions with text data --> |
| <intent-filter> |
| <action android:name="android.intent.action.SEND"/> |
| <category android:name="android.intent.category.DEFAULT"/> |
| <data android:mimeType="text/plain"/> |
| </intent-filter> |
| <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> |
| <intent-filter> |
| <action android:name="android.intent.action.SEND"/> |
| <action android:name="android.intent.action.SEND_MULTIPLE"/> |
| <category android:name="android.intent.category.DEFAULT"/> |
| <data android:mimeType="application/vnd.google.panorama360+jpg"/> |
| <data android:mimeType="image/*"/> |
| <data android:mimeType="video/*"/> |
| </intent-filter> |
| </activity> |
| </pre> |
| |
| <p>Aktivitas pertama, {@code MainActivity}, merupakan titik masuk utama aplikasi—aplikasi yang |
| terbuka saat pengguna meluncurkan aplikasi dengan ikon launcher:</p> |
| <ul> |
| <li>Tindakan {@link android.content.Intent#ACTION_MAIN} |
| menunjukkan ini adalah titik masuk utama dan tidak mengharapkan data intent apa pun.</li> |
| <li>Kategori {@link android.content.Intent#CATEGORY_LAUNCHER} menunjukjkan bahwa ikon |
| aktivitas ini harus ditempatkan dalam launcher aplikasi sistem. Jika elemen <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> |
| tidak menetapkan ikon dengan{@code icon}, maka sistem akan menggunakan ikon dari elemen |
| <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a>.</li> |
| </ul> |
| <p>Keduanya harus dipasangkan bersama agar aktivitas muncul dalam launcher aplikasi.</p> |
| |
| <p>Aktivitas kedua, {@code ShareActivity}, dimaksudkan untuk memudahkan berbagi teks dan konten |
| media. Walaupun pengguna mungkin memasuki aktivitas ini dengan mengarah ke aktivitas dari {@code MainActivity}, |
| pengguna juga bisa memasukkan {@code ShareActivity} secara langsung dari aplikasi lain yang mengeluarkan intent |
| implisit yang cocok dengan salah satu dari kedua filter intent.</p> |
| |
| <p class="note"><strong>Catatan:</strong> Tipe MIME, |
| <a href="https://developers.google.com/panorama/android/">{@code |
| application/vnd.google.panorama360+jpg}</a>, merupakan tipe data khusus yang menetapkan |
| foto panorama, yang bisa Anda tangani dengan API <a href="{@docRoot}reference/com/google/android/gms/panorama/package-summary.html">panorama |
| Google</a>.</p> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <h2 id="PendingIntent">Menggunakan Intent Tertunda</h2> |
| |
| <p>Objek {@link android.app.PendingIntent} merupakan pembungkus objek {@link |
| android.content.Intent}. Tujuan utama {@link android.app.PendingIntent} |
| adalah memberikan izin pada aplikasi asing |
| untuk menggunakan {@link android.content.Intent} yang termuat seolah-olah dieksekusi dari |
| proses aplikasi Anda sendiri.</p> |
| |
| <p>Kasus penggunaan utama untuk intent tertunda antara lain:</p> |
| <ul> |
| <li>Mendeklarasikan intent untuk dieksekusi saat pengguna melakukan tindakan dengan <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Pemberitahuan</a> |
| ({@link android.app.NotificationManager} |
| sistem Android akan mengeksekusi {@link android.content.Intent}) Anda. |
| <li>Mendeklarasikan intent untuk dieksekusi saat pengguna melakukan tindakan dengan |
| <a href="{@docRoot}guide/topics/appwidgets/index.html">App Widget</a> |
| (aplikasi layar Home mengeksekusi {@link android.content.Intent}). |
| <li>Mendeklarasikan intent untuk dieksekusi di waktu yang telah ditetapkan di masa mendatang |
| ({@link android.app.AlarmManager} sistem Android akan mengeksekusi {@link android.content.Intent}). |
| </ul> |
| |
| <p>Karena setiap objek {@link android.content.Intent} didesain untuk ditangani oleh tipe |
| tertentu dari komponen aplikasi (baik {@link android.app.Activity}, {@link android.app.Service}, maupun |
| {@link android.content.BroadcastReceiver}), jadi {@link android.app.PendingIntent} harus |
| dibuat dengan pertimbangan yang sama. Saat menggunakan intent tertunda, aplikasi Anda tidak akan |
| mengeksekusi intent dengan panggilan seperti {@link android.content.Context#startActivity |
| startActivity()}. Anda harus mendeklarasikan tipe komponen yang dimaksud saat membuat |
| {@link android.app.PendingIntent} dengan memanggil metode kreator masing-masing:</p> |
| |
| <ul> |
| <li>{@link android.app.PendingIntent#getActivity PendingIntent.getActivity()} untuk |
| {@link android.content.Intent} yang memulai {@link android.app.Activity}.</li> |
| <li>{@link android.app.PendingIntent#getService PendingIntent.getService()} untuk |
| {@link android.content.Intent} yang memulai {@link android.app.Service}.</li> |
| <li>{@link android.app.PendingIntent#getBroadcast PendingIntent.getBroadcast()} untuk |
| {@link android.content.Intent} yang memulai {@link android.content.BroadcastReceiver}.</li> |
| </ul> |
| |
| <p>Kecuali jika aplikasi Anda <em>menerima</em> intent tertunda dari aplikasi lain, |
| metode di atas untuk membuat {@link android.app.PendingIntent} menjadi satu-satunya metode |
| {@link android.app.PendingIntent} yang mungkin Anda butuhkan.</p> |
| |
| <p>Tiap metode mengambil {@link android.content.Context} aplikasi saat itu, |
| {@link android.content.Intent} yang ingin Anda bungkus, dan satu atau beberapa flag yang menetapkan |
| cara penggunaan intent (misalnya apakah intent bisa digunakan lebih dari sekali).</p> |
| |
| <p>Informasi selengkapnya tentang intent tertunda disediakan pada dokumentasi untuk setiap |
| kasus penggunaan yang bersangkutan, seperti dalam panduan API <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notifications</a> |
| dan <a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a>.</p> |
| |
| |
| |
| |
| |
| |
| |
| <h2 id="Resolution">Resolusi Intent</h2> |
| |
| |
| <p>Saat sistem menerima intent implisit yang memulai suatu aktivitas, sistem tersebut akan mencari |
| aktivitas terbaik untuk intent dengan membandingkan intent dengan filter intent berdasarkan tiga aspek:</p> |
| |
| <ul> |
| <li>Tindakan intent |
| <li>Data intent (baik URI maupun tipe data) |
| <li>Kategori intent |
| </ul> |
| |
| <p>Bagian berikut menjelaskan cara pencocokan intent dengan komponen yang sesuai |
| sehubungan dengan cara pendeklarasian filter intent dalam file manifes aplikasi.</p> |
| |
| |
| <h3 id="ActionTest">Pengujian tindakan</h3> |
| |
| <p>Untuk menetapkan tindakan intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen |
| <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code |
| <action>}</a>. Misalnya:</p> |
| |
| <pre> |
| <intent-filter> |
| <action android:name="android.intent.action.EDIT" /> |
| <action android:name="android.intent.action.VIEW" /> |
| ... |
| </intent-filter> |
| </pre> |
| |
| <p>Untuk melewati filter ini, tindakan yang ditetapkan dalam {@link android.content.Intent} |
| harus sesuai dengan salah satu tindakan yang tercantum dalam filter.</p> |
| |
| <p>Jika filter tidak mencantumkan tindakan apa pun, maka tidak ada intent |
| yang dicocokkan, jadi semua intent gagal dalam pengujian. Akan tetapi, jika sebuah {@link android.content.Intent} |
| tidak menetapkan suatu tindakan, maka akan lolos pengujian (asalkan filter |
| berisi setidaknya satu tindakan).</p> |
| |
| |
| |
| <h3 id="CategoryTest">Pengujian kategori</h3> |
| |
| <p>Untuk menetapkan kategori intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen |
| <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code |
| <category>}</a>. Misalnya:</p> |
| |
| <pre> |
| <intent-filter> |
| <category android:name="android.intent.category.DEFAULT" /> |
| <category android:name="android.intent.category.BROWSABLE" /> |
| ... |
| </intent-filter> |
| </pre> |
| |
| <p>Agar intent bisa lolos pengujian kategori, setiap kategori dalam {@link android.content.Intent} |
| harus sesuai dengan kategori dalam filter. Kebalikannya tidak diperlukan—filter intent bisa |
| mendeklarasikan kategori lebih banyak daripada yang ditetapkan dalam {@link android.content.Intent} dan |
| {@link android.content.Intent} tetap akan lolos. Oleh karena itu, intent tanpa kategori harus |
| selalu lolos pengujian ini, kategori apa pun yang dideklarasikan dalam filter.</p> |
| |
| <p class="note"><strong>Catatan:</strong> |
| Android secara otomatis menerapkan kategori {@link android.content.Intent#CATEGORY_DEFAULT} |
| untuk semua intent implisit yang diteruskan ke {@link |
| android.content.Context#startActivity startActivity()} dan {@link |
| android.app.Activity#startActivityForResult startActivityForResult()}. |
| Jadi jika ingin aktivitas Anda menerima intent implisit, aktivitas tersebut harus |
| menyertakan kategori untuk{@code "android.intent.category.DEFAULT"} dalam filter intent (seperti |
| yang ditampilkan dalam contoh{@code <intent-filter>} sebelumnya.</p> |
| |
| |
| |
| <h3 id="DataTest">Pengujian data</h3> |
| |
| <p>Untuk menetapkan data intent yang diterima, filter intent bisa mendeklarasikan nol atau beberapa elemen |
| <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code |
| <data>}</a>. Misalnya:</p> |
| |
| <pre> |
| <intent-filter> |
| <data android:mimeType="video/mpeg" android:scheme="http" ... /> |
| <data android:mimeType="audio/mpeg" android:scheme="http" ... /> |
| ... |
| </intent-filter> |
| </pre> |
| |
| <p>Tiap elemen <code><a href="{@docRoot}guide/topics/manifest/data-element.html"><data></a></code> |
| bisa menetapkan struktur URI dan tipe data (tipe media MIME). Ada atribut |
| terpisah — {@code scheme}, {@code host}, {@code port}, |
| dan {@code path} — untuk setiap bagian URI: |
| </p> |
| |
| <p style="margin-left: 2em">{@code <scheme>://<host>:<port>/<path>}</p> |
| |
| <p> |
| Misalnya: |
| </p> |
| |
| <p style="margin-left: 2em">{@code content://com.example.project:200/folder/subfolder/etc}</p> |
| |
| <p>Dalam URI ini, skemanya adalah {@code content}, host-nya adalah {@code com.example.project}, |
| port-nya adalah {@code 200}, dan path-nya adalah {@code folder/subfolder/etc}. |
| </p> |
| |
| <p>Tiap atribut bersifat opsional dalam elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a>, |
| namun ada dependensi linear:</p> |
| <ul> |
| <li>Jika skema tidak ditetapkan, host akan diabaikan.</li> |
| <li>Jika host tidak ditetapkan, port akan diabaikan.</li> |
| <li>Jika skema dan host tidak ditetapkan, path akan diabaikan.</li> |
| </ul> |
| |
| <p>Bila URI dalam intent dibandingkan dengan spesifikasi URI dalam filter, |
| pembandingannya hanya dengan bagian URI yang disertakan dalam filter. Misalnya:</p> |
| <ul> |
| <li>Jika sebuah filter menetapkan hanya satu skema, semua URI dengan skema tersebut akan cocok |
| dengan filter.</li> |
| <li>Jika sebuah filter menetapkan satu skema dan satu otoritas namun tanpa path, semua URI |
| dengan skema dan otoritas yang sama akan lolos dari filter, apa pun path-nya.</li> |
| <li>Jika sebuah filter menetapkan satu skema, otoritas dan path, hanya URI dengan skema, |
| otoritas, dan path sama yang bisa lolos dari filter.</li> |
| </ul> |
| |
| <p class="note"><strong>Catatan:</strong> Spesifikasi path bisa berisi |
| wildcard bintang (*) untuk hanya mencocokkan nama path secara parsial.</p> |
| |
| <p>Pengujian data membandingkan URI maupun tipe MIME dalam intent dengan URI |
| dan tipe MIME yang ditetapkan dalam filter. Aturannya adalah sebagai berikut: |
| </p> |
| |
| <ol type="a"> |
| <li>Intent yang tidak berisi URI maupun tipe MIME hanya akan lolos |
| pengujian jika filter tersebut tidak menetapkan URI atau tipe MIME apa pun.</li> |
| |
| <li>Intent yang berisi URI namun tidak berisi tipe MIME (baik secara eksplisit maupun tidak langsung dari |
| URI) hanya akan lolos pengujian jika URI-nya cocok dengan format URI filter |
| dan filternya juga tidak menetapkan tipe MIME.</li> |
| |
| <li>Intent yang berisi tipe MIME namun tidak berisi URI hanya akan lolos pengujian |
| jika filter mencantumkan tipe MIME yang sama dan tidak menetapkan format URI.</li> |
| |
| <li>Intent yang berisi URI maupun tipe MIME (baik secara eksplisit maupun tidak langsung dari |
| URI) hanya akan lolos pengujian bagian tipe MIME jika |
| tipe tersebut cocok dengan tipe yang dicantumkan dalam filter. Ini akan lolos pengujian bagian URI |
| jika URI-nya cocok dengan URI dalam filter atau memiliki {@code content:} |
| atau URI {@code file:} dan filter tidak menetapkan URI. Dengan kata lain, |
| komponen dianggap mendukung data {@code content:} dan {@code file:} jika |
| filternya <em>hanya</em> mencantumkan tipe MIME.</p></li> |
| </ol> |
| |
| <p> |
| Aturan terakhir ini, aturan (d), mencerminkan harapan |
| bahwa komponen mampu mendapatkan data lokal dari file atau penyedia konten. |
| Oleh karena itu, filter mereka mencatumkan tipe data saja dan tidak secara eksplisit |
| harus menamai skema {@code content:} dan {@code file:}. |
| Ini adalah kasus umum. Elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a> |
| seperti berikut ini, misalnya, memberi tahu Android bahwa komponen bisa mengambil data gambar dari penyedia |
| konten dan menampilkannya: |
| </p> |
| |
| <pre> |
| <intent-filter> |
| <data android:mimeType="image/*" /> |
| ... |
| </intent-filter></pre> |
| |
| <p> |
| Karena sebagian besar data yang tersedia dikeluarkan oleh penyedia konten, filter yang |
| menetapkan tipe data namun bukan URI mungkin adalah yang paling umum. |
| </p> |
| |
| <p> |
| Konfigurasi umum yang lain adalah filter dengan skema dan tipe data. Misalnya |
| , elemen <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>}</a> |
| seperti berikut ini akan memberi tahu Android bahwa |
| komponen bisa mengambil data video dari jaringan untuk melakukan tindakan: |
| </p> |
| |
| <pre> |
| <intent-filter> |
| <data android:scheme="http" android:type="video/*" /> |
| ... |
| </intent-filter></pre> |
| |
| |
| |
| <h3 id="imatch">Pencocokan intent</h3> |
| |
| <p>Intent dicocokkan dengan filter intent selain untuk menemukan komponen |
| target yang akan diaktifkan, juga untuk menemukan sesuatu tentang rangkaian |
| komponen pada perangkat. Misalnya, aplikasi Home akan menempatkan launcher aplikasi |
| dengan mencari semua aktivitas dengan filter intent yang menetapkan tindakan |
| {@link android.content.Intent#ACTION_MAIN} dan |
| kategori {@link android.content.Intent#CATEGORY_LAUNCHER}.</p> |
| |
| <p>Aplikasi Anda bisa menggunakan pencocokan intent dengan cara serupa. |
| {@link android.content.pm.PackageManager} memiliki seperangkat metode {@code query...()} |
| yang mengembalikan semua komponen yang bisa menerima intent tertentu, dan |
| serangkaian metode{@code resolve...()} serupa yang menentukan komponen |
| terbaik untuk merespons intent. Misalnya, |
| {@link android.content.pm.PackageManager#queryIntentActivities |
| queryIntentActivities()} akan mengembalikan daftar semua aktivitas yang bisa melakukan |
| intent yang diteruskan sebagai argumen, dan {@link |
| android.content.pm.PackageManager#queryIntentServices |
| queryIntentServices()} akan mengembalikan daftar layanan serupa. |
| Tidak ada metode yang akan mengaktifkan komponen; mereka hanya mencantumkan komponen yang |
| bisa merespons. Ada metode serupa, |
| {@link android.content.pm.PackageManager#queryBroadcastReceivers |
| queryBroadcastReceivers()}, untuk penerima siaran. |
| </p> |
| |
| |
| |
| |