Mengizinkan aplikasi lain memulai aktivitas Anda

Jika aplikasi Anda dapat melakukan tindakan yang mungkin berguna untuk aplikasi lain, siapkan aplikasi untuk merespons permintaan tindakan dengan menentukan filter intent yang sesuai dalam aktivitas Anda.

Misalnya, jika Anda membuat aplikasi sosial yang dapat berbagi pesan atau foto dengan teman-teman pengguna, Anda harus mendukung intent ACTION_SEND. Kemudian, ketika pengguna memulai tindakan "bagikan" dari aplikasi lain, aplikasi Anda akan muncul sebagai pilihan dalam dialog pilihan (juga disebut dialog disambiguasi), seperti dalam gambar 1.

Gambar 1. Dialog pilihan.

Untuk memungkinkan aplikasi lain memulai aktivitas Anda dengan cara ini, Anda perlu menambahkan elemen <intent-filter> dalam file manifes untuk elemen <activity> yang sesuai.

Saat aplikasi Anda diinstal di sebuah perangkat, sistem akan mengidentifikasi filter intent Anda dan menambahkan informasi ke katalog internal intent yang didukung oleh semua aplikasi terinstal. Saat aplikasi memanggil startActivity() atau startActivityForResult() dengan intent implisit, sistem akan memeriksa aktivitas yang dapat merespons intent tersebut.

Menambahkan filter intent

Untuk menentukan dengan benar intent yang dapat ditangani aktivitas Anda, buat setiap filter intent yang Anda tambahkan sespesifik mungkin dalam hal jenis tindakan dan data yang diterima aktivitas tersebut.

Sistem dapat mengirim Intent tertentu ke aktivitas jika aktivitas tersebut memiliki filter intent yang memenuhi kriteria objek Intent berikut:

Tindakan
String yang menyebutkan tindakan yang akan dilakukan. Biasanya berupa salah satu nilai yang ditentukan platform, seperti ACTION_SEND atau ACTION_VIEW.

Tetapkan string ini dalam filter intent Anda dengan elemen <action>. Nilai yang ditentukan dalam elemen ini harus berupa nama string lengkap untuk tindakan, bukan konstanta API, seperti yang ditunjukkan dalam contoh di halaman ini.

Data
Deskripsi data yang terkait dengan intent.

Tetapkan string ini dalam filter intent Anda dengan elemen <data>. Dengan menggunakan satu atau beberapa atribut dalam elemen ini, Anda dapat menentukan jenis MIME saja, awalan URI saja, skema URI saja, atau kombinasi beberapa atribut tersebut dan hal-hal lain yang menunjukkan jenis data yang diterima.

Catatan: Jika Anda tidak perlu mendeklarasikan detail data Uri, seperti saat aktivitas Anda menangani data "ekstra" jenis lain, bukan URI, tentukan hanya atribut android:mimeType yang mendeklarasikan jenis data yang ditangani aktivitas, seperti text/plain atau image/jpeg.

Kategori
Memberikan cara tambahan untuk menggambarkan karakter aktivitas yang menangani intent, biasanya terkait dengan lokasi atau gestur pengguna saat aktivitas dimulai. Ada beberapa kategori yang didukung oleh sistem, tetapi sebagian besarnya jarang digunakan. Namun, semua intent implisit ditentukan secara default dengan CATEGORY_DEFAULT.

Tetapkan string ini dalam filter intent Anda dengan elemen <category>.

Dalam filter intent, Anda dapat mendeklarasikan kriteria yang diterima aktivitas dengan mendeklarasikan setiap kriteria tersebut dengan elemen XML yang sesuai yang tersarang dalam elemen <intent-filter>.

Sebagai contoh, berikut adalah aktivitas dengan filter intent yang menangani intent ACTION_SEND ketika jenis datanya 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>

Tip: Jika ingin membedakan ikon dalam dialog pemilih dengan ikon default aktivitas, tambahkan android:icon di elemen <intent-filter>.

Setiap intent yang masuk akan menentukan satu tindakan dan satu jenis data saja, tetapi boleh mendeklarasikan beberapa instance elemen <action>, <category>, dan <data>, di setiap <intent-filter>.

Jika ada dua pasang tindakan dan data yang perilakunya sama-sama khusus, buat filter intent terpisah untuk menentukan tindakan mana yang dapat diterima ketika disambungkan dengan suatu jenis data.

