Intent Filter: khái niệm, cách hoạt động và sử dụng trong phát triển

Tác giả: IT Sectr Đã đăng: 2026-05-14 Thời gian đọc: 8 phút

Intent Filter là một khai báo trong AndroidManifest.xml cho hệ thống biết thành phần ứng dụng có thể xử lý những intent ngầm định nào. Theo Hướng dẫn dành cho nhà phát triển Android, bộ lọc chứa action, category và data, dựa vào đó hệ thống định tuyến các cuộc gọi từ ứng dụng khác và sự kiện hệ thống. Phát triển Android sử dụng Intent Filter làm cơ chế chính cho liên kết lỏng lẻo giữa các thành phần của các ứng dụng khác nhau.

Những điểm chính

  • Intent Filter — một khai báo XML trong tệp kê khai xác định các loại Intent ngầm định mà Activity, Service hoặc BroadcastReceiver có thể xử lý.
  • Action chỉ định hành động mà thành phần nên thực hiện — ví dụ: ACTION_VIEW để xem dữ liệu hoặc ACTION_SEND để gửi nội dung.
  • Category thêm một danh mục bổ sung cho thành phần — BROWSABLE cho phép gọi từ trình duyệt, DEFAULT được yêu cầu cho Intent ngầm định.
  • Data mô tả URI, loại MIME hoặc lược đồ của dữ liệu được xử lý, điều này rất quan trọng để thiết lập deep link trong ứng dụng.
  • Xung đột khi có nhiều ứng dụng xử lý cùng một Intent được giải quyết bằng hộp thoại chọn của hệ thống hoặc cài đặt mặc định.

Intent Filter là gì?

Intent Filter là một phần tử cấu hình của ứng dụng Android cho hệ thống biết về khả năng của thành phần để xử lý các loại intent ngầm định nhất định. Không giống như Intent tường minh chỉ định một lớp cụ thể, Intent ngầm định chỉ chứa mô tả về hành động cần thiết và hệ thống tự tìm thành phần phù hợp dựa trên các bộ lọc đã đăng ký.

Các bộ lọc được khai báo bên trong một thành phần — Activity, Service hoặc BroadcastReceiver — trong tệp AndroidManifest.xml. Mỗi bộ lọc có thể chứa nhiều phần tử action, category và data. Một thành phần có thể có số lượng Intent Filter không giới hạn, mỗi bộ lọc mô tả một kịch bản xử lý riêng biệt.

Vai trò trong kiến trúc Android

Intent Filter thực hiện nguyên tắc liên kết lỏng lẻo giữa các thành phần ứng dụng. Ứng dụng A không cần biết về sự tồn tại của ứng dụng B — nó chỉ cần gửi Intent với mô tả hành động và hệ thống định tuyến nó dựa trên các bộ lọc. Cơ chế này là nền tảng của Share Sheet, lựa chọn trình duyệt và xử lý deep link.

Các loại Intent: tường minh và ngầm định

Intent tường minh chỉ định một lớp thành phần cụ thể để khởi chạy. Chúng được sử dụng cho điều hướng nội bộ trong một ứng dụng khi nhà phát triển biết chính xác Activity nào sẽ mở. Intent ngầm định chỉ chứa mô tả hành động và thành phần được hệ thống xác định động.

Intent Filter hoạt động độc quyền với Intent ngầm định. Nếu Intent chỉ định một lớp cụ thể, hệ thống bỏ qua tất cả các bộ lọc và khởi chạy trực tiếp thành phần được chỉ định. Các bộ lọc chỉ được kiểm tra khi giải quyết các cuộc gọi ngầm định, điều này làm cho chúng trở thành yếu tố chính của tương tác giữa các ứng dụng.

So sánh Intent tường minh và ngầm định

