You are on page 1of 16

BAB VII

IMPLICIT INTENT

Materi Pembelajaran:
1. Membuat intent implisit dan menggunakan tindakan dan kategorinya.
2. Menggunakan kelas pembantu ShareCompat.IntentBuilder untuk membuat intent implisit
agar dapat membagikan data dengan mudah.
3. aplikasi Anda dapat menerima intent implisit dengan mendeklarasikan filter intent dalam
manifes Android.
Tujuan Pembelajaran:
1. Mahasiswa dapat membuat aplikasi baru untuk mengirimkan intent implisit.
2. Mahasiswa dapat mengimplementasikan dua intent implisit yang membuka halaman web dan
membuka lokasi pada peta.
3. Mahasiswa dapat mengimplementasikan tindakan untuk membagikan cuplikan teks.
4. Mahasiswa dapat membuat aplikasi baru yang dapat menerima intent implisit untuk
membuka laman web.

Yang harus sudah Anda KETAHUI


Dari praktik sebelumnya, Anda harus sudah bisa:
 Membuat dan menggunakan aktivitas.
 Membuat dan mengirim intent di antara aktivitas.
Yang akan Anda LAKUKAN
Dalam praktik ini Anda akan:
 Membuat aplikasi baru untuk mengirimkan intent implisit.
 Mengimplementasikan dua intent implisit yang membuka halaman web dan membuka
lokasi pada peta.
 Mengimplementasikan tindakan untuk membagikan cuplikan teks.
 Membuat aplikasi baru yang dapat menerima intent implisit untuk membuka laman web.
Ringkasan Aplikasi
Dalam bagian ini Anda akan membuat aplikasi baru dengan satu aktivitas dan tiga opsi untuk
tindakan ini: membuka situs web, membuka lokasi pada peta, dan membagikan cuplikan teks.
Semua bidang teks dapat diedit (EditText), tetapi berisi nilai default.
Tugas 1. Membuat proyek dan layout baru
Untuk latihan ini, Anda akan membuat proyek baru dan aplikasi bernama Implicit Intents
dengan layout baru.
1.1 Membuat proyek
1. Mulai Android Studio dan buat proyek Android Studio baru. Panggil "Implicit Intents"
aplikasi.
2. Pilih Empty Activity untuk template proyek. Klik Next.
3. Terima nama aktivitas default (MainActivity). Pastikan kotak Generate Layout
file dicentang. Klik Finish.

1.2 Membuat Layout


Dalam tugas ini, buat layout untuk aplikasi. Gunakan LinearLayout, tiga Tombol, dan tiga
EditText, seperti ini:
1. Edit res/values/strings.xml untuk menyertakan sumber daya string ini:
<string name="edittext_uri">http://developer.android.com</string>
<string name="button_uri">Open Website</string>

<string name="edittext_loc">Golden Gate Bridge</string>


<string name="button_loc">Open Location</string>

<string name="edittext_share">\'Twas brillig and the slithy toves</string>


<string name="button_share">Share This Text</string>

2. Ubah RelativeLayout default ke LinearLayout. Tambahkan atribut android:orientation


dan berikan nilai "vertical."

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android.implicitintents.MainActivity"
android:orientation="vertical">

3. Hapus TextView "Hello World".


4. Tambahkan EditText dan Tombol ke layout untuk fungsi Buka Situs web. Gunakan nilai
atribut ini:

Atribut (EditText) Nilai (EditText)

android:id "@+id/website_edittext"

android:layout_width "match_parent"

android:layout_height "wrap_content"

android:text "@string/edittext_uri"
Atribut (Tombol) Nilai (Tombol)

android:id "@+id/open_website_button"

android:layout_width "wrap_content"

android:layout_height "wrap_content"

android:layout_marginBottom "24dp"

android:text "@string/button_uri"

android:onClick "openWebsite"
5. Tambahkan EditText kedua dan Tombol ke layout untuk fungsi Open Website.
6. Gunakan atribut yang sama dengan atribut pada langkah sebelumnya. Namun, modifikasi
atribut seperti yang di bawah ini:

Atribut (EditText) Nilai (EditText)

android:id "@+id/location_edittext"

android:text "@string/edittext_loc"

Atribut (Tombol) Nilai (Tombol)

android:id "@+id/open_location_button"

android:text "@string/button_loc"

android:onClick "openLocation"

7. Tambahkan EditText ketiga dan Tombol untuk fungsi Share This. Buatlah perubahan ini:

Atribut (EditText) Nilai (EditText)

android:id "@+id/share_edittext"

android:text "@string/edittext_share"

Atribut (Tombol) Nilai (Tombol)

android:id "@+id/share_text_button"

android:text "@string/button_share"

android:onClick "shareText"
Kode Solusi:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android.implicitintents.MainActivity"
android:orientation="vertical">

<EditText
android:id="@+id/website_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/edittext_uri" />

<Button
android:id="@+id/open_website_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:onClick="openWebsite"
android:text="@string/button_uri" />

<EditText
android:id="@+id/location_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/edittext_loc" />

<Button
android:id="@+id/open_location_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:onClick="openLocation"
android:text="@string/button_loc" />

<EditText
android:id="@+id/share_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/edittext_share" />

<Button
android:id="@+id/share_text_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:onClick="shareText"
android:text="@string/button_share" />
</LinearLayout>
Tugas 2. Mengimplementasikan "buka situs web"

Dalam tugas ini Anda akan mengimplementasikan metode handler on-click untuk tombol
pertama dalam layout ("Open Website.") Tindakan ini menggunakan intent implisit untuk
mengirimkan URI yang diberikan ke aktivitas yang dapat menangani intent implisit tersebut
(seperti browser web).

2.1 Mendefinisikan metode openWebsite


1. Buka MainActivity.java.
2. Tambahkan variabel privat di bagian atas kelas untuk menampung objek EditText untuk
URI situs web.
private EditText mWebsiteEditText;

3. Dalam metode onCreate(), gunakan findViewByID() untuk mendapatkan referensi tentang


instance EditText dan menetapkannya ke variabel privat tersebut:
mWebsiteEditText = (EditText) findViewById(R.id.website_edittext);

4. Buat metode baru bernama openWebsite(), dengan tanda tangan ini:


public void openWebsite(View view) { }

5. Dapatkan nilai string EditText:


String url = mWebsiteEditText.getText().toString();

6. Enkode dan parse string ke dalam objek Uri:


Uri webpage = Uri.parse(url);

7. Buat intent baru dengan Intent.ACTION_VIEW sebagai tindakan dan URI sebagai data:
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);

Konstruktor intent ini berbeda dari yang Anda gunakan untuk membuat intent eksplisit. Dalam
konstruktor sebelumnya, Anda menetapkan konteks saat ini dan komponen spesifik (kelas
aktivitas) untuk mengirim intent. Dalam konstruktor ini Anda menetapkan tindakan dan data
untuk tindakan tersebut. Tindakan didefinisikan oleh kelas intent dan dapat menyertakan
ACTION_VIEW (untuk melihat data yang diberikan), ACTION_EDIT (untuk mengedit data
yang diberikan), atau ACTION_DIAL (untuk menghubungi nomor telepon). Dalam hal ini,
tindakan adalah ACTION_VIEW karena kita ingin membuka dan melihat laman web yang
ditetapkan oleh URI dalam variabel laman web.
8. Gunakan resolveActivity() dan pengelola paket Android untuk menemukan aktivitas yang
dapat menangani intent implisit. Periksa untuk memastikan permintaan berhasil diatasi.
if (intent.resolveActivity(getPackageManager()) != null) {
}

Permintaan yang cocok dengan tindakan intent dan data dengan intent Anda ini memfilter
aplikasi yang dipasang pada perangkat untuk memastikan paling tidak ada satu aktivitas
yang bisa menangani permintaan Anda.

9. Dalam pernyataan if, panggil startActivity() untuk mengirimkan intent.


startActivity(intent);

10. Tambahkan blok else untuk mencetak pesan log jika intent tidak bisa diatasi.
} else {
Log.d("ImplicitIntents", "Can't handle this!");
}

Kode Solusi (bukan seluruh kelas):


public void openWebsite(View view) {
// Get the URL text.
String url = mWebsiteEditText.getText().toString();

// Parse the URI and create the intent.


Uri webpage = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);

// Find an activity to hand the intent and start that activity.


