Register now for Android Dev Summit 2019!

Memungkinkan Aplikasi Lain Memulai Activity Anda

Jika aplikasi Anda bisa melakukan suatu tindakan yang mungkin berguna dari aplikasi lain, aplikasi Anda harus disiapkan untuk merespons permintaan tindakan dengan menentukan filter intent yang sesuai di aktivitas Anda.

Misalnya, jika Anda membangun aplikasi sosial yang dapat membagikan pesan atau foto dengan teman-teman pengguna, Anda harus mendukung intent ACTION_SEND. Kemudian, ketika pengguna memulai tindakan "bagikan" dari aplikasi lain, aplikasi Anda muncul sebagai opsi dalam dialog pemilihnya (juga dikenal sebagai "dialog disambiguasi"), seperti yang ditampilkan pada gambar 1.

Gambar 1. Dialog pemilih

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

Bila aplikasi Anda telah dipasang pada perangkat, sistem mengidentifikasi filter intent dan menambahkan informasi ke katalog internal intent yang didukung oleh semua aplikasi yang terinstal. Ketika suatu aplikasi memanggil startActivity() atau startActivityForResult(), dengan intent tersirat, sistem menemukan aktivitas (atau aktivitas) mana yang dapat merespons intent tersebut.

Menambahkan Filter Intent

Guna mendefinisikan dengan benar intent yang bisa ditangani aktivitas Anda, setiap intent yang Anda tambahkan harus sespesifik mungkin dalam hal tipe tindakan dan data yang diterima aktivitas itu.

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

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

Tetapkan keterangan dalam filter intent 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 intent.

Tetapkan keterangan dalam filter intent 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 atribut android:mimeType saja untuk mendeklarasikan tipe data yang ditangani aktivitas, misalnya text/plain atau image/jpeg.

Kategori
Menyediakan cara tambahan untuk membentuk karakter aktivitas yang menangani intent, biasanya terkait dengan isyarat pengguna atau lokasi memulai aktivitas. Ada beberapa kategori yang didukung oleh sistem, namun sebagian besar jarang digunakan. Akan tetapi, semua intent implisit didefinisikan dengan CATEGORY_DEFAULT secara default.

Tetapkan keterangan dalam filter intent Anda dengan elemen <category>.

Dalam filter intent, 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 intent yang menangani intent 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>

Tips: Jika Anda ingin ikon dalam dialog pemilih menjadi berbeda dari ikon default aktivitas Anda, tambahkan android:icon dalam elemen <intent-filter>.

Setiap intent 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 intent terpisah untuk menetapkan tindakan yang bisa diterima bila dipasangkan dengan suatu tipe data.

Misalnya, anggaplah aktivitas Anda menangani teks maupun gambar untuk intent ACTION_SEND dan intent ACTION_SENDTO. Dalam hal ini, Anda harus mendefinisikan dua filter intent terpisah untuk kedua tindakan karena intent ACTION_SENDTO harus menggunakan data Uri untuk menetapkan alamat penerima menggunakan skema URI send atau sendto. Sebagai contoh:

<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 mendeklarasikannya dalam filter intent, maka tidak ada intent implisit yang akan dicocokkan ke aktivitas Anda.

Untuk informasi selengkapnya tentang mengirim dan menerima intent ACTION_SEND yang melakukan perilaku berbagi sosial, lihat pelajaran tentang Menerima Data Sederhana dari Aplikasi Lain. Anda juga dapat menemukan informasi yang berguna tentang berbagi data dalam Membagikan Data Sederhana dan Membagikan File.

Menangani Intent dalam Activity Anda

Untuk memutuskan tindakan 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 lifecycle aktivitas, namun secara umum Anda harus melakukannya selama callback dini, misalnya onCreate() atau onStart().

Sebagai contoh:

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

Mengembalikan Hasil

Jika Anda ingin mengembalikan hasil ke aktivitas yang memanggil Anda, cukup hubungi setResult() untuk menentukan kode hasil dan hasil Intent. Bila operasi Anda selesai dan pengguna harus kembali ke aktivitas asal, panggil finish() untuk menutup (dan memusnahkan) aktivitas Anda. Sebagai contoh:

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 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 tindakan 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. Sebagai contoh:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

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.