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 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.
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.
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.
| Đặc điểm | Intent tường minh | Intent ngầm định |
|---|---|---|
| Thành phần | Được chỉ định rõ ràng (className) | Hệ thống xác định |
| Intent Filter | Không yêu cầu | Yêu cầu |
| Ví dụ | startActivity(Intent(this, ProfileActivity::class.java)) | Intent(ACTION_VIEW, Uri.parse(”https://example.com”)) |
| Bảo mật | Cao hơn (không bị chặn) | Thấp hơn (có thể xung đột) |
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.
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.
<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.
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.
<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.
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.
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.
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.
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.
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.
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ó, 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.
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 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ó, Intent Filter có thể được khai báo không chỉ cho Activity mà còn cho Service và BroadcastReceiver. Đố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.
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
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.
Đọc thêm