Mengirimkan pengguna ke aplikasi lain

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.

Panel muncul
  di dekat bagian bawah layar. Panel ini mencantumkan berbagai aplikasi yang dapat
  menangani intent ini.

Gambar 1. Contoh dialog pilihan yang muncul saat ada lebih dari satu aplikasi yang dapat menangani intent.

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

Gambar 2. Dialog pilihan.

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