Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

Maksud dan Filter Maksud

Intent merupakan objek pertukaran pesan yang bisa Anda gunakan untuk meminta aksi dari komponen aplikasi lain. Walaupun maksud memudahkan komunikasi antarkomponen dalam beberapa cara, ada tiga kasus-penggunaan dasar:

  • Untuk memulai aktivitas:

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

    Jika Anda ingin menerima hasil dari aktivitas bila selesai, panggil startActivityForResult(). Aktivitas Anda menerima hasil sebagai objek Intent terpisah dalam callback onActivityResult() aktivitas Anda. Untuk informasi selengkapnya, lihat panduan Aktivitas.

  • Untuk memulai layanan:

    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 Intent ke startService(). Intent menjelaskan layanan yang akan dimulai dan membawa data yang diperlukan.

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

  • Untuk mengirim siaran:

    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 Intent ke sendBroadcast(), sendOrderedBroadcast(), atau sendStickyBroadcast().

Tipe Maksud

Ada dua tipe maksud:

  • Maksud eksplisit menetapkan komponen untuk memulai dengan nama ( nama kelas yang sepenuhnya memenuhi syarat). Anda biasanya akan menggunakan maksud 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 aksi pengguna atau mulai layanan untuk mengunduh file di latar belakang.
  • Maksud implisit tidak menetapkan komponen tertentu, melainkan mendeklarasikan aksi umum yang dilakukan, yang memungkinkan komponen aplikasi lain untuk menanganinya. Misalnya, jika Anda ingin menampilkan sebuah lokasi di peta pada pengguna, Anda bisa menggunakan maksud implisit untuk meminta aplikasi lain yang mampu untuk menunjukkan lokasi yang telah ditetapkan di peta tersebut.

Saat Anda membuat maksud eksplisit untuk memulai aktivitas atau layanan, sistem akan segera memulai komponen aplikasi yang telah ditetapkan dalam objek Intent.

Gambar 1. Ilustrasi yang menggambarkan cara maksud implisit disampaikan melalui sistem untuk memulai aktivitas lain: [1] Aktivitas A membuat sebuah Intent dengan keterangan aksi dan meneruskannya ke startActivity(). [2] Sistem Android akan menelusuri semua aplikasi untuk filter maksud yang cocok dengan maksud tersebut. Bila ditemukan yang cocok, [3] sistem akan memulai aktivitas mencocokkan (Aktivitas B) dengan memanggil metode onCreate() dan meneruskannya ke Intent.

Bila Anda membuat maksud implisit, sistem Android akan menemukan komponen yang sesuai untuk memulai dengan membandingkan materi maksud dengan filter maksud yang dideklarasikan dalam file manifes aplikasi lain di perangkat. Jika maksud cocok dengan filter maksud, sistem akan memulai komponen tersebut dan mengiriminya objek Intent. Jika banyak filter maksud yang kompatibel, sistem menampilkan dialog sehingga pengguna bisa memilih aplikasi yang akan digunakan.

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

Perhatian: Untuk memastikan aplikasi Anda aman, selalu gunakan maksud eksplisit saat memulai Service dan jangan mendeklarasikan filter maksud untuk layanan. Menggunakan maksud implisit untuk memulai layanan akan menimbulkan bahaya keamanan karena Anda tidak bisa memastikan layanan apa yang akan merespons maksud, dan pengguna tidak bisa melihat layanan mana yang dimulai. Mulai dari Android 5.0 (API level 21), sistem melontarkan pengecualian jika Anda memanggil bindService() dengan maksud implisit.

Membangun Maksud

Objek Intent membawa informasi yang digunakan sistem Android untuk menentukan komponen mana yang akan dimulai (misalnya nama persis dari suatu komponen atau kategori komponen yang seharusnya menerima maksud), ditambah informasi yang digunakan komponen penerima untuk melakukan aksi dengan benar (misalnya aksi yang harus dilakukan dan data yang harus diolah).

Informasi utama yang dimuat dalam Intent adalah sebagai berikut:

Nama komponen
Nama komponen yang akan dimulai.

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

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

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

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

Dalam hal maksud siaran, ini adalah aksi yang terjadi dan dilaporkan. Aksi ini sangat menentukan bagaimana keseluruhan maksud disusun—terutama apa yang dimuat dalam data dan tambahan.

Anda bisa menetapkan tindakan sendiri yang akan digunakan oleh maksud dalam aplikasi Anda (atau digunakan oleh aplikasi lain untuk memanggil komponen dalam aplikasi Anda), namun Anda harus menggunakan konstanta aksi yang didefinisikan oleh kelas Intent atau kelas kerangka kerja lain. Berikut ini adalah beberapa tindakan umum untuk memulai sebuah aktivitas:

