Register now for Android Dev Summit 2019!

Mengirimkan Pengguna ke Aplikasi Lain

Salah satu fitur terpenting Android adalah kemampuan aplikasi mengirim pengguna ke aplikasi lain berdasarkan “aksi” yang ingin dilakukannya. Misalnya, jika aplikasi Anda memiliki alamat bisnis yang ingin ditampilkan pada peta, Anda tidak harus membangun aktivitas dalam aplikasi yang menampilkan peta. Sebagai gantinya, Anda bisa membuat permintaan untuk melihat alamat itu menggunakan Intent. Sistem Android kemudian memulai aplikasi yang mampu menampilkan alamat itu pada peta.

Seperti dijelaskan di kelas pertama, Membangun Aplikasi Pertama Anda, Anda harus menggunakan maksud untuk berpindah di antara aktivitas dalam aplikasi Anda sendiri. Secara umum, Anda melakukannya dengan maksud eksplisit, yang mendefinisikan nama kelas persis dari komponen yang ingin Anda mulai. Akan tetapi, bila Anda ingin aplikasi terpisah melakukan suatu tindakan, misalnya "melihat peta", Anda harus menggunakan intent implisit.

Pelajaran ini menampilkan kepada Anda cara membuat maksud implisit bagi aksi tertentu, dan cara menggunakannya untuk memulai aktivitas yang melakukan aksi itu dalam aplikasi lain. Lihat juga video yang disematkan di sini untuk memahami mengapa Anda harus menyertakan pemeriksaan runtime untuk intent tersirat Anda.

Membangun Intent Implisit

Maksud implisit tidak mendeklarasikan nama kelas komponen yang akan dimulai, melainkan mendeklarasikan tindakan yang akan dilakukan. Tindakan ini menetapkan hal yang ingin Anda lakukan, misalnya lihat, edit, kirim, atau ambil sesuatu. Intent sering juga mencakup data yang terkait dengan tindakan, seperti alamat yang ingin Anda lihat, atau pesan email yang ingin Anda kirimkan. Bergantung pada intent yang ingin Anda buat, datanya mungkin Uri, salah satu dari beberapa jenis data lain, atau intent-nya mungkin tidak memerlukan data sama sekali.

Jika data Anda Uri, ada konstruktor Intent() sederhana yang dapat Anda gunakan untuk mendefinisikan tindakan dan data.

Misalnya, inilah cara membuat maksud untuk memulai panggilan telepon menggunakan data Uri untuk menetapkan nomor ponsel:

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

Bila aplikasi Anda memicu maksud ini dengan memanggil startActivity(), aplikasi Phone akan memulai panggilan ke nomor ponsel yang diberikan.

Inilah sepasang maksud lain dan tindakannya serta pasangan data Uri:

  • Melihat 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
        // Uri location = 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("http://www.android.com").let { webpage ->
        Intent(Intent.ACTION_VIEW, webpage)
    }
    

    Java

    Uri webpage = Uri.parse("http://www.android.com");
    Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
    

Jenis intent implisit lainnya memerlukan data "ekstra" yang menyediakan tipe data berbeda, misalnya string. Anda bisa menambahkan satu atau beberapa potongan data ekstra yang menggunakan beragam metode putExtra().

Secara default, sistem menentukan tipe MIME yang sesuai dengan yang diperlukan oleh intent berdasarkan dataUri yang disertakan. Jika Anda tidak menyertakan Uri dalam intent, biasanya Anda harus menggunakan setType() untuk menetapkan tipe data yang dikaitkan dengan intent. Menyetel tipe MIME akan menetapkan lebih jauh jenis aktivitas yang akan menerima maksud.