Đặc điểmIntent tường minhIntent ngầm định
Thành phầnĐược chỉ định rõ ràng (className)Hệ thống xác định
Intent FilterKhông yêu cầuYêu cầu
Ví dụstartActivity(Intent(this, ProfileActivity::class.java))Intent(ACTION_VIEW, Uri.parse(”https://example.com”))
Bảo mậtCao hơn (không bị chặn)Thấp hơn (có thể xung đột)

Cấu trúc Intent Filter trong tệp kê khai

Mỗi Intent Filter bao gồm ba nhóm phần tử — action, category và data — sự kết hợp của chúng xác định Intent nào thành phần sẽ nhận được. Một bộ lọc được coi là đáp ứng nếu Intent khớp với ít nhất một phần tử của mỗi nhóm.

Action mô tả hành động đang được thực hiện — xem, chỉnh sửa, gửi. Category thêm ngữ cảnh xử lý bổ sung — ví dụ: khả năng khởi chạy từ trình duyệt. Data xác định định dạng của thông tin đang được xử lý qua URI hoặc loại MIME.

Các thành phần của thẻ intent-filter

Ví dụ về Intent Filter cho Activity mở liên kết đến hồ sơ người dùng. Bộ lọc bao gồm cả ba nhóm phần tử để định tuyến chính xác.

xml
<activity android:name=".ProfileActivity">
    <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="profile" />
    </intent-filter>
</activity>

Lưu ý chỉ định bắt buộc category DEFAULT — nếu không có nó, hệ thống sẽ không chuyển Intent ngầm định đến thành phần. Danh mục BROWSABLE được thêm vào nếu liên kết cần được xử lý từ trình duyệt.

Deep link trên Android được cấu hình thông qua Intent Filter với action VIEW và thẻ data chứa lược đồ, máy chủ và đường dẫn. Khi theo một liên kết như myapp://profile/42, hệ thống tìm Activity có bộ lọc phù hợp và khởi chạy nó với URI được truyền. Điều quan trọng là cấu hình chính xác pathPrefix, pathPattern hoặc path để khớp chính xác.

Bắt đầu từ Android 6 (API 23), hỗ trợ cho App Links đã được thêm vào — deep link được xác minh qua HTTPS. App Links sử dụng cùng Intent Filter nhưng có xác minh tên miền bổ sung thông qua Digital Asset Links. Sau khi xác minh, hệ thống tự động mở ứng dụng mà không cần hộp thoại chọn.

Thẻ Data cho URL

Ví dụ về bộ lọc cho App Link với xác minh qua liên kết HTTPS. Trong trường hợp này, lược đồ luôn là https và máy chủ khớp với tên miền được chỉ định trong Digital Asset Links.

xml
<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"
        android:pathPrefix="/profile" />
</intent-filter>

Thuộc tính autoVerify yêu cầu hệ thống kiểm tra Digital Asset Links khi ứng dụng được cài đặt. Nếu xác minh thành công, ứng dụng tự động trở thành trình xử lý mặc định cho tên miền và đường dẫn được chỉ định.

Xử lý Intent trong các thành phần ứng dụng

Sau khi hệ thống chọn một thành phần để xử lý Intent, nhà phát triển phải trích xuất dữ liệu từ intent đến bên trong thành phần mục tiêu. Đối với Activity, phương thức getIntent() trong onCreate() được sử dụng; đối với BroadcastReceiver, phương thức onReceive(), nơi Intent được truyền dưới dạng tham số.

Việc trích xuất dữ liệu bao gồm lấy action để xác định loại thao tác, data cho URI và các tham số extra cho thông tin bổ sung. Mỗi phần tử này có thể vắng mặt, vì vậy kiểm tra null là bắt buộc trước khi sử dụng.

Mã xử lý trong Activity

Ví dụ về xử lý deep link đến trong Activity bằng Kotlin. Mã trích xuất URI từ Intent và đưa ra quyết định điều hướng dựa trên máy chủ và đường dẫn.

kotlin
class ProfileActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val uri = intent?.data
        if (uri?.host == "profile") {
            val userId = uri.lastPathSegment
            loadProfile(userId)
        }
    }
}

Nên sử dụng toán tử safe call để kiểm tra intent và data có null không, vì hoạt động có thể được khởi chạy mà không có deep link đến. Bạn cũng nên kiểm tra host và pathSegment có null không trước khi sử dụng chúng trong điều hướng.

Ưu tiên và giải quyết xung đột

Nếu nhiều ứng dụng đã đăng ký Intent Filter khớp với cùng một Intent ngầm định, hệ thống hiển thị cho người dùng hộp thoại chọn. Người dùng có thể chọn ứng dụng để sử dụng một lần hoặc đặt trình xử lý mặc định. Bắt đầu từ Android 10, hộp thoại chọn chỉ được hiển thị ở lần gọi đầu tiên, sau đó hệ thống ghi nhớ lựa chọn của người dùng.

Để quản lý mức độ ưu tiên, thuộc tính android:priority trong thẻ intent-filter được sử dụng. Giá trị càng cao, mức độ ưu tiên của thành phần càng lớn khi giải quyết xung đột. Tuy nhiên, mức độ ưu tiên không hoạt động cho các bộ lọc từ các ứng dụng khác nhau — trong trường hợp này, hộp thoại chọn luôn được hiển thị nếu không có ứng dụng nào được đặt làm mặc định.

Hộp thoại chọn ứng dụng

Nhà phát triển có thể gọi hộp thoại chọn theo chương trình thông qua Intent.createChooser(), truyền Intent mục tiêu và tiêu đề. Điều này hữu ích khi ứng dụng muốn đề xuất rõ ràng cho người dùng chọn trình xử lý, ngay cả khi ứng dụng mặc định đã được đặt. Ví dụ: khi gửi hình ảnh đến mạng xã hội qua ACTION_SEND với createChooser đảm bảo hiển thị hộp thoại bất kể cài đặt mặc định.