ACTION_VIEW
Gunakan aksi ini dalam maksud dengan startActivity() bila Anda memiliki beberapa informasi yang bisa ditampilkan aktivitas kepada pengguna, misalnya foto yang bisa dilihat dalam aplikasi galeri, atau alamat yang bisa dilihat dalam aplikasi peta.
ACTION_SEND
Juga dikenal dengan maksud "berbagi", Anda harus menggunakannya dalam maksud bersama startActivity() bila Anda memiliki data yang bisa digunakan pengguna untuk berbagi melalui aplikasi lain, misalnya aplikasi email atau aplikasi berbagi di jaringan sosial.

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

Anda bisa menetapkan aksi untuk sebuah maksud dengan setAction() atau dengan konstruktor Intent.

Jika mendefinisikan tindakan Anda sendiri, pastikan untuk memasukkan nama paket aplikasi Anda sebagai awalan. Misalnya:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Data
URI (objek Uri) yang mengacu data untuk diolah dan/atau tipe MIME dari data tersebut. Tipe data yang disediakan umumnya didikte oleh aksi maksud. Misalnya, jika aksi merupakan ACTION_EDIT, data harus berisi URI dari dokumen untuk diedit.

Saat membuat sebuah maksud, sering kali 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 maksud. Akan tetapi, tipe MIME sering kali bisa diambil dari URI—terutama saat datanya merupakan URI content:, yang menunjukkan data tersebut berada di perangkat dan dikontrol oleh ContentProvider, yang membuat data tipe MIME terlihat oleh sistem.

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

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

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

Lihat keterangan kelas Intent untuk mengetahui daftar lengkap kategori.

Anda bisa menetapkan kategori dengan addCategory().

Properti yang tercantum di atas (nama komponen, aksi, data, dan kategori) menyatakan karakteristik yang mendefinisikan maksud. Dengan membaca properti ini, sistem Android mampu memutuskan komponen aplikasi yang harus dimulainya.

Akan tetapi, maksud bisa membawa informasi tambahan yang tidak memengaruhi cara maksud ditetapkan pada komponen aplikasi. Maksud juga bisa menyediakan:

Tambahan
Pasangan nilai-kunci yang membawa informasi yang diperlukan untuk menghasilkan aksi yang diminta. Seperti halnya beberapa tindakan menggunakan jenis tertentu URI data, beberapa tindakan juga menggunakan tambahan tertentu.

Anda bisa menambahkan data ekstra dengan beragam metode putExtra(), masing-masing menerima dua parameter: nama kunci dan nilainya. Anda juga bisa membuat objek Bundle dengan semua data ekstra, kemudian memasukkan Bundle dalam Intent dengan putExtras().

Misalnya, saat membuat maksud yang akan dikirimkan bersama email ACTION_SEND, Anda bisa menetapkan penerima "kepada" dengan kunci EXTRA_EMAIL, dan menetapkan "subjek" dengan kunci EXTRA_SUBJECT.

Kelas Intent menetapkan beberapa konstanta EXTRA_* untuk tipe data standar. Jika Anda ingin mendeklarasikan kunci ekstra sendiri (untuk maksud yang diterima aplikasi Anda), pastikan untuk memasukkan nama paket aplikasi sebagai awalan. Misalnya:

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Flag
Flag didefinisikan dalam kelas Intent yang berfungsi sebagai metadata untuk maksud. Flag menginstruksikan cara meluncurkan aktivitas (misalnya, tugas mana yang harus dimiliki suatu aktivitas ) dan cara memperlakukannya setelah diluncurkan (misalnya, apakah aktivitas tersebut masuk ke dalam daftar aktivitas terbaru) pada sistem Android.

Untuk informasi selengkapnya, lihat metode setFlags().

Contoh maksud eksplisit

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

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

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

Konstruktor Intent(Context, Class) menyediakan Context aplikasi dan objek Class pada komponen. Dengan demikian, maksud ini secara eksplisit memulai kelas DownloadService dalam aplikasi.

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

Contoh maksud implisit

Maksud implisit menetapkan aksi yang bisa memanggil aplikasi pada perangkat yang mampu melakukan aksi. Menggunakan maksud implisit berguna bila aplikasi Anda tidak bisa melakukan aksi, namun aplikasi lain mungkin bisa melakukannya dan Anda ingin pengguna untuk memilih aplikasi mana yang ingin digunakan.

Misalnya, jika memiliki materi yang Anda ingin agar pengguna berbagi materi itu dengan orang lain, buatlah maksud dengan aksi ACTION_SEND dan tambahan ekstra yang menetapkan materi yang akan dibagikan. Bila Anda memanggil startActivity() dengan maksud tersebut, pengguna bisa memilih aplikasi yang akan digunakan untuk berbagi materi.

Perhatian: Ada kemungkinan pengguna tidak memiliki suatu aplikasi yang menangani maksud implisit yang Anda kirimkan ke startActivity(). Jika itu terjadi, panggilan akan gagal dan aplikasi Anda akan mogok. Untuk memeriksa apakah aktivitas bisa menerima maksud, panggil resolveActivity() pada objek Intent Anda. Jika hasilnya bukan nol, berarti setidaknya ada satu aplikasi yang bisa menangani maksud tersebut dan aman untuk memanggil startActivity(). Jika hasilnya nol, Anda tidak boleh menggunakan maksud tersebut dan, jika memungkinkan, Anda harus menonaktifkan fitur yang mengeluarkan maksud tersebut.

// 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);
}

Catatan: Dalam hal ini, URI tidak digunakan, namun tipe data maksud dideklarasikan untuk menetapkan materi yang dibawa oleh tambahan.

Saat startActivity() dipanggil, sistem akan memeriksa semua aplikasi yang tepasang untuk menentukan aplikasi mana yang bisa menangani maksud jenis ini ( maksud dengan aksi ACTION_SEND dan yang membawa data "teks/polos"). Jika hanya ada satu aplikasi yang bisa menanganinya, aplikasi tersebut akan langsung terbuka dan diberi maksud tersebut. Jika banyak aktivitas menerima maksud, sistem akan menampilkan dialog sehingga pengguna bisa memilih aplikasi mana yang digunakan.

Gambar 2. Dialog pemilih.

Memaksakan pemilih aplikasi

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

Akan tetapi, jika ada banyak aplikasi yang bisa merespons maksud 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 aksi tertentu setiap kali (pengguna tidak bisa memilih aplikasi default untuk aksi tersebut). Misalnya, bila aplikasi Anda melakukan "berbagi" dengan aksi 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.

Untuk menampilkan pemilih, buat Intent menggunakan createChooser() dan teruskan startActivity() padanya. Misalnya:

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

Ini menampilkan dialog berisi daftar aplikasi yang merespons maksud yang diteruskan ke metode createChooser() dan menggunakan teks yang disediakan sebagai judul dialog.

Menerima Maksud Implisit

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

Catatan: Maksud eksplisit selalu dikirimkan ke targetnya, apa pun filter maksud yang dideklarasikan komponen.

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

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

<action>
Mendeklarasikan aksi maksud yang diterima, dalam atribut name. Nilai haruslah nilai string literal dari aksi, bukan konstanta kelas.
<data>
Mendeklarasikan tipe data yang diterima, menggunakan salah satu atau beberapa atribut yang menetapkan beragam aspek URI data (scheme, host, port, path, dll.) dan tipe MIME.
<category>
Mendeklarasikan kategori maksud yang diterima, dalam atribut name. Nilai haruslah nilai string literal dari aksi, bukan konstanta kelas.

Catatan: Untuk menerima maksud implisit, Anda harus menyertakan kategori CATEGORY_DEFAULT dalam filter maksud. Metode startActivity() dan startActivityForResult() memperlakukan semua maksud seolah-olah mendeklarasikan kategori CATEGORY_DEFAULT. Jika tidak mendeklarasikan kategori ini dalam filter maksud Anda, tidak ada maksud implisit yang ditetapkan untuk aktivitas Anda.

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

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

Anda bisa membuat filter yang menyertakan lebih dari satu instance <action>, <data>, atau <category>. Jika melakukannya, Anda hanya perlu memastikan bahwa komponen bisa menangani semua kombinasi elemen filter tersebut.

Bila ingin menangani beragam jenis maksud, namun hanya dalam kombinasi aksi, data, dan tipe kategori tertentu, maka Anda harus membuat banyak filter maksud.

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

Perhatian: Untuk menghindari menjalankan Service aplikasi yang berbeda secara tidak sengaja, selalu gunakan maksud eksplisit untuk memulai layanan Anda sendiri dan jangan deklarasikan filter maksud untuk layanan Anda.

Catatan: Untuk semua aktivitas, Anda harus mendeklarasikan filter maksud dalam file manifes. Akan tetapi, filter untuk penerima siaran bisa didaftarkan secara dinamis dengan memanggil registerReceiver(). Anda nanti bisa mencabut pendaftaran penerima dengan unregisterReceiver(). Dengan begitu aplikasi Anda bisa mendengarkan siaran tertentu hanya selama periode waktu yang telah ditetapkan saat aplikasi Anda berjalan.

Contoh filter

Untuk lebih memahami beberapa perilaku filter maksud, lihatlah cuplikan berikut dari file manifes aplikasi berbagi di jaringan sosial.

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

Aktivitas pertama, MainActivity, merupakan titik masuk utama aplikasi—aplikasi yang terbuka saat pengguna meluncurkan aplikasi dengan ikon peluncur:

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

Keduanya harus dipasangkan bersama agar aktivitas muncul dalam peluncur aplikasi.

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

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

Menggunakan Maksud Tertunda

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

Kasus penggunaan utama untuk maksud tertunda antara lain:

  • Mendeklarasikan maksud untuk dieksekusi saat pengguna melakukan aksi dengan Notifikasi (NotificationManager sistem Android akan mengeksekusi Intent) Anda.
  • Mendeklarasikan maksud untuk dieksekusi saat pengguna melakukan aksi dengan App Widget (aplikasi layar Utama mengeksekusi Intent).
  • Mendeklarasikan maksud untuk dieksekusi di waktu yang telah ditetapkan di masa mendatang (AlarmManager sistem Android akan mengeksekusi Intent).

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

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

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

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

Resolusi Maksud

Saat sistem menerima maksud implisit yang memulai suatu aktivitas, sistem tersebut akan menelusuri aktivitas terbaik untuk maksud dengan membandingkan maksud dengan filter maksud berdasarkan tiga aspek:

  • Aksi maksud
  • Data maksud (baik URI maupun tipe data)
  • Kategori maksud

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

Pengujian aksi

Untuk menetapkan tindakan maksud yang diterima, filter maksud bisa mendeklarasikan nol atau beberapa elemen <action>. Misalnya:

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

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

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

Pengujian kategori

Untuk menetapkan kategori maksud yang diterima, filter maksud bisa mendeklarasikan nol atau beberapa elemen <category>. Misalnya:

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

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

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

Pengujian data

Untuk menetapkan data maksud yang diterima, filter maksud bisa mendeklarasikan nol atau beberapa elemen <data>. Misalnya:

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

Tiap elemen <data> bisa menetapkan struktur URI dan tipe data (tipe media MIME). Ada beberapa atribut terpisah — scheme, host, port, dan path — untuk setiap bagian URI:

<scheme>://<host>:<port>/<path>

Misalnya:

content://com.example.project:200/folder/subfolder/etc

Dalam URI ini, skemanya adalah content, host-nya adalah com.example.project, portanya adalah 200, dan jalurnya adalah folder/subfolder/etc.

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

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

Bila URI dalam maksud dibandingkan dengan spesifikasi URI dalam filter, pembandingannya hanya dengan bagian URI yang disertakan dalam filter. Misalnya:

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

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

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

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

Aturan terakhir ini, aturan (d), mencerminkan harapan bahwa komponen mampu mendapatkan data lokal dari file atau penyedia materi. Oleh karena itu, filternya mencantumkan tipe data saja dan tidak secara eksplisit perlu menamai skema content: dan file:. Ini adalah kasus umum. Elemen <data> seperti berikut ini, misalnya, memberi tahu Android bahwa komponen bisa mengambil data gambar dari penyedia materi dan menampilkannya:

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

Karena sebagian besar data yang tersedia dikeluarkan oleh penyedia materi, filter yang menetapkan tipe data namun bukan URI mungkin adalah yang paling umum.

Konfigurasi umum yang lain adalah filter dengan skema dan tipe data. Misalnya, elemen <data> seperti berikut ini akan memberi tahu Android bahwa komponen bisa mengambil data video dari jaringan untuk melakukan aksi:

<intent-filter>
    <data android:scheme="http" android:type="video/*" />
    ...
</intent-filter>

Pencocokan maksud

Maksud dicocokkan dengan filter maksud selain untuk menemukan komponen target yang akan diaktifkan, juga untuk menemukan sesuatu tentang rangkaian komponen pada perangkat. Misalnya, aplikasi Beranda akan menempatkan peluncur aplikasi dengan mencari semua aktivitas dengan filter maksud yang menetapkan aksi ACTION_MAIN dan kategori CATEGORY_LAUNCHER.

Aplikasi Anda bisa menggunakan pencocokan maksud dengan cara serupa. PackageManager memiliki seperangkat metode query...() yang mengembalikan semua komponen yang bisa menerima maksud tertentu, dan serangkaian metode resolve...() serupa yang menentukan komponen terbaik untuk merespons maksud. Misalnya, queryIntentActivities() akan mengembalikan daftar semua aktivitas yang bisa melakukan maksud yang diteruskan sebagai argumen, dan 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.