Memanggil App yang lain

Salah satu fitur Android yang paling penting adalah kemampuan suatu app untuk memanggil app yang lain berdasarkan suatu aksi/tindakan yang ingin dilakukan. Contohnnya, jika app kita punya alamat bisnis dan akan menampilkannya dengan suatu peta, kita tidak harus membuat suatu 'activity' di app kita yang menampilkan suatu peta. Sebagai gantinya, kita bisa membuat suatu 'request' untuk melihat alamat tersebut dengan menggunakan suatu 'Intent'. Sistem Android kemudian memulai suatu app yang bisa menampilkan alamat di dalam suatu peta.

Seperti dijelaskan dalam latihan awal tentang "Membuat App Android Pertama Kali", kita harus menggunakan 'intent' untuk berpindah-pindah antar 'activity' di dalam app kita. Kita pada umumnya melakukan hal tersebut dengan menggunakan 'intent' explisit, yang mendefinisikan nama class yang tepat dari komponen yang ingin kita jalankan. Namun demikian, ketika kita menginginkan app lain melakukan suatu tindakan, misalnya melihat suatu peta, kita harus menggunakan 'intent' implisit.

Latihan ini akan menunjukkan bagaimana kita membuat suatu 'intent' implisit untuk aksi/tindakan tertentu, dan bagaimana memanfaatkannya untuk megakses/memulai suatu 'activity' yang menjalankan aksi/tindakan tersebut di app yang lain.


Membuat 'Intent' Implisit

'Intent' implisit tidak menyatakan nama class dari komponen untuk dijalankan, tetapi sebagai gantinya menyatakan suatu aksi/tindakan untuk dilakukan. Aksi/tindakan tersebut menentukan sesuatu yang ingin kita lakukan, misalnya 'melihat', 'mengedit', 'mengirim', atau 'mendapat' sesuatu. 'Intent' seringkali juga memasukkan data yang terkait dengan tindakannya, misalnya alamat yang ingin kita lihat, atau pesan email yang ingin kita kirim. Tergantung pada 'intent' yang ingin kita buat, datanya mungkin berupa 'Uri', atau salah satu dari beberapa jenis data lainnya, atau mungkin juga 'intent' tersebut tidak membutuhkan data sama sekali.

Jika data kita adalah suatu 'Uri', ada satu konstruktor 'Intent()' yang sederhana yang bisa kita gunakan untuk mendefinisikan data dan tindakannya.

Contohnya, berikut di bawah ini adalah bagaimana kita membuat 'intent' untuk mengawali panggilan telpon dengan data 'Uri' untuk menentukan nomor telpon:

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
Ketika app kita mengaktifkan 'intent' ini dengan memanggil 'startActivity()', app Phone akan memulai suatu panggilan ke nomor telpon yang diberikan.

Berikut di bawah ini adalah dua 'intent' yang lain beserta pasangan antara data 'Uri' dan tindakannya:

- Melihat peta
// 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 laman web
Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

Jenis 'intent' implisit lainnya memerlukan data 'extra' (data tambahan) yang memberikan jenis data yang berbeda, misalnya 'string'. Kita bisa menambahkan satu atau lebih data extra dengan menggunakan berbagai macam method 'putExtra()'.

Secara default, sistem akan menentukan jenis MIME yang tepat yang diperlukan oleh suatu 'intent' berdasarkan data 'Uri' yang dimasukkan. Jika kita tidak memasukkan 'Uri' di dalam 'intent', kita seharusnya menggunakan 'setType()' untuk menentukan jenis data yang terkait dengan 'intent'. Dengan men-set jenis MIME akan menentukan jenis 'activity' apa yang akan menerima 'intent' tersebut.

Berikut di bawah ini adalah beberapa contoh 'intent' yang menambahkan data extra (data tambahan) untuk menentukan aksi/tindakan yang diinginkan:

- Mengirim email dengan attachment:
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 event kalendar:
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

Catatan:
'Intent' ini untuk event kalendar di-support hanya dengan API level 14 dan yang lebih tinggi.
Catatan:
Sangatlah penting bahwa kita membuat 'Intent' kita menjadi se-spesifik mungkin. Contohnya, bila kita ingin menampilkan suatu image dengan menggunakan intent 'ACTION_VIEW', kita seharusnya menentukan jenis MIME image/*. Hal ini akan mencegah app yang bisa 'melihat' jenis data lainnya (misalnya app peta) supaya tidak dipanggil oleh intent tersebut.

Memastikan bahwa ada App yang akan menerima 'Intent'

Meskipun platform Android akan menjamin bahwa 'intent-intent' tertentu akan menangani salah satu dari app-app yang sudah built-in (misalnya app seperti Phone, Email, atau Calendar), kita seharusnya selalu membuat langkah verifikasi sebelum mengaktifkan 'intent'.
Perhatian:
Bila kita mengaktifkan 'intent' dan tidak ada app yang akan menangani 'intent' tersebut, maka app kita akan 'crash'.
Untuk memastikan ada 'activity' yang akan merespon 'intent', kita bisa memanggil 'queryIntentActivities()' untuk mendapatkan list dari 'activities' yang bisa menangani 'Intent' kita. Bila 'List' yang dikembalikan method tersebut tidak kosong, kita bisa menggunakan 'intent' tersebut dengan aman. Contohnya:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
Bila 'isIntentSafe' adalah 'true', maka setidaknya ada satu app yang akan merespon 'intent' tersebut. Bila 'false' maka tidak ada app yang akan menangani 'intent' tersebut.
Catatan:
Kita seharusnya melakukan check seperti ini ketika 'activity' kita pertama kali mulai barangkali kita perlu menonaktifkan fitur yang akan menggunakan 'intent' tersebut sebelum user mencoba menggunakannya. Bila kita mengetahui app tertentu yang bisa menangani 'intent' tersebut, kita juga bisa menyediakan link untuk user supaya mendownload app tersebut. (lihat bagaimana membuat 'link ke produk kita di Google Play').

Memulai/Memanggil suatu 'Activity' dengan 'Intent'

Gambar 1. Tampilan dialog
ketika ada lebih dari 1 app yang
bisa menangani intent
Setelah kita membuat 'Intent' kita dan menetapkan info extra (info tambahan), kemudian kita memanggil 'startActivity()' untuk mengirimnya ke sistem. Bila sistem mengidentifikasi lebih dari satu 'activity' yang bisa menangani 'intent' tersebut, maka sistem akan menampilkan dialog pada user untuk memilih app mana yang akan digunakan, seperti ditunjukkan pada gambar 1. Bila hanya ada satu 'activity' yang menangani 'intent' tersebut, sistem akan segera memulainya.

startActivity(intent);

Berikut di bawah ini adalah contoh yang lengkap tentang bagaimana membuat 'intent' untuk melihat peta, memastikan bahwa app-nya ada untuk menanganani 'intent' tersebut, kemudian memulainya:

// 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 Dialog Pemilih App

Chooser dialog
Perhatikan bahwa ketika kita memulai suatu 'activity' dengan melewatkan 'Intent' kita ke 'startActivity()' dan ada lebih dari satu app yang akan merespon ke 'intent' tersebut, maka user bisa memilih app mana yang akan digunakan secara default (dengan memilih 'checkbox' di bagian bawah dialog; lihat gambar 1). Ini akan baik dan menyenangkan bila user secara umum ingin untuk menggunakan app yang sama setiap saat, misalnya ketika membuka laman web (user cenderung menggunakan satu browser web) atau memotret (user cenderung memilih satu kamera).

Namun, bila aksi/tindakan yang dilakukan bisa ditangani oleh beberapa app dan user mungkin memilih app yang selalu berbeda setiap saat -- misalnya tindakan/tombol 'share', dimana user mungkin memiliki beberapa app yang berbeda untuk men-share sesuatu--kita seharusnya menunjukkan secara eksplisit suatu 'chooser dialog' seperti ditunjukkan dalam gambar 2. 'Chooser dialog' memaksa user memilih app mana yang akan digunakan untuk tindakan tersebut (user tidak bisa memilih app default untuk tindakan tersebut).

Untuk menampilkan 'chooser dialog', kita membuat 'Intent' dengan menggunakan 'createChooser()' dan melewatkannya ke 'startActivity()'. Contohnya:

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 akan menampilkan dialog dengan daftar app yang merespon intent yang dilewatkan ke method 'createChooser()' dan menggunakan teks yang diberikan sebagai judul dialog.

license: cc by

No comments: