Salah satu fitur Android yang paling penting adalah kemampuan aplikasi untuk mengirimkan pengguna ke aplikasi lainnya
berdasarkan "tindakan" yang ingin dilakukannya. Misalnya, jika
aplikasi Anda memiliki alamat bisnis yang ingin ditampilkan pada peta, Anda tidak perlu membangun
aktivitas dalam aplikasi yang menampilkan peta. Sebagai gantinya, Anda dapat membuat permintaan untuk menampilkan alamat tersebut menggunakan Intent
. Lalu, sistem Android akan memulai aplikasi yang dapat menampilkan
alamat tersebut pada peta.
Seperti yang dijelaskan dalam class pertama, Membuat Aplikasi Pertama Anda, Anda harus menggunakan intent untuk membuka setiap aktivitas di aplikasi milik sendiri. Secara umum, Anda melakukannya dengan intent eksplisit yang akan menentukan nama persis dari class komponen yang ingin dimulai. Namun, saat Anda ingin aplikasi lain melakukan suatu tindakan, seperti ”melihat peta”, Anda harus menggunakan intent implisit.
Tutorial ini akan menunjukkan Anda cara membuat intent implisit bagi tindakan tertentu, dan cara menggunakannya untuk memulai aktivitas yang melakukan tindakan di aplikasi lain. Lihat juga video yang disematkan di sini, untuk memahami alasan pentingnya menyertakan pemeriksaan waktu proses untuk intent implisit Anda.
Membuat intent implisit
Intent implisit tidak mendeklarasikan nama class komponen yang akan dimulai, tetapi mendeklarasikan tindakan yang akan dilakukan. Tindakan tersebut menetapkan hal yang ingin Anda lakukan, misalnya lihat, edit, kirim, atau dapatkan sesuatu.
Mengaitkan tindakan intent dengan data
Intent juga sering menyertakan data yang terkait
dengan tindakan, seperti alamat yang ingin Anda lihat, atau pesan email yang ingin Anda kirim.
Bergantung pada intent yang akan dibuat, data tersebut mungkin berupa Uri
,
salah satu dari beberapa jenis data lain, atau mungkin intent tidak memerlukan data sama sekali.
Jika data berupa Uri
, ada konstruktor Intent()
sederhana yang dapat Anda gunakan untuk menentukan tindakan dan datanya.
Sebagai contoh, berikut adalah cara membuat intent untuk memulai panggilan telepon menggunakan data Uri
guna menetapkan nomor telepon:
Kotlin
val callIntent: Intent = Uri.parse("tel:5551234").let { number -> Intent(Intent.ACTION_DIAL, number) }
Java
Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
Saat aplikasi memanggil intent ini dengan memanggil startActivity()
, aplikasi Telepon akan memulai panggilan ke nomor telepon yang ditentukan.
Berikut adalah beberapa intent lainnya beserta pasangan tindakan dan data
Uri
-nya:
Lihat peta
Kotlin
// Map point based on address val mapIntent: Intent = Uri.parse( "geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California" ).let { location -> // Or map point based on latitude/longitude // val location: Uri = Uri.parse("geo:37.422219,-122.08364?z=14") // z param is zoom level Intent(Intent.ACTION_VIEW, location) }
Java
// Map point based on address Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); // Or map point based on latitude/longitude // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
Melihat halaman web
Kotlin
val webIntent: Intent = Uri.parse("https://www.android.com").let { webpage -> Intent(Intent.ACTION_VIEW, webpage) }
Java
Uri webpage = Uri.parse("https://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
Memberi tambahan ke intent
Jenis intent implisit lainnya memerlukan data "tambahan" yang menyediakan berbagai jenis data,
seperti string. Anda dapat menambahkan satu atau beberapa bagian data tambahan menggunakan metode putExtra()
yang beragam.
Secara default, sistem akan menentukan jenis MIME yang sesuai sebagaimana diperlukan oleh intent berdasarkan data Uri
yang disertakan. Jika tidak menyertakan Uri
dalam intent, Anda biasanya harus menggunakan setType()
untuk menentukan jenis data yang terkait dengan intent tersebut. Menentukan jenis MIME akan menjelaskan lebih lanjut jenis aktivitas yang akan menerima intent.
Berikut adalah beberapa intent lainnya yang memberikan data tambahan untuk menetapkan tindakan yang diinginkan:
Mengirim email dengan lampiran
Kotlin
Intent(Intent.ACTION_SEND).apply { // The intent does not have a URI, so declare the "text/plain" MIME type type = "text/plain" putExtra(Intent.EXTRA_EMAIL, arrayOf("jan@example.com")) // recipients putExtra(Intent.EXTRA_SUBJECT, "Email subject") putExtra(Intent.EXTRA_TEXT, "Email message text") putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")) // You can also attach multiple items by passing an ArrayList of Uris }
Java
Intent emailIntent = new Intent(Intent.ACTION_SEND); // The intent does not have a URI, so declare the "text/plain" MIME type emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jan@example.com"}); // recipients emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); // You can also attach multiple items by passing an ArrayList of Uris
Membuat acara kalender
Catatan: Intent untuk acara kalender ini hanya didukung dengan API level 14 dan yang lebih tinggi.
Kotlin
// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM. Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply { val beginTime: Calendar = Calendar.getInstance().apply { set(2021, 0, 23, 7, 30) } val endTime = Calendar.getInstance().apply { set(2021, 0, 23, 10, 30) } putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.timeInMillis) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.timeInMillis) putExtra(Events.TITLE, "Ninja class") putExtra(Events.EVENT_LOCATION, "Secret dojo") }
Java
// Event is on January 23, 2021 -- from 7:30 AM to 10:30 AM. Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); Calendar beginTime = Calendar.getInstance(); beginTime.set(2021, 0, 23, 7, 30); Calendar endTime = Calendar.getInstance(); endTime.set(2021, 0, 23, 10, 30); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); calendarIntent.putExtra(Events.TITLE, "Ninja class"); calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
Catatan: Anda harus menentukan Intent
sedetail mungkin. Sebagai contoh, jika ingin menampilkan gambar menggunakan intent ACTION_VIEW
, Anda harus menetapkan jenis MIME image/*
. Dengan demikian, aplikasi yang dapat “menampilkan” jenis data lain (seperti aplikasi peta) tidak akan terpicu
oleh intent tersebut.
Memulai aktivitas dengan intent
Setelah Anda membuat Intent
dan mengatur info tambahannya, panggil startActivity()
untuk mengirimkannya ke sistem:
Kotlin
startActivity(intent)
Java
startActivity(intent);
Menangani situasi ketika tidak ada aplikasi yang dapat menerima intent
Meskipun banyak intent yang berhasil ditangani oleh aplikasi lain yang diinstal
pada perangkat, seperti ponsel, email, atau aplikasi kalender, aplikasi Anda harus siap
menghadapi situasi ketika tidak ada aktivitas yang dapat menangani intent aplikasi. Setiap kali Anda
memanggil intent, bersiaplah untuk menangkap
ActivityNotFoundException
,
yang terjadi jika tidak ada aktivitas yang dapat menangani intent aplikasi Anda:
Kotlin
try { startActivity(intent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
try { startActivity(intent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Setelah menangkap pengecualian ini, putuskan hal yang akan harus dilakukan aplikasi Anda. Langkah berikutnya ini bergantung pada karakteristik tertentu intent yang Anda coba panggil. Misalnya, jika Anda mengetahui aplikasi tertentu yang dapat menangani intent, berikan link kepada pengguna untuk mendownload aplikasi tersebut. Pelajari lebih lanjut cara menautkan ke produk Anda di Google Play.
Dialog disambiguasi
Jika sistem mengidentifikasi lebih dari satu aktivitas yang dapat menangani intent tersebut, sistem akan menampilkan dialog (terkadang disebut "dialog disambiguasi") kepada pengguna untuk memilih aplikasi yang akan digunakan, seperti yang ditunjukkan dalam gambar 1. Jika hanya ada satu aktivitas yang menangani intent, sistem akan langsung memulainya.
Contoh lengkap
Berikut adalah contoh lengkap yang menunjukkan cara membuat intent untuk menampilkan peta, memverifikasi adanya aplikasi yang akan menangani intent tersebut, lalu memulainya:
Kotlin
// Build the intent. val location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California") val mapIntent = Intent(Intent.ACTION_VIEW, location) // Try to invoke the intent. try { startActivity(mapIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Build the intent. Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); // Try to invoke the intent. try { startActivity(mapIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Menampilkan pemilih aplikasi
Perhatikan bahwa saat Anda memulai aktivitas dengan meneruskan Intent
ke startActivity()
dan ada lebih dari satu aplikasi yang merespons intent tersebut, pengguna dapat memilih aplikasi yang akan digunakan secara default (dengan memilih kotak centang di bagian bawah dialog; lihat gambar 1). Hal ini cukup berguna saat melakukan tindakan yang berkaitan dengan situasi saat pengguna ingin selalu menggunakan aplikasi yang sama, seperti saat membuka halaman web (pengguna cenderung menggunakan satu browser web saja) atau mengambil foto (pengguna cenderung menyukai satu kamera).
Namun, jika tindakan yang akan dilakukan dapat ditangani oleh beberapa aplikasi dan pengguna mungkin lebih suka berganti-ganti aplikasi, seperti tindakan "berbagi" saat pengguna mungkin memiliki beberapa aplikasi yang digunakan untuk berbagi item, Anda harus menampilkan dialog pilihan secara eksplisit seperti yang ditunjukkan dalam gambar 2. Dialog pilihan ini akan memaksa pengguna untuk memilih aplikasi yang akan selalu digunakan bagi tindakan tersebut (pengguna tidak dapat memilih aplikasi default untuk tindakan tersebut).
Untuk menampilkan pilihan, buat Intent
menggunakan createChooser()
dan teruskan ke startActivity()
. Contoh:
Kotlin
val intent = Intent(Intent.ACTION_SEND) // Create intent to show chooser val chooser = Intent.createChooser(intent, /* title */ null) // Try to invoke the intent. try { startActivity(chooser) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
Intent intent = new Intent(Intent.ACTION_SEND); // Create intent to show chooser Intent chooser = Intent.createChooser(intent, /* title */ null); // Try to invoke the intent. try { startActivity(chooser); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Intent ini akan menampilkan dialog berisi daftar aplikasi yang merespons intent yang diteruskan
ke metode
createChooser()
. Parameter title
dapat
disediakan jika tindakannya bukan
ACTION_SEND
atau
ACTION_SEND_MULTIPLE