Misalnya, aktivitas Anda menangani teks dan gambar untuk intent ACTION_SEND dan ACTION_SENDTO. Dalam situasi ini, Anda harus menentukan dua filter intent yang terpisah untuk kedua tindakan tersebut karena intent ACTION_SENDTO harus menggunakan Uri data untuk menentukan alamat penerima menggunakan skema URI send atau sendto. Hal ini ditunjukkan dalam contoh berikut:

<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: Untuk menerima intent implisit, Anda harus menyertakan kategori CATEGORY_DEFAULT dalam filter intent. Metode startActivity() dan startActivityForResult() memperlakukan semua intent seolah-olah mendeklarasikan kategori CATEGORY_DEFAULT. Jika Anda tidak mendeklarasikan dalam filter intent, tidak ada intent implisit yang ditetapkan ke aktivitas Anda.

Untuk mengetahui informasi selengkapnya tentang mengirim dan menerima intent ACTION_SEND yang melakukan perilaku berbagi sosial, lihat Menerima data sederhana dari aplikasi lain. Anda juga dapat menemukan informasi yang berguna tentang berbagi data dalam Berbagi Data Sederhana dan Berbagi File.

Menangani intent dalam aktivitas Anda

Untuk menentukan tindakan yang harus diambil dalam aktivitas Anda, baca Intent yang digunakan untuk memulai aktivitas.

Saat aktivitas Anda dimulai, panggil getIntent() untuk mengambil Intent yang memulai aktivitas tersebut. Anda dapat melakukannya kapan saja selama siklus proses aktivitas, tetapi secara umum Anda harus melakukannya selama callback awal seperti onCreate() atau onStart().

Hal ini ditunjukkan dalam contoh berikut:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.main)

    val data: Uri? = intent?.data

    // Figure out what to do based on the intent type
    if (intent?.type?.startsWith("image/") == true) {
        // Handle intents with image data
    } else if (intent?.type == "text/plain") {
        // Handle intents with text
    }
}

Java

@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
    }
}

Menampilkan hasil

Jika Anda ingin menampilkan hasil ke aktivitas yang memanggil milik Anda, cukup panggil setResult() untuk menetapkan kode hasil dan Intent hasil. Setelah operasi selesai dan pengguna harus kembali ke aktivitas asal, panggil finish() untuk menutup dan meniadakan aktivitas Anda. Hal ini ditunjukkan dalam contoh berikut:

Kotlin

// Create intent to deliver some kind of result data
Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result ->
    setResult(Activity.RESULT_OK, result)
}
finish()

Java

// 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 menentukan kode hasil beserta hasilnya. Secara umum, kode tersebut adalah RESULT_OK atau RESULT_CANCELED. Anda kemudian dapat memberikan data tambahan dengan Intent, jika diperlukan.

Catatan: Hasil akan ditetapkan ke RESULT_CANCELED secara default. Jadi, jika pengguna menekan tombol Kembali sebelum menyelesaikan tindakan dan sebelum Anda menetapkan hasilnya, aktivitas asal akan menerima hasil yang “dibatalkan”.

Jika hanya perlu menampilkan integer yang menunjukkan salah satu opsi hasil, Anda dapat menyetel kode hasil ke nilai yang lebih tinggi dari 0. Jika Anda menggunakan kode hasil untuk menyampaikan bilangan bulat dan tidak perlu menyertakan Intent, Anda dapat memanggil setResult() dan hanya meneruskan kode hasil:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

setResult(RESULT_COLOR_RED);
finish();

Dalam situasi ini, mungkin hanya ada sedikit hasil yang akan diberikan sehingga kode hasilnya adalah integer yang ditentukan secara lokal (lebih besar dari 0). Hal ini akan berhasil jika Anda menampilkan hasil ke aktivitas dalam aplikasi Anda sendiri, karena aktivitas yang menerima hasil tersebut dapat mereferensikan konstanta publik untuk menentukan nilai kode hasil.

Catatan: Anda tidak perlu memeriksa apakah aktivitas Anda dimulai dengan startActivity() atau startActivityForResult(). Cukup panggil setResult() jika intent yang memulai aktivitas Anda mungkin mengharapkan sebuah hasil. Jika aktivitas yang menjadi asalnya telah memanggil startActivityForResult(), sistem akan memberikan hasil yang Anda berikan ke setResult(); jika tidak, hasil akan diabaikan.