ภาพรวม
Intent Filter ประกาศใน AndroidManifest.xml เพื่อบอกระบบ Android ว่า Component (Activity, Service, BroadcastReceiver) ตอบสนองต่อ Intent ประเภทไหนได้ เป็นกลไกสำคัญของ Implicit Intent ที่ทำให้แอปต่างๆ สื่อสารกันได้
องค์ประกอบหลัก 3 ส่วน
| องค์ประกอบ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
<action> | การกระทำที่ต้องการทำ | android.intent.action.SEND, android.intent.action.VIEW |
<category> | ประเภทของ Component | android.intent.category.DEFAULT, android.intent.category.BROWSABLE |
<data> | ประเภทข้อมูล (MIME type, URI scheme, host, path) | mimeType="text/plain", scheme="https", host="example.com" |
Android ทำการทดสอบ 3 ขั้นตอน: Action Test → Category Test → Data Test ทั้งสามต้องผ่านจึงจะจับคู่ Intent ได้
ตัวอย่าง: แชร์ข้อความผ่านแอปอีเมล
1. Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="24dp">
<Button
android:id="@+id/btnSendEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ส่งอีเมลทดสอบ" />
</LinearLayout>
2. MainActivity.java
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnSend = findViewById(R.id.btnSendEmail);
btnSend.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822"); // MIME type สำหรับอีเมล
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"contact@example.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "หัวข้ออีเมล");
intent.putExtra(Intent.EXTRA_TEXT, "เนื้อหาอีเมล");
// สร้าง Chooser ให้ผู้ใช้เลือกแอป
Intent chooser = Intent.createChooser(intent, "เลือกแอปส่งอีเมล");
startActivity(chooser);
});
}
}
3. AndroidManifest.xml (ส่วนสำคัญ)
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Intent Filter สำหรับรับ Intent.ACTION_SEND -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
<data android:mimeType="message/rfc822" />
</intent-filter>
</activity>
กรณีใช้งานทั่วไป (Common Use Cases)
1. เปิดลิงก์เว็บ (Deep Link)
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="example.com" />
</intent-filter>
2. แชร์รูปภาพ/ไฟล์
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
3. Custom Scheme (เปิดแอปจากลิงก์)
<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="myapp" android:host="detail" />
</intent-filter>
→ เปิดได้ด้วยลิงก์: myapp://detail?id=123
แนวทางปฏิบัติที่ดี
- ใช้
android:autoVerify="true"สำหรับ App Links (Android 6.0+) - แยก
<intent-filter>ต่อ Action เพื่อความชัดเจน - ระบุ
android:mimeTypeให้เฉพาะเจาะจง (หลีกเลี่ยง*/*) - ทดสอบด้วยคำสั่ง ADB:
adb shell am start -a android.intent.action.VIEW -d "https://example.com" com.example.myapp
สรุป
Intent Filter เป็นหัวใจของการทำงานร่วมกันระหว่างแอป (Inter-app Communication) การเข้าใจ Action, Category, Data จะช่วยให้สร้างแอปที่เชื่อมต่อกับระบบแอนดรอยด์และแอปอื่นๆ ได้อย่างมีประสิทธิภาพ