Bagian pelajaran ini mengajarkan Anda cara
Anda juga harus membaca
Memulai aktivitas lain tidak harus satu arah. Anda juga bisa memulai aktivitas lain dan
menerima hasilnya. Untuk menerima hasilnya, panggil startActivityForResult() (sebagai ganti startActivity()).
Misalnya, aplikasi Anda bisa memulai aplikasi kamera dan menerima foto yang diambil sebagai hasilnya. Atau, Anda bisa memulai Aplikasi Orang supaya pengguna bisa memilih seorang kontak dan Anda akan menerima detail kontak itu sebagai hasilnya.
Tentu saja, aktivitas yang merespons harus didesain untuk mengembalikan hasilnya. Bila mengembalikan hasil, aktivitas
akan mengirimnya sebagai objek Intent lain. Aktivitas Anda akan menerimanya dalam
callback onActivityResult().
Catatan: Anda bisa menggunakan maksud eksplisit maupun implisit saat memanggil
startActivityForResult(). Saat memulai salah satu
aktivitas Anda sendiri untuk menerima hasil, Anda harus menggunakan maksud eksplisit guna memastikan Anda
menerima hasil yang diharapkan.
Memulai Aktivitas
Tidak ada yang khusus pada objek Intent yang Anda gunakan saat memulai
aktivitas untuk mendapatkan suatu hasil, namun Anda perlu meneruskan argumen integer tambahan ke metode startActivityForResult().
Argumen integer adalah “kode permintaan” yang mengidentifikasi permintaan Anda. Saat Anda menerima
hasil Intent, callback akan memberikan kode permintaan yang sama sehingga
aplikasi Anda bisa mengidentifikasi hasilnya dengan benar dan menentukan cara menanganinya.
Misalnya, inilah cara memulai aktivitas yang memungkinkan pengguna mengambil sebuah kontak:
static final int PICK_CONTACT_REQUEST = 1; // The request code
...
private void pickContact() {
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
Menerima Hasilnya
Bila pengguna selesai dengan aktivitas selanjutnya dan kembali, sistem akan memanggil
metode onActivityResult() aktivitas Anda. Metode ini menyertakan tiga
argumen:
- Kode permintaan yang Anda teruskan ke
startActivityForResult(). - Kode hasil yang ditetapkan oleh aktivitas kedua. Hasilnya bisa berupa
RESULT_OKjika operasinya berhasil atauRESULT_CANCELEDjika pengguna menarik diri atau operasinya gagal karena suatu alasan. - Suatu
Intentyang membawa data hasil.
Misalnya, inilah cara Anda bisa menangani hasil untuk maksud “pilih kontak”:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a contact.
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
Dalam contoh ini, hasil Intent yang dikembalikan oleh
Aplikasi Orang atau Kontak Android memberikan Uri materi yang mengidentifikasi
kontak pilihan pengguna.
Agar berhasil menangani hasilnya, Anda harus memahami format hasil
Intent nanti. Mudah melakukannya bila aktivitas yang mengembalikan hasil adalah
salah satu aktivitas Anda sendiri. Aplikasi yang disertakan bersama platform Android menawarkan API sendiri yang
bisa Anda andalkan untuk data hasil tertentu. Misalnya, Aplikasi Orang selalu mengembalikan hasil
bersama URI materi yang mengidentifikasi kontak yang dipilih, dan
aplikasi Kamera mengembalikan Bitmap dalam ekstra "data" (lihat kelas
tentang Menjepret Foto).
Bonus: Membaca data kontak
Kode di atas yang menampilkan cara mendapatkan hasil dari Aplikasi Orang tidak memberikan detail tentang bagaimana sebenarnya membaca data dari hasil, karena hal itu memerlukan pembahasan lebih jauh tentang penyedia materi. Akan tetapi, jika Anda ingin tahu, inilah beberapa kode lainnya yang menampilkan cara kueri data hasil untuk mendapatkan nomor ponsel dari kontak yang dipilih:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request it is that we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// Get the URI that points to the selected contact
Uri contactUri = data.getData();
// We only need the NUMBER column, because there will be only one row in the result
String[] projection = {Phone.NUMBER};
// Perform the query on the contact to get the NUMBER column
// We don't need a selection or sort order (there's only one result for the given URI)
// CAUTION: The query() method should be called from a separate thread to avoid blocking
// your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
// Consider using CursorLoader to perform the query.
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst();
// Retrieve the phone number from the NUMBER column
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column);
// Do something with the phone number...
}
}
}
Catatan: Sebelum Android 2.3 (API level 9), melakukan kueri
pada Contacts Provider (seperti yang ditampilkan
di atas) mengharuskan aplikasi mendeklarasikan izin READ_CONTACTS (lihat Keamanan dan Izin). Akan tetapi,
mulai dengan Android 2.3, Aplikasi Orang/Kontak memberi
izin sementara pada aplikasi Anda untuk membaca dari Penyedia Kontak bila aplikasi mengembalikan hasil kepada Anda. Izin sementara ini
berlaku hanya untuk kontak tertentu yang diminta, sehingga Anda tidak bisa melakukan kueri kontak selain
yang ditetapkan oleh Uri maksud, kecuali jika Anda mendeklarasikan izin READ_CONTACTS.