if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Log.d("ImplicitIntents", "Can't handle this intent!");
}
}
Tugas 3. Mengimplementasikan "buka lokasi"
Dalam tugas ini, Anda akan mengimplementasikan metode handler on-click untuk tombol kedua
dalam UI("Open Location.") Metode ini hampir identik dengan metode openWebsite().
Perbedaannya adalah penggunaan URI geo untuk menunjukkan lokasi peta. Anda bisa
menggunakan URI geo dengan lintang dan bujur, atau gunakan string kueri untuk lokasi umum.
Dalam contoh ini kami telah menggunakannya untuk tujuan yang kedua.

3.1 Definisikan metode openLocation


1. Buka MainActivity.java (java/com.example.android.implicitintents/MainActivity).

2. Tambahkan variabel privat di bagian atas kelas untuk menampung objek EditText bagi URI
lokasi.
private EditText mLocationEditText;

3. Dalam metode onCreate(), gunakan findViewByID() untuk mendapatkan referensi tentang


contoh EditText dan menetapkannya ke variabel privat tersebut:
mLocationEditText = (EditText) findViewById(R.id.location_edittext);

4. Membuat metode baru bernama openLocation untuk digunakan sebagai metode onClick
untuk tombol Open Location. Gunakan tanda tangan metode yang sama sebagai
openWebsite().

5. Dapatkan nilai string EditText mLocationEditText.


String loc = mLocationEditText.getText().toString();

6. Parse string itu ke dalam objek Uri dengan kueri penelusuran geo:
Uri addressUri = Uri.parse("geo:0,0?q=" + loc);

7. Buat intent baru dengan Intent.ACTION_VIEW sebagai tindakan dan loc sebagai datanya.
Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);

8. Pecahkan intent dan periksa untuk memastikan intent berhasil diatasi. Jika demikian,
startActivity(), jika tidak catat log pesan kesalahan.
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Log.d("ImplicitIntents", "Can't handle this intent!");
}

Kode Solusi (bukan seluruh kelas):


public void openLocation(View view) {
// Get the string indicating a location. Input is not validated; it is
// passed to the location handler intact.
String loc = mLocationEditText.getText().toString();

// Parse the location and create the intent.


Uri addressUri = Uri.parse("geo:0,0?q=" + loc);
Intent intent = new Intent(Intent.ACTION_VIEW, addressUri);

// Find an activity to handle the intent, and start that activity.


if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
Log.d("ImplicitIntents", "Can't handle this intent!");
}
}
Tugas 4. Mengimplementasikan bagikan teks ini
Tindakan berbagi adalah cara mudah bagi pengguna untuk berbagi item dalam aplikasi Anda
dengan jaringan sosial dan aplikasi lain. Walaupun Anda bisa membangun tindakan berbagi
dalam aplikasi Anda sendiri menggunakan intent implisit, Android menyediakan kelas
pembantu ShareCompat.IntentBuilder untuk memudahkan implementasi berbagi. Anda bisa
menggunakan ShareCompat.IntentBuilder untuk membangun intent dan meluncurkan pemilih
untuk memungkinkan pengguna memilih aplikasi tujuan untuk berbagi.
Dalam tugas terakhir ini, kita akan mengimplementasikan sedikit teks dalam text edit dengan
kelas ShareCompat.IntentBuilder.

4.1 Mengimplementasikan metode shareText


1. Buka MainActivity.java.
2. Tambahkan variabel privat di bagian atas kelas untuk menampung objek EditText untuk URI situs
web.
private EditText mShareTextEditText;
3. Dalam metode onCreate(), gunakan findViewByID() untuk mendapatkan referensi tentang instance
EditText dan menetapkannya ke variabel privat tersebut:
mShareTextEditText = (EditText) findViewById(R.id.share_edittext);
4. Membuat metode baru bernama shareThis() untuk digunakan sebagai metode onClick untuk tombol
This Text. Gunakan tanda tangan metode yang sama sebagai openWebsite().
5. Dapatkan nilai string EditText mShareTextEditText.
String txt = mShareTextEditText.getText().toString();
6. Definisikan tipe mime teks untuk dibagikan:
String mimeType = "text/plain";

7. Panggil ShareCompat.IntentBuilder dengan metode ini:


ShareCompat.IntentBuilder
.from(this)
.setType(mimeType)
.setChooserTitle("Share this text with: ")
.setText(txt)
.startChooser();

Panggilan ke hareCompat.IntentBuilder ini menggunakan metode berikut:


</tr> </table> Format ini, dengan semua metode setter builder dirangkai dalam satu pernyataan,
adalah cara shorthand mudah untuk membuat dan meluncurkan intent. Anda bisa menambahkan
metode tambahan apa pun ke daftar ini.
Metode Keterangan

from() Aktivitas yang meluncurkan intent berbagi (ini).

setType() Tipe MIME item yang akan dibagikan.

setChooserTitle() Judul yang muncul pada pemilih aplikasi sistem.

setText() Teks sebenarnya yang akan dibagikan

startChooser() Tunjukkan pemilih aplikasi sistem dan kirimkan intent.

Kode Solusi (bukan seluruh kelas):

public void shareText(View view) {


String txt = mShareTextEditText.getText().toString();
String mimeType = "text/plain";

ShareCompat.IntentBuilder
.from(this)
.setType(mimeType)
.setChooserTitle("Share this text with: ")
.setText(txt)
.startChooser();
}

Tugas 5. Menerima Intent Implisit


Sejauh ini, Anda sudah membuat aplikasi yang menggunakan intent eksplisit dan implisit untuk
membuka beberapa aktivitas aplikasi lainnya. Dalam tugas ini kita akan melihat masalah dari
sudut pandang sebaliknya: mengizinkan aktivitas dalam aplikasi untuk merespons intent implisit
yang dikirim dari aplikasi lain.

Aktivitas dalam aplikasi Anda selalu bisa diaktifkan dari dalam atau luar aplikasi dengan intent
eksplisit. Untuk mengizinkan aktivitas menerima intent implisit, definisikan filter intent dalam
manifes Anda untuk menandakan intent implisit mana yang akan ditangani oleh aktivitas.
Untuk mencocokkan permintaan Anda dengan aplikasi spesifik yang dipasang pada perangkat,
sistem Android mencocokkan intent implisit dengan aktivitas yang filter intent-nya menandakan
bahwa intent itu dapat melakukan tindakan tersebut. Jika ada beberapa aplikasi terpasang yang
cocok, pengguna akan diberikan pemilih aplikasi yang akan mengizinkan pengguna memilih
aplikasi mana yang ingin digunakan untuk menangani intent tersebut.
Saat aplikasi pada perangkat mengirimkan intent implisit, sistem Android mencocokkan
tindakan dan data intent tersebut dengan aktivitas yang tersedia, termasuk filter intent yang
benar. Jika filter intent aktivitas cocok dengan intent, aktivitas dapat menangani intent itu
sendiri (jika itu satu-satunya aktivitas yang cocok), atau (jika ada beberapa yang cocok) sebuah
pemilih aplikasi akan muncul dan mengizinkan pengguna memilih aplikasi mana yang mereka
inginkan untuk melakukan tindakan itu.
Dalam tugas ini Anda akan membuat aplikasi sangat sederhana yang menerima intent implisit
untuk membuka URI untuk laman web. Saat diaktifkan oleh intent implisit, aplikasi itu
menampilkan URI yang diminta sebagai string dalam TextView.

5.1 Membuat Proyek & Layout


1. Mulai Android Studio dan buat proyek Android Studio baru.
2. Panggil "Penerima Intent Implisit" aplikasi Anda.
3. Pilih Empty Activity untuk template proyek.
4. Terima nama aktivitas default (MainActivity). Klik Berikutnya.
5. Pastikan kotak Generate Layout file dicentang. Klik Finish.
6. Buka res/layout/activity_main.xml.
7. Ubah TextView ("Hello World") yang sudah ada dengan atribut berikut:

Atribut Nilai
android:id "@+id/text_uri_message"
android:layout_width wrap_content
android:layout_height wrap_content
android:textSize "18sp"
android:textStyle "bold"

8. Hapus atribut android:text. Tidak ada teks dalam TextView ini secara default, Anda akan
menambahkan URI dari intent dalam onCreate().
5.2 Memodifikasi Manifes Android untuk menambahkan filter intent
1. Buka manifests/AndroidManifest.xml.
2. Perhatikan bahwa aktivitas utama telah memiliki filter intent ini:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Filter intent ini, yang merupakan bagian dari manifes proyek default, menunjukkan bahwa
aktivitas ini adalah titik masuk utama untuk aplikasi Anda (filter ini memiliki tindakan
intent "android.intent.action.MAIN"), dan bahwa aktivitas ini seharusnya muncul sebagai
item level teratas dalam peluncur (kategorinya
adalah "android.intent.category.LAUNCHER")
3. Tambahkan <intent-filter> tag inside <activity>, dan sertakan elemen-elemen berikut
ini:
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="developer.android.com" />

