Menggunakan Intent Filter

Sebelumnya, kita sudah melihat bagaimana suatu activity bisa memanggil activity lain dengan menggunakan object 'Intent'. Supaya activity yang lain bisa memanggil activity kita, kita harus menetapkan 'action' dan 'category' di dalam elemen <intent-filter> di dalam file "AndroidManifest.xml" seperti berikut:
<intent-filter>
<action android:name="com.example.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
Berikut di bawah ini adalah latihan yang sangat sederhana dimana satu activity memanggil yang lain dengan menggunakan action "com.example.SecondActivity".

1. Kita masih menggunakan project yang sama dengan sebelumnya, dan kita tambahkan file java: "MyBrowserActivity.java" dan juga file XML layout yang kita beri nama "browser.xml".

2. Kita modifikasi dan tambahkan kode berikut dalam file "AndroidManifest.xml":
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.intents">

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.INTERNET" />

<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>
</activity>
<activity android:name=".MyBrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
</application>

</manifest>
3. Kita modifikasi dan tambahkan kode berikut dalam file layout "activity_main.xml" seperti berikut:
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.intents.MainActivity">

<Button
android:id="@+id/btn_webbrowser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Web Browser"
android:onClick="onClickWebBrowser"/>

<Button
android:id="@+id/btn_makecalls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Menelpon"
android:onClick="onClickMakeCalls"/>

<Button
android:id="@+id/btn_showMap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tampilkan Peta"
android:onClick="onClickShowMap"/>

<Button
android:id="@+id/btn_launchMyBrowser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tampilkan Browser"
android:onClick="onClickLaunchMyBrowser"/>
</LinearLayout>
4. Kita modifikasi dan tambahkan kode berikut pada file "MainActivity.java":
package com.example.intents;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

int request_Code = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClickWebBrowser(View view) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("https://diansano.blogspot.co.id"));
startActivity(i);
}

public void onClickMakeCalls(View view) {
Intent i = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:+628198765432"));
startActivity(i);
}

public void onClickShowMap(View view) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.827500, -122.481670"));
startActivity(i);
}

public void onClickLaunchMyBrowser(View view) {
Intent i = new Intent("com.example.MyBrowser");
i.setData(Uri.parse("https://www.diansano.blogspot.co.id"));
startActivity(i);
}
}
5. Kita tambahkan kode berikut pada file "browser.xml":
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<WebView
android:id="@+id/WebView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
6. Kita tambahkan kode berikut pada file "MyBrowserActivity.java":
package com.example.intents;

import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyBrowserActivity extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browser);

Uri url = getIntent().getData();
WebView webView = (WebView) findViewById(R.id.WebView01);
webView.setWebViewClient(new Callback());
webView.loadUrl(url.toString());
}

private class Callback extends WebViewClient {

@Override
@SuppressWarnings("deprecation")
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return (false);
}

@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return(false);
}
}
}
7. Kita jalankan di emulator Android Studio. Kemudian klik tombol "Tampilkan Browser". Seharusnya hasilnya seperti pada gambar di bawah ini:


Penjelasan:

Dalam latihan ini kita membuat activity baru dengan nama "MyBrowserActivity". Kita terlebih dahulu harus mendeklarasikannya dalam file "AndroidManifest.xml" seperti berikut:
<activity android:name=".MyBrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
Di dalam elemen <intent-filter>, kita mendeklarasikannya menjadi dua 'action', satu 'category', dan satu 'data'. Ini artinya bahwa semua activity yang lain bisa memanggil activity ini dengan menggunakan action "android.intent.action.VIEW" atau dengan menggunakan action "com.example.MyBrowser". Untuk semua activity yang kita inginkan untuk dipanggil oleh activity lain dengan menggunakan method 'startActivity()' atau method 'startActivityForResult()', mereka harus memiliki category "android.intent.category.DEFAULT". Bila tidak, activity kita tidak akan bisa dipanggil oleh activity lain. Elemen <data> menentukan jenis data yang diharapkan oleh activity tersebut. Dalam latihan ini, data yang diharapkan dimulai dengan prefix "http://.

Intent filter dalam contoh di atas juga bisa dituliskan seperti berikut:
<activity android:name=".MyBrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="com.example.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
Dengan menulis intent filter dengan cara ini membuat lebih mudah dibaca, dan secara logik mengelompokkan 'action', 'category', dan 'data' di dalam intent filter.

Bila saat ini kita menggunakan action ACTION_VIEW dengan data yang kita gunakan di dalam latihan ini, Android akan menampilkan pilihan apakah menggunakan app Browser atau app Intent yang sedang kita buat.

Harap diperhatikan bahwa bila banyak activity yang cocok dengan object Intent, dialog yang menampilkan "Complete action using" akan muncul. Kita bisa melakukan kustomisasi dengan menggunakan method 'createChooser()' dari class 'Intent', seperti berikut:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("http://www.amazon.com"));
startActivity(Intent.createChooser(i, "Buka URL menggunakan..."));
Kode tersebut akan mengubah judul dialog menjadi "Buka URL menggunakan...". Harap dicatat bahwa pilihan "Use by default for this action" saat ini tidak tersedia.

Manfaat menggunakan method 'createChooser()' adalah bahwa ketika tidak ada activity yang cocok object 'Intent' kita tidak akan 'crash', tetapi akan menampilkan pesan "No applications can perform this action".

No comments: