Bagian pelajaran ini mengajarkan Anda cara
Anda juga harus membaca
Dua pelajaran sebelumnya memfokuskan pada satu sisi cerita: memulai aktivitas aplikasi lain dari
aplikasi Anda. Namun jika aplikasi Anda bisa melakukan suatu aksi yang mungkin berguna bagi aplikasi lain,
aplikasi Anda harus disiapkan untuk merespons permintaan aksi dari aplikasi lain. Misalnya, jika Anda
membangun sebuah aplikasi sosial yang bisa berbagi pesan atau foto dengan teman pengguna,
Anda perlu mendukung maksud ACTION_SEND agar pengguna bisa memulai
aksi “berbagi” dari aplikasi lain dan membuka aplikasi Anda untuk melakukan aksi itu.
Untuk memungkinkan aplikasi lain memulai aktivitas, Anda perlu menambahkan elemen <intent-filter>
dalam file manifes untuk elemen <activity> yang sesuai.
Bila aplikasi Anda telah dipasang pada perangkat, sistem akan mengidentifikasi
filter maksud Anda dan menambahkan informasi ke katalog maksud internal yang didukung oleh semua aplikasi yang terinstal.
Bila aplikasi memanggil startActivity() atau startActivityForResult(),
dengan maksud implisit, sistem akan mencari aktivitas (atau aktivitas-aktivitas) yang bisa merespons
maksud itu.
Menambahkan Filter Maksud
Guna mendefinisikan dengan benar maksud yang bisa ditangani aktivitas Anda, setiap maksud yang Anda tambahkan harus sespesifik mungkin dalam hal tipe aksi dan data yang diterima aktivitas itu.
Sistem mungkin mengirim Intent tertentu ke aktivitas jika aktivitas itu memiliki
filter maksud yang memenuhi kriteria objek Intent berikut:
- Aksi
- String yang menyebutkan aksi yang akan dilakukan. Biasanya salah satu nilai yang didefinisikan platform seperti
ACTION_SENDatauACTION_VIEW.Tetapkan string ini dalam filter maksud Anda dengan elemen
<action>. Nilai yang Anda tetapkan dalam elemen ini harus berupa nama string lengkap untuk aksi, bukannya konstanta API (lihat contoh di bawah ini). - Data
- Keterangan data yang terkait dengan maksud.
Tetapkan keterangan dalam filter maksud Anda dengan elemen
<data>. Dengan menggunakan satu atau beberapa atribut dalam elemen ini, Anda bisa menetapkan tipe MIME saja, awalan URI saja, skema URI saja, atau kombinasinya dan lain-lain yang menunjukkan tipe data yang diterima.Catatan: Jika Anda tidak perlu mendeklarasikan hal-hal spesifik tentang data
Uri(misalnya, bila aktivitas Anda menangani jenis data “ekstra” lain, sebagai ganti URI), Anda harus menetapkan atributandroid:mimeTypesaja untuk mendeklarasikan tipe data yang ditangani aktivitas, misalnyatext/plainatauimage/jpeg. - Kategori
- Menyediakan cara tambahan untuk membentuk karakter aktivitas yang menangani maksud, biasanya terkait
dengan isyarat pengguna atau lokasi memulai aktivitas. Ada beberapa kategori
yang didukung oleh sistem, namun sebagian besar jarang digunakan. Akan tetapi, semua maksud implisit didefinisikan dengan
CATEGORY_DEFAULTsecara default.Tetapkan dalam filter maksud Anda dengan elemen
<category>.
Dalam filter maksud, Anda bisa mendeklarasikan kriteria yang diterima aktivitas
dengan mendeklarasikan setiap kriteria dengan elemen XML yang sesuai yang tersarang dalam elemen
<intent-filter>.
Misalnya, inilah aktivitas dengan filter maksud yang menangani maksud ACTION_SEND bila tipe data berupa teks atau gambar:
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
Setiap maksud yang masuk menetapkan satu aksi dan satu tipe data saja, namun boleh saja mendeklarasikan beberapa
instance elemen <action>, <category>, dan <data> di setiap
<intent-filter>.
Jika dua pasang aksi dan data tidak mungkin terjadi secara bersamaan dalam perilakunya, Anda harus membuat filter maksud terpisah untuk menetapkan tindakan yang bisa diterima bila dipasangkan dengan suatu tipe data.
Misalnya, anggaplah aktivitas Anda menangani teks maupun gambar untuk maksud ACTION_SEND dan maksud ACTION_SENDTO. Dalam hal ini, Anda harus mendefinisikan dua
filter maksud terpisah untuk kedua tindakan karena maksud ACTION_SENDTO harus menggunakan data Uri untuk menetapkan
alamat penerima menggunakan skema URI send atau sendto. Misalnya:
<activity android:name="ShareActivity">
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<action android:name="android.intent.action.SENDTO"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sms" />
<data android:scheme="smsto" />
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
Catatan: Guna menerima maksud implisit, Anda harus menyertakan
kategori CATEGORY_DEFAULT dalam filter maksud. MetodestartActivity() danstartActivityForResult() memperlakukan semua maksud
seolah-olah mendeklarasikan kategori CATEGORY_DEFAULT. Jika Anda tidak mendeklarasikannya
dalam filter maksud, maka tidak ada maksud implisit yang akan dicocokkan ke aktivitas Anda.
Untuk informasi selengkapnya tentang mengirim dan menerima maksud ACTION_SEND
yang melakukan perilaku berbagi sosial, lihat pelajaran tentang Menerima Data Sederhana dari Aplikasi Lain.
Menangani Maksud dalam Aktivitas Anda
Untuk memutuskan aksi yang harus diambil dalam aktivitas, Anda bisa membaca Intent yang digunakan untuk memulainya.
Saat aktivitas Anda dimulai, panggil getIntent() untuk mengambil
Intent yang memulai aktivitas. Anda bisa melakukannya kapan saja selama
daur hidup aktivitas, namun secara umum Anda harus melakukannya selama callback dini, misalnya
onCreate() atau onStart().
Misalnya:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();
// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}
Mengembalikan Hasil
Jika ingin mengembalikan hasil ke aktivitas yang memanggil aktivitas Anda, cukup panggil setResult() untuk menetapkan kode hasil dan Intent yang dikembalikan. Bila operasi Anda selesai dan pengguna harus kembali ke
aktivitas asal, panggil finish() untuk menutup (dan memusnahkan) aktivitas Anda. Misalnya
:
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));
setResult(Activity.RESULT_OK, result);
finish();
Anda harus selalu menetapkan kode hasil bersama hasilnya. Umumnya, baik RESULT_OK atau RESULT_CANCELED. Nanti Anda bisa
menyediakan data tambahan bersama Intent, sesuai yang diperlukan.
Catatan: Secara default, hasilnya disetel ke RESULT_CANCELED. Jadi, jika pengguna menekan tombol Kembali
sebelum menyelesaikan aksi dan sebelum Anda mengatur hasilnya, aktivitas asal akan menerima
hasil “dibatalkan”.
Jika Anda hanya perlu mengembalikan integer yang menunjukkan salah satu opsi hasil, Anda bisa menyetel
kode hasil ke nilai yang lebih tinggi daripada 0. Jika Anda menggunakan kode hasil untuk menyampaikan integer dan Anda
tidak perlu menyertakan Intent, Anda dapat memanggil setResult() dan meneruskan kode hasil saja. Misalnya:
setResult(RESULT_COLOR_RED); finish();
Dalam hal ini, mungkin hasilnya hanya sedikit, sehingga kode hasil berupa integer yang didefinisikan secara lokal (lebih besar dari 0). Ini akan berhasil bila Anda mengembalikan hasil ke suatu aktivitas dalam aplikasi Anda sendiri, karena aktivitas yang menerima hasil tersebut bisa merujuk konstanta publik untuk menentukan nilai kode hasil.
Catatan: Tidak perlu memeriksa apakah aktivitas Anda dimulai
dengan startActivity() atau startActivityForResult(). Cukup panggil setResult() jika maksud yang memulai aktivitas Anda
mungkin mengharapkan sebuah hasil. Jika aktivitas yang menjadi asalnya telah memanggil startActivityForResult(), maka sistem akan memberikan
hasil yang Anda sediakan ke setResult(); jika tidak,
hasil akan diabaikan.