Notification Action — các nút tương tác và trường nhập liệu xuất hiện trực tiếp trong thông báo push cho phép người dùng thực hiện hành động mà không cần mở ứng dụng. Đây là yếu tố chính của trải nghiệm người dùng, rút ngắn đường dẫn đến màn hình mục tiêu. Theo Android Developers, 2025, Notification Action tăng mức độ tương tác của người dùng lên đến 40% nhờ giảm ma sát trong tương tác.
Những điểm chính
Notification Action là một phần tử giao diện tương tác được thêm vào thông báo push để thực hiện một hành động cụ thể. Người dùng có thể trả lời tin nhắn, xác nhận tác vụ hoặc mở một màn hình cụ thể mà không cần vào ứng dụng. Các hành động xuất hiện dưới dạng nút bên dưới văn bản thông báo hoặc trong chế độ xem mở rộng khi vuốt.
Mục đích chính của Notification Action là giảm số bước để người dùng đạt được mục tiêu. Thay vì mở ứng dụng và điều hướng đến màn hình mong muốn, người dùng chỉ cần nhấn một nút. Nghiên cứu cho thấy các ứng dụng có thông báo tương tác có mức độ tương tác cao hơn 25–40% so với thông báo đơn giản.
Trên Android, Notification Action hiển thị dưới dạng nút biểu tượng ở chế độ xem gọn và nút văn bản ở chế độ mở rộng. Trên iOS, hành động xuất hiện khi nhấn giữ thông báo hoặc vuốt sang trái. Mỗi nền tảng có khuyến nghị riêng về số lượng hành động — Android khuyến nghị tối đa 3, iOS tối đa 4.
| Nền tảng | Tối đa hành động | Phương thức hiển thị | Loại hành động |
|---|---|---|---|
| Android | 3 | Biểu tượng + Văn bản | Nút bấm, Nhập văn bản |
| iOS | 4 | Nhấn giữ / Vuốt | Nút bấm, Nhập văn bản |
Trên Android, Notification Action được tạo qua NotificationCompat.Builder sử dụng phương thức addAction(). Mỗi hành động chứa biểu tượng, văn bản và PendingIntent được kích hoạt khi chạm. Từ Android 7.0 (API 24), hỗ trợ nhập văn bản trực tiếp qua RemoteInput.
Để tạo nút trong thông báo, cần định nghĩa PendingIntent sẽ được khởi chạy khi chạm. PendingIntent có thể mở Activity, khởi động Service hoặc BroadcastReceiver. Biểu tượng hành động phải là đơn sắc và tuân thủ Material Design.
val acceptIntent = Intent(context, AcceptActionReceiver::class.java)
acceptIntent.putExtra("notification_id", notificationId)
val acceptPendingIntent = PendingIntent.getBroadcast(
context, requestCode,
acceptIntent, PendingIntent.FLAG_UPDATE_CURRENT
)
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Yêu cầu xác nhận")
.setContentText("Xác nhận hoàn thành tác vụ")
.addAction(R.drawable.ic_accept, "Xác nhận", acceptPendingIntent)
.build()
Đối với các kịch bản cần nhập văn bản (ví dụ: trả lời tin nhắn), Android cung cấp RemoteInput. Người dùng nhập văn bản trực tiếp vào thông báo và ứng dụng nhận được mà không cần mở Activity. RemoteInput được hỗ trợ trên Android 7.0+ và yêu cầu xử lý rõ ràng trong BroadcastReceiver hoặc Service.
val remoteInput = RemoteInput.Builder("reply_input")
.setLabel("Nhập câu trả lời")
.build()
val replyAction = NotificationCompat.Action.Builder(
R.drawable.ic_reply, "Trả lời", replyPendingIntent
)
.addRemoteInput(remoteInput)
.build()
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.addAction(replyAction)
.build()
Khi một hành động được chạm, hệ thống khởi chạy PendingIntent đã chỉ định. Để lấy văn bản đã nhập qua RemoteInput, gọi RemoteInput.getResultsFromIntent(intent). Khuyến nghị xử lý hành động trong IntentService hoặc WorkManager để không chặn luồng UI.
Trên iOS, Notification Action được triển khai qua framework UserNotifications. Nhà phát triển tạo danh mục hành động (UNNotificationCategory) và đăng ký chúng khi khởi động ứng dụng. Mỗi hành động được định nghĩa bởi đối tượng UNNotificationAction với định danh duy nhất.
Để thêm hành động vào thông báo push trên iOS, cần tạo một danh mục nhóm các hành động liên quan. Danh mục được chỉ định trong tải trọng thông báo qua trường category. Khi nhận thông báo, hệ thống hiển thị các hành động khả dụng từ danh mục đã chỉ định.
import UserNotifications
class NotificationSetup {
func registerNotificationCategories() {
let approveAction = UNNotificationAction(
identifier: "APPROVE_ACTION",
title: "Phê duyệt",
options: [.foreground]
)
let declineAction = UNNotificationAction(
identifier: "DECLINE_ACTION",
title: "Từ chối",
options: [.destructive]
)
let category = UNNotificationCategory(
identifier: "REQUEST_CATEGORY",
actions: [approveAction, declineAction],
intentIdentifiers: [],
options: []
)
UNUserNotificationCenter.current()
.setNotificationCategories([category])
}
}
Khi người dùng chạm vào hành động, hệ thống gọi phương thức userNotificationCenter:didReceiveNotificationResponse trong delegate của UNUserNotificationCenter. response.actionIdentifier chứa định danh của hành động đã thực hiện. Để nhập văn bản, UNTextInputNotificationAction được sử dụng, cung cấp văn bản do người dùng nhập.
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
switch response.actionIdentifier {
case "APPROVE_ACTION":
Log.d("Action: approved")
case "DECLINE_ACTION":
Log.d("Action: declined")
case UNNotificationDefaultActionIdentifier:
Log.d("Action: opened app")
default:
break
}
completionHandler()
}
}
Notification Action được phân loại theo loại tương tác và kịch bản sử dụng. Việc chọn đúng loại hành động ảnh hưởng trực tiếp đến trải nghiệm người dùng và chuyển đổi sang hành động mục tiêu.
Loại phổ biến nhất — nút mở ứng dụng trên một màn hình cụ thể. Trên Android, sử dụng PendingIntent.getActivity(), trên iOS — tùy chọn .foreground của UNNotificationAction. Được sử dụng cho các hành động cần giao diện đầy đủ, như xem chi tiết đơn hàng.
Hành động thực thi mà không mở ứng dụng. Trên Android, sử dụng PendingIntent.getBroadcast() hoặc PendingIntent.getService(). Trên iOS — tùy chọn .authenticationRequired hoặc không có .foreground. Ví dụ: đánh dấu tác vụ đã hoàn thành, thích bài viết, thêm vào mục yêu thích.
Cho phép người dùng nhập văn bản trực tiếp vào thông báo. Trên Android, triển khai qua RemoteInput, trên iOS — qua UNTextInputNotificationAction. Được sử dụng để trả lời tin nhắn, bình luận, nhập mã xác nhận một lần.
Hành động thay đổi dữ liệu không thể đảo ngược — xóa, từ chối, chặn. Trên Android, chúng được đánh dấu trực quan (màu đỏ trên một số hệ thống), trên iOS yêu cầu tùy chọn .destructive. Khuyến nghị yêu cầu xác nhận cho hành động phá hủy, ví dụ qua hộp thoại bổ sung hoặc lần chạm thứ hai.
Một lớp hành động riêng biệt — nhập văn bản trực tiếp từ thông báo. Trên Android, điều này được triển khai qua RemoteInput kết hợp với PendingIntent. Trên iOS, UNTextInputNotificationAction được sử dụng, kế thừa từ UNNotificationAction. Các hành động này được sử dụng cho trả lời nhanh trong ứng dụng nhắn tin, nhập mã khuyến mãi, điền biểu mẫu phản hồi hoặc đánh giá chất lượng dịch vụ. Văn bản đã nhập được truyền đến ứng dụng cùng với định danh hành động. Để xử lý chính xác nhập văn bản trên cả hai nền tảng, cần triển khai phân tích dữ liệu đã nhập và xác thực trước khi thực hiện hành động mục tiêu.
Xử lý Notification Action chính xác là rất quan trọng cho phân tích và trải nghiệm người dùng. Mỗi thao tác chạm phải được ghi nhật ký và hành động phải được thực thi đáng tin cậy ngay cả khi ứng dụng đã đóng.
Theo dõi mỗi thao tác chạm trên Notification Action qua hệ thống phân tích của bạn. Firebase Analytics, Mixpanel hoặc Yandex.Metrica cho phép ghi lại định danh hành động, thời gian chạm và ngữ cảnh thông báo. Dữ liệu này giúp tối ưu hóa chiến lược thông báo và tăng mức độ tương tác. Thử nghiệm A/B với các bộ hành động khác nhau giúp xác định các kịch bản tương tác hiệu quả nhất với người dùng.
Nếu ứng dụng đã đóng, hệ thống vẫn gửi Intent hoặc UNNotificationResponse khi chạm vào hành động. Trên Android, sử dụng BroadcastReceiver để xử lý đảm bảo. Trên iOS, hệ thống khởi chạy ứng dụng trong nền và chuyển phản hồi đến delegate. Đối với các hành động quan trọng (xác nhận thanh toán, ủy quyền), thêm cơ chế thử lại và thông báo cho người dùng về việc hoàn thành thành công.
Từ Android 7.0, nhà phát triển có thể ảnh hưởng đến giao diện của Notification Action thông qua biểu tượng và màu sắc. Biểu tượng phải là đơn sắc (kênh alpha), kích thước 24x24 dp. Trên iOS, tùy chỉnh nút bị giới hạn — sử dụng màu sắc và phông chữ hệ thống. Material Design khuyến nghị nhóm hành động theo mức độ ưu tiên: hành động quan trọng nhất đầu tiên, hành động phá hủy cuối cùng.
Câu hỏi thường gặp
Android khuyến nghị tối đa 3 hành động, iOS — tối đa 4. Vượt quá giới hạn khiến một số hành động không hiển thị hoặc bị ẩn trong menu phụ.
Biểu tượng được truyền vào NotificationCompat.Action.Builder như một tài nguyên drawable. Biểu tượng phải là đơn sắc (kênh alpha), kích thước 24x24 dp và tuân thủ hướng dẫn Material Design.
Có, nếu thông báo hiển thị trên màn hình khóa và cờ visibility được đặt thành VISIBILITY_PUBLIC. Trên iOS, cần tùy chọn .authenticationRequired cho các hành động yêu cầu ủy quyền.
Trên Android, hệ thống tạo lại tiến trình và gửi Intent. Trên iOS, hệ thống khởi chạy ứng dụng trong nền. Có thể đảm bảo gửi bằng cách sử dụng BroadcastReceiver trên Android và UNNotificationServiceExtension trên iOS.
Trên Android, hành động hiển thị trực tiếp bên dưới thông báo dưới dạng biểu tượng. Trên iOS, hành động bị ẩn sau thao tác nhấn giữ hoặc vuốt. Thiết kế UX thông báo phải tính đến những khác biệt nền tảng này.
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