Inilah beberapa intent lainnya yang menambahkan data ekstra untuk menetapkan aksi yang diinginkan:

  • Mengirim email beserta lampiran:

    Kotlin

    Intent(Intent.ACTION_SEND).apply {
        // The intent does not have a URI, so declare the "text/plain" MIME type
        type = HTTP.PLAIN_TEXT_TYPE
        putExtra(Intent.EXTRA_EMAIL, arrayOf("jon@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[] {"jon@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:

    Kotlin

    Intent(Intent.ACTION_INSERT, Events.CONTENT_URI).apply {
        val beginTime: Calendar = Calendar.getInstance().apply {
            set(2012, 0, 19, 7, 30)
        }
        val endTime = Calendar.getInstance().apply {
            set(2012, 0, 19, 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

    Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
    Calendar beginTime = Calendar.getInstance();
    beginTime.set(2012, 0, 19, 7, 30);
    Calendar endTime = Calendar.getInstance();
    endTime.set(2012, 0, 19, 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: Maksud untuk acara kalender ini hanya didukung dengan API level 14 dan yang lebih tinggi.

Catatan: Anda perlu mendefinisikan Intent sespesifik mungkin. Misalnya, jika Anda ingin menampilkan gambar menggunakan intent ACTION_VIEW, Anda harus menetapkan tipe MIME image/*. Hal ini mencegah aplikasi yang bisa “menampilkan” tipe data lain (seperti aplikasi peta) agar tidak terpicu oleh intent.

Memverifikasi Adanya Aplikasi yang akan Menerima Intent

Walaupun platform Android menjamin bahwa maksud tertentu akan dicocokkan ke salah satu aplikasi bawaan (misalnya aplikasi Phone, Email, atau Kalender), Anda harus selalu menyertakan langkah verifikasi sebelum memanggil maksud.

Perhatian: Jika Anda memanggil intent dan tidak ada aplikasi yang tersedia pada perangkat yang bisa menangani intent itu, aplikasi Anda akan crash.

Untuk memverifikasi adanya aktivitas yang bisa merespons intent, panggil queryIntentActivities() untuk mengambil daftar aktivitas yang mampu menangani Intent Anda. Jika List yang dikembalikan tidak kosong, Anda bisa menggunakan intent tersebut dengan aman. Sebagai contoh:

Kotlin

val activities: List<ResolveInfo> = packageManager.queryIntentActivities(
        intent,
        PackageManager.MATCH_DEFAULT_ONLY
)
val isIntentSafe: Boolean = activities.isNotEmpty()

Java

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

Jika isIntentSafe berupa true, maka setidaknya ada satu aplikasi yang merespons intent tersebut. Jika false, maka tidak ada aplikasi yang akan menangani intent tersebut.

Catatan: Anda harus melakukan pemeriksaan ini bila aktivitas dimulai lebih dahulu jika Anda perlu menonaktifkan fitur yang menggunakan intent sebelum pengguna berupaya menggunakannya. Jika Anda mengetahui aplikasi tertentu yang bisa menangani intent, Anda juga bisa memberikan tautan bagi pengguna untuk mengunduh aplikasi itu (lihat cara menautkan ke produk Anda di GooglePlay).

Memulai Activity dengan Intent

Gambar 1. Contoh dialog pemilihan yang muncul bila ada lebih dari satu aplikasi yang bisa menangani maksud.

Setelah Anda membuat Intent dan menyetel info ekstra, panggil startActivity() untuk mengirimnya ke sistem. Jika sistem mengidentifikasi lebih dari satu aktivitas yang bisa menangani intent, sebuah dialog (kadang disebut sebagai "dialog disambiguasi") akan ditampilkan kepada pengguna untuk memilih aplikasi yang akan digunakan, seperti yang ditampilkan dalam gambar 1. Bila hanya ada satu aktivitas yang menangani intent, sistem akan segera memulainya.

Kotlin

startActivity(intent)

Java

startActivity(intent);

Inilah contoh lengkap yang menampilkan cara membuat maksud agar menampilkan peta, memverifikasikan adanya aplikasi yang akan menangani maksud itu, kemudian 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)

// Verify it resolves
val activities: List<ResolveInfo> = packageManager.queryIntentActivities(mapIntent, 0)
val isIntentSafe: Boolean = activities.isNotEmpty()

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent)
}

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

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}

Menampilkan Pemilih Aplikasi

Gambar 2. Dialog pemilih.

Perhatikan, bila memulai aktivitas dengan meneruskan Intent Anda ke startActivity() dan ada lebih dari satu aplikasi yang merespons maksud, pengguna bisa memilih aplikasi yang akan digunakan secara default (dengan memilih kotak centang di bagian bawah dialog; lihat gambar 1). Ini bagus saat melakukan tindakan yang untuk itu biasanya pengguna ingin selalu menggunakan aplikasi yang sama, misalnya saat membuka halaman web (pengguna cenderung menggunakan satu browser web saja) atau mengambil foto (pengguna cenderung menyukai satu kamera).

Akan tetapi, jika aksi yang akan dilakukan bisa ditangani oleh banyak aplikasi dan pengguna mungkin lebih menyukai aplikasi berbeda untuk setiap kalinya—misalnya aksi "berbagi", bila pengguna mungkin memiliki beberapa aplikasi yang digunakan untuk berbagi suatu item—Anda harus menampilkan secara eksplisit sebuah dialog pemilih seperti yang ditampilkan dalam gambar 2. Dialog pemilih memaksa pengguna selalu memilih aplikasi yang akan digunakan untuk aksi (pengguna tidak bisa memilih aplikasi default untuk aksi itu).

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

Kotlin

val intent = Intent(Intent.ACTION_SEND)
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
val title = resources.getString(R.string.chooser_title)
// Create intent to show chooser
val chooser = Intent.createChooser(intent, title)

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(packageManager) != null) {
    startActivity(chooser)
}

Java

Intent intent = 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 chooser
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.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.