Menambahkan 'Category' ke Intent Filter

Kita bisa mengelompokkan beberapa activity kita menjadi beberapa category dengan menggunakan elemen <category> di dalam intent filter. Misalkan kita sudah menambahkan elemen <category> seperti berikut di 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" />
<category android:name="com.example.Apps" />
<data android:scheme="http" />
</intent-filter>
</activity>
</application>

</manifest>
Di dalam hal ini, kode berikut akan memanggil langsung activity "MyBrowserActivity":
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("http://www.amazon.com"));
i.addCategory("com.example.Apps");
startActivity(Intent.createChooser(i, "Membuka URL menggunakan...);
Kita menambahkan category ke object 'Intent' dengan menggunakan method 'addcategory()'. Bila kita mengeluarkan kode 'addCategory()' kode di atas akan tetap memanggil activity "MyBrowserActivity" karena masih cocok dengan category default: "android.intent.category.DEFAULT".

Namun demikian, bila kita menentukan category yang tidak cocok dengan category yang sudah didefiniskan di intent filter, makan activity tidak akan berjalan (tidak ada activity yang dipanggil):
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("http://www.amazon.com"));
//i.addCategory("com.example.Apps");
//category ini tidak cocok dengan intent-filter
i.addCategory("com.example.AppsLain");
startActivity(Intent.createChooser(i, "Membuka URL menggunakan...);
Category di atas ("com.example.AppsLain") tidak cocok dengan category apapun di dalam intebt filter, sehingga kesalahan run-time akan terjadi (bila kita tidak menggunakan method 'createChoose()' dari class 'Intent').

Bila kita tambahkan category berikut di dalam intent filter dari 'MyBrowserActivity', maka kode di atas akan berjalan:
<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" />
<category android:name="com.example.Apps" />
<category android:name="com.example.AppsLain" />
<data android:scheme="http" />
</intent-filter>
</activity>
Kita bisa menambahkan banyak category ke object 'Intent', misalna, kode berikut akan menambahkan category "com.example.BeberapaAppsLain" ke object 'Intent':
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("http://www.amazon.com"));
//i.addCategory("com.example.Apps");
//category ini tidak cocok dengan intent-filter
i.addCategory("com.example.AppsLain");
i.addCategory("com.example.BeberapaAppsLain");
startActivity(Intent.createChooser(i, "Membuka URL menggunakan...);
Karena intent filter tidak mendefinisikan category "com.example.BeberapaAppsLain", kode di atas tidak akan bisa memanggila activity 'MyBrowserActivity'. Untuk membetulkannya, kita harus menambahkan "com.example.BeberapaAppsLain" ke intent filter lagi.

Dari ilustrasi contoh di atas, kita sudah jelas bahwa bila menggunakan object 'Intent' dengan category, semua category yang ditambahkan ke object 'Intent' harus benar-benar cocok dengan yang didefinisikan di intent filter sebelum suatu activity bisa dipanggil.

No comments: