Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

Intent Filters ใน Android คืออะไร และการใช้งาน

ภาพรวม

Intent Filter ประกาศใน AndroidManifest.xml เพื่อบอกระบบ Android ว่า Component (Activity, Service, BroadcastReceiver) ตอบสนองต่อ Intent ประเภทไหนได้ เป็นกลไกสำคัญของ Implicit Intent ที่ทำให้แอปต่างๆ สื่อสารกันได้

องค์ประกอบหลัก 3 ส่วน

องค์ประกอบคำอธิบายตัวอย่าง
<action>การกระทำที่ต้องการทำandroid.intent.action.SEND, android.intent.action.VIEW
<category>ประเภทของ Componentandroid.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 จะช่วยให้สร้างแอปที่เชื่อมต่อกับระบบแอนดรอยด์และแอปอื่นๆ ได้อย่างมีประสิทธิภาพ