Lỗi thường gặp khi cấu hình Intent Filter

Một trong những lỗi phổ biến nhất là thiếu danh mục DEFAULT trong Intent Filter. Các nhà phát triển sao chép cấu hình từ các ví dụ nhưng quên thêm danh mục này, kết quả là Activity không nhận được Intent ngầm định. Hệ thống đơn giản là không thấy bộ lọc cho các cuộc gọi ngầm định, mặc dù Intent tường minh vẫn tiếp tục hoạt động.

Lỗi phổ biến thứ hai là chỉ định sai scheme trong thẻ data mà không có URI đầy đủ. Nếu chỉ có lược đồ được chỉ định nhưng không có máy chủ, bộ lọc sẽ chấp nhận tất cả các liên kết với lược đồ này từ bất kỳ nguồn nào, điều này có thể dẫn đến các cuộc gọi không mong muốn từ các nguồn không đáng tin cậy. Nên luôn chỉ định ít nhất scheme và host.

Lỗi thứ ba là thiếu kiểm tra null cho intent.data trong mã Activity. Nếu Activity được khởi chạy không phải qua deep link mà theo cách tiêu chuẩn từ trình khởi chạy, Intent không chứa URI. Truy cập intent.data mà không kiểm tra gây ra NullPointerException và làm ứng dụng bị treo. Luôn sử dụng intent?.data?.toString() với toán tử safe call.

Câu hỏi thường gặp

Có bắt buộc chỉ định category DEFAULT trong Intent Filter không?

Có, danh mục DEFAULT là bắt buộc để nhận Intent ngầm định. Nếu không có nó, hệ thống sẽ không chuyển các cuộc gọi ngầm định đến thành phần và Intent Filter sẽ chỉ hoạt động cho Intent tường minh, vốn không kiểm tra bộ lọc.

Một Activity có thể có bao nhiêu Intent Filter?

Không có giới hạn. Một Activity có thể chứa bất kỳ số lượng Intent Filter nào. Mỗi bộ lọc mô tả một kịch bản xử lý riêng biệt, ví dụ một bộ lọc cho deep link, một bộ lọc khác cho xử lý tệp, bộ lọc thứ ba cho Share Sheet.

Intent Filter khác App Link như thế nào?

Intent Filter là cơ chế chung để xử lý Intent ngầm định. App Link là trường hợp đặc biệt của Intent Filter với xác minh thông qua Digital Asset Links, tự động chỉ định ứng dụng làm trình xử lý mặc định cho các liên kết HTTPS trên một tên miền được chỉ định.

Có thể sử dụng Intent Filter cho Service hoặc BroadcastReceiver không?

Có, Intent Filter có thể được khai báo không chỉ cho Activity mà còn cho ServiceBroadcastReceiver. Đối với Service, điều này cho phép chạy dịch vụ nền từ các ứng dụng khác; đối với BroadcastReceiver, cho phép nhận các thông điệp phát sóng hệ thống.

Intent Filter xử lý loại MIME như thế nào?

Loại MIME được chỉ định trong thẻ data thông qua thuộc tính mimeType. Bộ lọc xác định loại dữ liệu nào thành phần có thể xử lý — ví dụ: image/* cho tất cả hình ảnh hoặc text/plain chỉ cho văn bản thuần. Loại MIME có thể được kết hợp với lược đồ URI.

Tổng kết

  • Intent Filter — một khai báo XML trong AndroidManifest.xml xác định Intent ngầm định nào thành phần ứng dụng có thể xử lý.
  • Ba nhóm — action, category, data (URI và MIME) tạo thành bộ lọc; thành phần nhận Intent nếu tất cả các nhóm được chỉ định khớp.
  • Deep link được cấu hình thông qua action VIEW và thẻ data với lược đồ, máy chủ và đường dẫn, tùy chọn với autoVerify cho App Links.
  • App Links — liên kết HTTPS được xác minh thông qua Digital Asset Links không yêu cầu hộp thoại chọn ứng dụng.
  • Xung đột khi nhiều bộ lọc khớp được giải quyết bằng hộp thoại hệ thống hoặc mức độ ưu tiên cho các thành phần của cùng một ứng dụng.
  • Xử lý Intent đến được thực hiện thông qua intent.data trong Activity hoặc onReceive trong BroadcastReceiver với kiểm tra null bắt buộc.
  • Sử dụng — Intent Filter được sử dụng cho tương tác giữa các ứng dụng, xử lý liên kết, tệp và sự kiện hệ thống.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm