Jika aplikasi Anda dapat melakukan tindakan yang mungkin berguna untuk aplikasi lain, siapkan aplikasi untuk merespons permintaan tindakan dengan menentukan filter intent yang sesuai dalam aktivitas Anda.
Misalnya, jika Anda
membuat aplikasi sosial yang dapat berbagi pesan atau foto dengan teman-teman pengguna, Anda harus
mendukung intent ACTION_SEND
.
Kemudian, ketika pengguna memulai tindakan "bagikan" dari aplikasi lain, aplikasi Anda akan muncul sebagai pilihan dalam
dialog pilihan (juga disebut dialog disambiguasi), seperti dalam gambar 1.
Untuk memungkinkan aplikasi lain memulai aktivitas Anda dengan cara ini, Anda perlu menambahkan elemen <intent-filter>
dalam file manifes untuk elemen <activity>
yang sesuai.
Saat aplikasi Anda diinstal di sebuah perangkat, sistem akan mengidentifikasi filter intent Anda
dan menambahkan informasi ke katalog internal intent yang didukung oleh semua aplikasi terinstal.
Saat aplikasi memanggil startActivity()
atau startActivityForResult()
dengan intent implisit, sistem akan memeriksa aktivitas yang dapat merespons
intent tersebut.
Menambahkan filter intent
Untuk menentukan dengan benar intent yang dapat ditangani aktivitas Anda, buat setiap filter intent yang Anda tambahkan sespesifik mungkin dalam hal jenis tindakan dan data yang diterima aktivitas tersebut.
Sistem dapat mengirim Intent
tertentu ke aktivitas jika aktivitas tersebut
memiliki filter intent yang memenuhi kriteria objek Intent
berikut:
- Tindakan
- String yang menyebutkan tindakan yang akan dilakukan. Biasanya berupa salah satu nilai yang ditentukan platform, seperti
ACTION_SEND
atauACTION_VIEW
.Tetapkan string ini dalam filter intent Anda dengan elemen
<action>
. Nilai yang ditentukan dalam elemen ini harus berupa nama string lengkap untuk tindakan, bukan konstanta API, seperti yang ditunjukkan dalam contoh di halaman ini. - Data
- Deskripsi data yang terkait dengan intent.
Tetapkan string ini dalam filter intent Anda dengan elemen
<data>
. Dengan menggunakan satu atau beberapa atribut dalam elemen ini, Anda dapat menentukan jenis MIME saja, awalan URI saja, skema URI saja, atau kombinasi beberapa atribut tersebut dan hal-hal lain yang menunjukkan jenis data yang diterima.Catatan: Jika Anda tidak perlu mendeklarasikan detail data
Uri
, seperti saat aktivitas Anda menangani data "ekstra" jenis lain, bukan URI, tentukan hanya atributandroid:mimeType
yang mendeklarasikan jenis data yang ditangani aktivitas, sepertitext/plain
atauimage/jpeg
. - Kategori
- Memberikan cara tambahan untuk menggambarkan karakter aktivitas yang menangani intent, biasanya terkait
dengan lokasi atau gestur pengguna saat aktivitas dimulai. Ada beberapa kategori
yang didukung oleh sistem, tetapi sebagian besarnya jarang digunakan. Namun, semua intent implisit ditentukan
secara default dengan
CATEGORY_DEFAULT
.Tetapkan string ini dalam filter intent Anda dengan elemen
<category>
.
Dalam filter intent, Anda dapat mendeklarasikan kriteria yang diterima
aktivitas dengan mendeklarasikan setiap kriteria tersebut dengan elemen XML yang sesuai yang tersarang dalam elemen
<intent-filter>
.
Sebagai contoh, berikut adalah aktivitas dengan filter intent yang menangani intent ACTION_SEND
ketika jenis datanya berupa teks atau gambar:
<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"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
Tip: Jika ingin membedakan ikon dalam dialog pemilih
dengan ikon default aktivitas, tambahkan android:icon
di elemen
<intent-filter>
.
Setiap intent yang masuk akan menentukan satu tindakan dan satu jenis data saja, tetapi boleh mendeklarasikan beberapa
instance elemen <action>
, <category>
, dan <data>
, di setiap
<intent-filter>
.
Jika ada dua pasang tindakan dan data yang perilakunya sama-sama khusus, buat filter intent terpisah untuk menentukan tindakan mana yang dapat diterima ketika disambungkan dengan suatu jenis data.
Misalnya, aktivitas Anda menangani teks dan gambar untuk intent ACTION_SEND
dan ACTION_SENDTO
. Dalam situasi ini, Anda harus menentukan dua filter
intent yang terpisah untuk kedua tindakan tersebut karena intent ACTION_SENDTO
harus menggunakan Uri
data untuk menentukan
alamat penerima menggunakan skema URI send
atau sendto
. Hal ini ditunjukkan dalam contoh berikut:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Catatan: Untuk menerima intent implisit, Anda harus menyertakan
kategori CATEGORY_DEFAULT
dalam filter intent. Metode startActivity()
dan startActivityForResult()
memperlakukan semua intent seolah-olah
mendeklarasikan kategori CATEGORY_DEFAULT
. Jika Anda tidak mendeklarasikan
dalam filter intent, tidak ada intent implisit yang ditetapkan ke aktivitas Anda.
Untuk mengetahui informasi selengkapnya tentang mengirim dan menerima intent ACTION_SEND
yang melakukan perilaku berbagi sosial, lihat Menerima data sederhana dari aplikasi lain.
Anda juga dapat menemukan informasi yang berguna tentang berbagi data dalam
Berbagi Data Sederhana dan Berbagi File.
Menangani intent dalam aktivitas Anda
Untuk menentukan tindakan yang harus diambil dalam aktivitas Anda, baca
Intent
yang digunakan untuk memulai aktivitas.
Saat aktivitas Anda dimulai, panggil getIntent()
untuk mengambil
Intent
yang memulai aktivitas tersebut. Anda dapat melakukannya kapan saja selama
siklus proses aktivitas, tetapi secara umum Anda harus melakukannya selama callback awal seperti
onCreate()
atau onStart()
.
Hal ini ditunjukkan dalam contoh berikut:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
Menampilkan hasil
Jika Anda ingin menampilkan hasil ke aktivitas yang memanggil milik Anda, cukup panggil setResult()
untuk menetapkan kode hasil dan Intent
hasil. Setelah operasi selesai dan pengguna kembali ke aktivitas
asal, panggil finish()
untuk
menutup dan menghancurkan aktivitas Anda. Hal ini ditunjukkan dalam contoh berikut:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
Anda harus selalu menentukan kode hasil beserta hasilnya. Secara umum, kode tersebut adalah RESULT_OK
atau RESULT_CANCELED
. Anda kemudian
dapat memberikan data tambahan dengan Intent
, jika diperlukan.
Catatan: Hasil akan ditetapkan ke
RESULT_CANCELED
secara default. Jadi, jika pengguna menekan tombol Kembali
sebelum menyelesaikan tindakan dan sebelum Anda menetapkan hasilnya, aktivitas asal akan menerima
hasil yang “dibatalkan”.
Jika hanya perlu mengembalikan integer yang menunjukkan salah satu opsi hasil, Anda bisa menyetel
kode hasil ke nilai yang lebih tinggi dari 0. Jika Anda menggunakan kode hasil untuk menyampaikan integer dan
tidak perlu menyertakan Intent
,
Anda dapat memanggil setResult()
dan meneruskan kode hasil saja:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
Dalam situasi ini, mungkin hanya ada sedikit hasil yang akan diberikan sehingga kode hasilnya adalah integer yang ditentukan secara lokal (lebih besar dari 0). Hal ini akan berhasil jika Anda menampilkan hasil ke aktivitas dalam aplikasi Anda sendiri, karena aktivitas yang menerima hasil tersebut dapat mereferensikan konstanta publik untuk menentukan nilai kode hasil.
Catatan: Anda tidak perlu memeriksa apakah aktivitas Anda dimulai
dengan startActivity()
atau startActivityForResult()
. Cukup panggil setResult()
jika intent yang memulai aktivitas
Anda mungkin mengharapkan sebuah hasil. Jika aktivitas yang menjadi asalnya telah memanggil startActivityForResult()
, sistem akan memberikan
hasil yang Anda berikan ke setResult()
; jika tidak, hasil akan diabaikan.