Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Mengizinkan Aplikasi Lain Memulai Aktivitas Anda

Jika aplikasi Anda dapat melakukan tindakan yang mungkin berguna dari aplikasi lain, aplikasi harus siap merespons permintaan tindakan dengan menetapkan 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, sistemnya akan mengidentifikasi filter intent Anda dan menambahkan informasinya ke katalog internal intent yang didukung oleh semua aplikasi terinstal. Saat suatu aplikasi memanggil startActivity() atau startActivityForResult(), dengan intent implisit, sistem akan menemukan satu aktivitas (atau beberapa aktivitas) yang dapat merespons intent tersebut.

Menambahkan Filter Intent

Untuk menentukan dengan benar intent yang dapat ditangani oleh aktivitas Anda, setiap filter intent yang ditambahkan harus sangat spesifik terkait jenis tindakan dan data yang diterima oleh 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 lengkap string untuk tindakan tersebut, bukan konstanta API (lihat contoh di bawah 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), sebaiknya hanya tentukan 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>
    

Tips: Jika tidak ingin membedakan ikon dalam dialog pemilih dengan ikon default aktivitas, tambahkan android:icon dalam 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, Anda harus membuat filter intent terpisah untuk menentukan tindakan mana yang dapat diterima ketika disambungkan dengan suatu tipe 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. 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 mendeklarasikan dalam filter intent, 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 tutorial tentang 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 memutuskan tindakan yang harus diambil dalam aktivitas, Anda dapat membaca 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().

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

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. 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 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 Anda hanya perlu menampilkan integer yang menunjukkan salah satu dari beberapa opsi hasil, Anda dapat menetapkan kode hasil ke nilai yang lebih besar dari 0. Jika Anda menggunakan kode hasil untuk menampilkan integer dan Anda tidak perlu menyertakan Intent, Anda dapat memanggil setResult() dan meneruskan kode hasil saja. Contoh:

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.