Baris ini mendefinisikan filter intent untuk aktivitas tersebut, jenis intent yang dapat ditangani
aktivitas. Filter intent mendeklarasikan elemen berikut:

Jenis Filter Nilai Kecocokan


tindakan "android.intent.action.VIEW" Semua intent dengan tindakan tampilan.
kategori "android.intent.category.DEFA Semua intent implisit. Kategori ini harus
ULT" disertakan agar aktivitas Anda menerima
intent implisit apa pun.
kategori "android.intent.category.BRO Permintaan untuk tautan yang dapat
WSABLE" dijelajahi dari laman web, email, atau
sumber lainnya.
data android:scheme="http" URI yang berisi skema http DAN
android:host="developer.andro hostname dari developer.android.com.
id.com"

Catat bahwa filter (https://developer.android.com/guide/topics/manifest/data-element.html) [data]


memiliki batasan untuk jenis tautan yang akan diterima dan hostname untuk URI tersebut. Jika
Anda memilih agar penerima dapat menerima tautan apa pun, Anda bisa
meninggalkan <data> elemen semuanya.

Kode Solusi:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.implicitintentsreceiver">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http"
android:host="developer.android.com" />
</intent-filter>
</activity>
</application>
</manifest>
5.3 Memproses Intent
Dalam metode onCreate() untuk aktivitas, Anda memproses intent yang masuk untuk data atau
ekstra yang disertakan. Dalam hal ini, intent implisit yang masuk memiliki URI yang disimpan
dalam data intent.
1. Buka MainActivity.java.
2. Dalam metode onCreate(), dapatkan intent yang datang dan digunakan untuk mengaktifkan
aktivitas tersebut:
Intent intent = getIntent();

3. Dapatkan data intent. Data intent selalu objek URI:


Uri uri = intent.getData();

4. Periksa untuk memastikan variabel uri tidak null. Jika pemeriksaan lulus, buat string dari
objek URI:
if (uri != null) {
String uri_string = "URI: " + uri.toString();
}
5. Di dalam blok if yang sama, dapatkan tampilan teks untuk pesannya:
TextView textView = (TextView) findViewById(R.id.text_uri_message);
6. Juga di dalam blok if, setel teks TextView itu ke URI:
textView.setText(uri_string);

7. Jalankan aplikasi penerima.


Menjalankan aplikasi itu sendiri menunjukkan aktivitas kosong tanpa teks. Ini karena
aktivitas diaktifkan dari peluncur sistem, dan tidak dengan intent dari aplikasi lain.
8. Jalankan aplikasi ImplicitIntents, dan klik Open Website dengan URI default.
Pemilih aplikasi muncul menanyakan apakah Anda ingin menggunakan browser default atau
aplikasi ImplicitIntentsReceiver. Pilih "Just Once" untuk aplikasi penerima. Aplikasi
ImplicitIntentsReceiver terbuka dan pesan menunjukkan URI dari permintaan yang asli.
9. Tap tombol kembali dan masukkan URI yang berbeda. Klik Open Website.
Aplikasi penerima memiliki filter intent yang hanya cocok dengan protokol URI yang sama
persis (http) and host (developer.android.com). URI lainnya terbuka pada browser web
default.
Rangkuman
 Intent implisit memungkinkan Anda untuk mengaktifkan aktivitas jika tahu tindakannya,
tetapi tidak tahu aplikasi spesifik atau aktivitas yang akan menangani tindakan tersebut.
 Aktivitas yang dapat menerima intent implisit harus mendefinisikan filter intent dalam
manifes Android yang cocok dengan satu atau beberapa tindakan intent dan kategori.
 Sistem Android cocok dengan konten intent implisit dan filter intent semua aktivitas yang
tersedia untuk menentukan aktivitas mana yang akan diaktifkan. Jika ada lebih dari satu
aktivitas yang tersedia, sistem menyediakan pemilih agar pengguna dapat memilih salah
satunya.
 Kelas ShareCompat.IntentBuilder memudahkan pembuatan intent implisit untuk berbagi
data ke media sosial atau email.

You might also like