Thông báo cung cấp thông tin ngắn gọn và kịp thời về các sự kiện trong ứng dụng khi ứng dụng không được sử dụng. Tài liệu này hướng dẫn bạn cách tạo một thông báo có nhiều tính năng. Để xem phần giới thiệu về cách thông báo xuất hiện trên Android, hãy xem bài viết Tổng quan về thông báo. Để xem mã mẫu sử dụng thông báo, hãy xem mẫu SociaLite trên GitHub.
Mã trên trang này sử dụng các NotificationCompat API trong Thư viện AndroidX. Các API này cho phép bạn thêm những tính năng chỉ có trên các phiên bản Android mới hơn, đồng thời vẫn đảm bảo khả năng tương thích với Android 9 (cấp độ API 28).
Tuy nhiên, một số tính năng như thao tác trả lời trực tiếp sẽ không hoạt động trên các phiên bản cũ.
Tạo một thông báo cơ bản
Thông báo ở dạng cơ bản và nhỏ gọn nhất (còn gọi là dạng thu gọn) sẽ hiển thị một biểu tượng, tiêu đề và một đoạn văn bản ngắn. Phần này cho biết cách tạo một thông báo mà người dùng có thể nhấn vào để chạy một hoạt động trong ứng dụng của bạn.
Hình 1. Một thông báo có biểu tượng, tiêu đề và một đoạn văn bản.
Để biết thêm thông tin chi tiết về từng phần của thông báo, hãy đọc bài viết về cấu trúc thông báo.
Khai báo quyền khi bắt đầu chạy
Android 13 (cấp độ API 33) trở lên hỗ trợ quyền khi bắt đầu chạy để đăng thông báo không được miễn trừ (bao gồm cả Dịch vụ trên nền trước (FGS)) từ một ứng dụng.
Quyền mà bạn cần để khai báo trong tệp kê khai của ứng dụng sẽ xuất hiện trong đoạn mã sau:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
Để biết thêm thông tin chi tiết về quyền khi bắt đầu chạy, hãy xem phần Quyền khi bắt đầu chạy của thông báo.
Đặt nội dung thông báo
Để bắt đầu, hãy đặt nội dung và kênh của thông báo bằng cách sử dụng đối tượng
NotificationCompat.Builder. Ví dụ sau đây cho biết cách tạo một thông báo có các nội dung sau:
Một biểu tượng nhỏ, do
setSmallIcon()đặt. Đây là nội dung duy nhất mà người dùng có thể thấy và là nội dung bắt buộc.Tiêu đề, do
setContentTitle()đặt.Văn bản nội dung, do
setContentText()đặt.Mức độ ưu tiên của thông báo, do
setPriority()đặt. Mức độ ưu tiên xác định mức độ xâm nhập của thông báo trên Android 7.1 trở xuống. Đối với Android 8.0 trở lên, thay vào đó, hãy đặt mức độ quan trọng của kênh như minh hoạ trong phần tiếp theo.
val textTitle = "Title" val textContent = "Content" val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Hàm khởi tạo NotificationCompat.Builder yêu cầu bạn cung cấp mã nhận dạng kênh. Điều này là bắt buộc để tương thích với Android 8.0 (API cấp 26) trở lên, nhưng sẽ bị các phiên bản cũ hơn bỏ qua.
Theo mặc định, nội dung văn bản của thông báo sẽ bị cắt sao cho vừa đủ trong một dòng. Bạn có thể hiện thêm thông tin bằng cách tạo một thông báo có thể mở rộng.
Hình 2. Một thông báo có thể mở rộng ở dạng thu gọn và mở rộng.
Nếu muốn nội dung thông báo dài hơn, bạn có thể làm cho thông báo mở rộng được
bằng cách thêm một mẫu kiểu có setStyle(). Ví dụ: mã sau đây tạo một vùng văn bản lớn hơn:
val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Much longer text that cannot fit one line...") .setStyle(NotificationCompat.BigTextStyle() .bigText("Much longer text that cannot fit one line...")) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Để biết thêm thông tin về các kiểu thông báo lớn khác, bao gồm cả cách thêm hình ảnh và bộ điều khiển chế độ phát nội dung nghe nhìn, hãy xem phần Tạo thông báo có thể mở rộng.
Tạo một kênh và đặt mức độ quan trọng
Trước khi bạn có thể gửi thông báo trên Android 8.0 trở lên, hãy đăng ký kênh thông báo của ứng dụng với hệ thống bằng cách truyền một phiên bản của NotificationChannel đến createNotificationChannel(). Mã sau đây bị chặn theo điều kiện trên phiên bản SDK_INT:
fun createNotificationChannel(context: Context) { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val name = context.getString(R.string.channel_name) val descriptionText = context.getString(R.string.channel_description) val importance = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(CHANNEL_ID, name, importance).apply { description = descriptionText } // Register the channel with the system. val notificationManager: NotificationManager = context.getSystemService(NotificationManager::class.java) as NotificationManager notificationManager.createNotificationChannel(channel) } }
Vì bạn phải tạo kênh thông báo trước khi đăng bất kỳ thông báo nào trên Android 8.0 trở lên, hãy thực thi mã này ngay khi ứng dụng của bạn bắt đầu. Bạn có thể gọi mã này nhiều lần mà không gặp vấn đề gì vì việc tạo một kênh thông báo hiện có sẽ không thực hiện thao tác nào.
Hàm khởi tạo NotificationChannel yêu cầu một importance, sử dụng một trong các
hằng số của lớp NotificationManager. Tham số này xác định cách làm gián đoạn người dùng đối với mọi thông báo thuộc kênh này. Đặt mức độ ưu tiên bằng setPriority() để hỗ trợ Android 7.1 trở xuống, như minh hoạ trong ví dụ trước.
Mặc dù bạn phải đặt mức độ quan trọng hoặc mức độ ưu tiên của thông báo như trong ví dụ sau, nhưng hệ thống không đảm bảo hành vi hiển thị cảnh báo sẽ đúng như mong đợi. Trong một số trường hợp, hệ thống có thể thay đổi mức độ quan trọng dựa trên các yếu tố khác, đồng thời người dùng luôn có thể xác định lại mức độ quan trọng cho một kênh nhất định.
Để biết thêm thông tin về ý nghĩa của các mức độ khác nhau, hãy đọc bài viết về các mức độ quan trọng của thông báo.
Đặt thao tác nhấn vào thông báo
Mọi thông báo đều phải phản hồi khi người dùng nhấn vào, thường là để mở một hoạt động trong ứng dụng của bạn tương ứng với thông báo đó. Để làm vậy, hãy chỉ định một ý định về nội dung được đối tượng PendingIntent xác định, rồi truyền đối tượng đó đến setContentIntent().
Đoạn mã sau đây cho biết cách tạo một ý định cơ bản để mở một hoạt động khi người dùng nhấn vào thông báo:
// Create an explicit intent for an Activity in your app. val intent = Intent(context, AlertDetails::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true)
Mã này gọi setAutoCancel(), có chức năng tự động xoá
thông báo khi người dùng nhấn vào thông báo đó.
Cờ ý định trong ví dụ trước đó giúp duy trì trải nghiệm điều hướng mà người dùng mong đợi sau khi người dùng mở ứng dụng của bạn bằng thông báo. Bạn có thể muốn sử dụng cờ này tuỳ thuộc vào loại hoạt động mà bạn đang bắt đầu, có thể là một trong những loại sau:
Một hoạt động chỉ dành riêng cho việc phản hồi thông báo. Không có lý do gì khiến người dùng chuyển đến hoạt động này trong quá trình sử dụng ứng dụng bình thường, vì vậy, hoạt động này sẽ bắt đầu một tác vụ mới thay vì được thêm vào tác vụ và ngăn xếp lui hiện có của ứng dụng. Đây là loại ý định được tạo trong mẫu trước đó.
Một hoạt động có trong quy trình ứng dụng thông thường của ứng dụng. Trong trường hợp này, việc bắt đầu hoạt động sẽ tạo một ngăn xếp lui để người dùng có thể sử dụng nút Quay lại và nút Lên như mong đợi.
Hiện thông báo
Để thông báo xuất hiện, hãy gọi
NotificationManagerCompat.notify(), truyền cho thông báo đó một mã nhận dạng duy nhất cho
thông báo và kết quả của NotificationCompat.Builder.build(). Điều này được minh hoạ trong ví dụ sau:
with(NotificationManagerCompat.from(context)) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling ActivityCompat#requestPermissions here // to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(notificationId, builder.build())
Hãy lưu mã nhận dạng thông báo mà bạn truyền đến NotificationManagerCompat.notify(),
vì bạn cần mã này khi muốn cập nhật hoặc
xoá thông báo.
Ngoài ra, để kiểm thử các thông báo cơ bản trên thiết bị chạy Android 13 trở lên, hãy bật thông báo theo cách thủ công hoặc tạo một hộp thoại để yêu cầu thông báo.
Thêm các nút hành động
Một thông báo có thể cung cấp tối đa 3 nút hành động, cho phép người dùng phản hồi nhanh chóng, chẳng hạn như tạm ẩn lời nhắc hoặc trả lời tin nhắn văn bản. Tuy nhiên, các nút hành động này không được trùng lặp với thao tác được thực hiện khi người dùng nhấn vào thông báo.
Hình 3. Một thông báo có một nút hành động.
Để thêm một nút hành động, hãy truyền PendingIntent đến addAction()
phương thức. Thao tác này tương tự như việc thiết lập hành động mặc định khi nhấn vào thông báo. Tuy nhiên,
thay vì khởi chạy một hoạt động, bạn có thể làm những việc khác, chẳng hạn như bắt đầu một
BroadcastReceiver thực hiện một công việc ở chế độ nền để
thao tác này không làm gián đoạn ứng dụng đang mở.
Ví dụ: mã sau đây cho biết cách gửi một thông báo truyền tin đến một bộ nhận thông báo truyền tin cụ thể:
val ACTION_SNOOZE = "snooze" val snoozeIntent = Intent(context, MyBroadcastReceiver::class.java).apply { action = ACTION_SNOOZE putExtra(EXTRA_NOTIFICATION_ID, 0) } val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(context, 0, snoozeIntent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.snooze, context.getString(R.string.snooze), snoozePendingIntent)
Để biết thêm thông tin về cách tạo một BroadcastReceiver để chạy hoạt động ở chế độ nền, hãy xem bài viết Tổng quan về thông báo truyền tin.
Nếu bạn đang cố gắng tạo một thông báo có các nút phát nội dung nghe nhìn, chẳng hạn như nút tạm dừng và bỏ qua bản nhạc, hãy xem cách tạo một thông báo có các nút điều khiển nội dung nghe nhìn.
Thêm hành động để trả lời trực tiếp
Hành động trả lời trực tiếp (ra mắt trong Android 7.0 (API cấp 24)) cho phép người dùng nhập văn bản trực tiếp vào thông báo. Sau đó, văn bản sẽ được gửi đến ứng dụng của bạn mà không cần mở một hoạt động. Ví dụ: bạn có thể dùng hành động trả lời trực tiếp để người dùng có thể trả lời tin nhắn văn bản hoặc cập nhật danh sách việc cần làm ngay trong thông báo.
Hình 4. Khi nhấn vào nút "Trả lời", phương thức nhập văn bản sẽ mở ra.
Hành động trả lời trực tiếp xuất hiện dưới dạng một nút bổ sung trong thông báo, nút này sẽ mở một phương thức nhập văn bản. Khi người dùng nhập xong, hệ thống sẽ đính kèm phản hồi bằng văn bản này vào ý định mà bạn chỉ định cho thao tác của thông báo, sau đó gửi ý định đó đến ứng dụng của bạn.
Thêm nút trả lời
Để tạo một thao tác thông báo hỗ trợ tính năng trả lời trực tiếp, hãy làm theo các bước sau:
Tạo một thực thể của RemoteInput.Builder mà bạn có thể thêm vào thao tác thông báo. Hàm khởi tạo của lớp này chấp nhận một chuỗi mà hệ thống dùng làm khoá cho dữ liệu đầu vào văn bản. Sau đó, ứng dụng của bạn sẽ dùng khoá đó để truy xuất văn bản của dữ liệu đầu vào.
// Key for the string that's delivered in the action's intent. val replyLabel: String = context.resources.getString(R.string.reply_label) val remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
Tạo một PendingIntent cho thao tác trả lời.
// Build a PendingIntent for the reply action to trigger. val replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(context, conversationId, getMessageReplyIntent(conversationId), PendingIntent.FLAG_MUTABLE)
Đính kèm đối tượng RemoteInput vào một thao tác bằng cách sử dụng
addRemoteInput().
// Create the reply action and add the remote input. val action: NotificationCompat.Action = NotificationCompat.Action.Builder(R.drawable.reply, context.getString(R.string.reply_label), replyPendingIntent) .addRemoteInput(remoteInput) .build()
Áp dụng thao tác cho một thông báo và gửi thông báo đó.
// Build the notification and add the action.
val newMessageNotification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(context.getString(R.string.title))
.setContentText(context.getString(R.string.content))
.addAction(action)
.build()
// Issue the notification.
NotificationManagerCompat.from(context).notify(notificationId, newMessageNotification)
Hệ thống sẽ nhắc người dùng nhập câu trả lời khi họ kích hoạt thao tác thông báo, như minh hoạ trong hình 4.
Truy xuất hoạt động đầu vào của người dùng từ câu trả lời
Để nhận hoạt động đầu vào của người dùng từ giao diện người dùng trả lời của thông báo, hãy gọi
RemoteInput.getResultsFromIntent(), truyền cho thông báo đó Intent mà
của bạn BroadcastReceiver nhận được:
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
Sau khi xử lý văn bản, hãy cập nhật thông báo bằng cách gọi NotificationManagerCompat.notify() bằng cùng một mã nhận dạng và thẻ (nếu có). Điều này là cần thiết để ẩn giao diện trả lời trực tiếp và xác nhận với người dùng rằng câu trả lời của họ đã được nhận và xử lý chính xác.
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. val repliedNotification = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.message) .setContentText(context.getString(R.string.replied)) .build() // Issue the new notification. NotificationManagerCompat.from(context).notify(notificationId, repliedNotification)
Truy xuất dữ liệu khác
Việc xử lý các kiểu dữ liệu khác hoạt động tương tự như RemoteInput. Ví dụ sau đây sử dụng hình ảnh làm dữ liệu đầu vào.
val replyLabel: String = context.resources.getString(R.string.reply_label) val remoteInput: RemoteInput = RemoteInput.Builder(KEY_REPLY).run { setLabel(replyLabel) // Allow for image data types in the input. // This method can be used again to allow for other data types. setAllowDataType("image/*", true) build() }
Gọi RemoteInput#getDataResultsFromIntent và trích xuất dữ liệu tương ứng.
class ReplyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val dataResults = RemoteInput.getDataResultsFromIntent(intent, KEY_REPLY) val imageUri: Uri? = dataResults?.get("image/*") as? Uri if (imageUri != null) { // Extract the image context.contentResolver.openInputStream(imageUri)?.use { inputStream -> val bitmap = BitmapFactory.decodeStream(inputStream) // Display the image // ... } } } companion object { const val KEY_REPLY = "key_reply" const val KEY_TEXT_REPLY = "key_text_reply" } }
Khi làm việc với thông báo mới này, hãy sử dụng ngữ cảnh được truyền đến
phương thức onReceive() của bộ nhận tín hiệu truyền tin.
Nối câu trả lời vào cuối thông báo bằng cách gọi
setRemoteInputHistory(). Tuy nhiên, nếu bạn đang tạo một ứng dụng nhắn tin,
hãy tạo một thông báo theo kiểu nhắn tin và nối tin nhắn mới vào cuộc
trò chuyện.
Để biết thêm lời khuyên về thông báo từ ứng dụng nhắn tin, hãy xem phần về các phương pháp hay nhất cho ứng dụng nhắn tin.
Hiện thông báo khẩn cấp
Ứng dụng của bạn có thể cần hiển thị một thông báo khẩn cấp, nhạy cảm về thời gian, chẳng hạn như cuộc gọi điện thoại đến hoặc chuông báo đang đổ chuông. Trong những trường hợp này, bạn có thể liên kết một ý định toàn màn hình với thông báo của mình.
Khi thông báo được gọi, người dùng sẽ thấy một trong những dạng sau, tuỳ thuộc vào trạng thái khoá của thiết bị:
- Nếu thiết bị của người dùng bị khoá, một hoạt động toàn màn hình sẽ xuất hiện, bao phủ màn hình khoá.
- Nếu thiết bị của người dùng được mở khoá, thông báo sẽ xuất hiện ở dạng mở rộng, bao gồm các lựa chọn để xử lý hoặc đóng thông báo.
Đoạn mã sau đây minh hoạ cách liên kết thông báo của bạn với một ý định toàn màn hình:
val fullScreenIntent = Intent(context, ImportantActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(context, 0, fullScreenIntent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true)
Đặt chế độ hiển thị trên màn hình khoá
Để kiểm soát mức độ chi tiết hiển thị trong thông báo trên màn hình khoá,
hãy gọi setVisibility() và chỉ định một trong các giá trị sau:
VISIBILITY_PUBLIC: nội dung đầy đủ của thông báo sẽ xuất hiện trên màn hình khoá.VISIBILITY_SECRET: không có phần nào của thông báo xuất hiện trên màn hình khoá.VISIBILITY_PRIVATE: chỉ thông tin cơ bản, chẳng hạn như biểu tượng và tiêu đề nội dung của thông báo, xuất hiện trên màn hình khoá. Nội dung đầy đủ của thông báo sẽ không xuất hiện.
Khi bạn đặt VISIBILITY_PRIVATE, bạn cũng có thể cung cấp một phiên bản thay thế của nội dung thông báo để ẩn một số thông tin chi tiết. Ví dụ: một ứng dụng SMS có thể hiển thị thông báo cho biết "Bạn có 3 tin nhắn văn bản mới", nhưng ẩn nội dung và người gửi tin nhắn. Để cung cấp thông báo thay thế này, trước tiên, hãy tạo thông báo thay thế bằng NotificationCompat.Builder như bình thường. Sau đó, hãy đính kèm thông báo thay thế vào thông báo thông thường bằng setPublicVersion().
Xin lưu ý rằng người dùng luôn có quyền kiểm soát cuối cùng đối với việc thông báo của họ có xuất hiện trên màn hình khoá hay không, đồng thời có thể kiểm soát thông báo dựa trên các kênh thông báo của ứng dụng.
Cập nhật thông báo
Để cập nhật một thông báo sau khi gửi, hãy gọi lại NotificationManagerCompat.notify(), truyền cho thông báo đó cùng một mã nhận dạng mà bạn đã dùng trước đó. Nếu thông báo trước đó bị đóng, thì một thông báo mới sẽ được tạo thay thế.
Bạn có thể tuỳ ý gọi setOnlyAlertOnce() để thông báo của bạn
làm gián đoạn người dùng (bằng âm thanh, chế độ rung hoặc tín hiệu trực quan) chỉ trong
lần đầu tiên thông báo xuất hiện và không phải cho các lần cập nhật sau này.
Xoá thông báo
Thông báo vẫn xuất hiện cho đến khi một trong những trường hợp sau đây xảy ra:
- Người dùng đóng thông báo.
- Người dùng nhấn vào thông báo, nếu bạn gọi
setAutoCancel()khi tạo thông báo. - Bạn gọi
cancel()cho một mã nhận dạng thông báo cụ thể. Phương thức này cũng xoá các thông báo hiển thị liên tục. - Bạn gọi
cancelAll(), thao tác này sẽ xoá tất cả thông báo bạn đã gửi đi trước đó. - Thời gian đã chỉ định trôi qua, nếu bạn đặt thời gian chờ khi tạo thông báo, bằng cách sử dụng
setTimeoutAfter(). Nếu cần, bạn có thể huỷ một thông báo trước khi thời gian chờ đã chỉ định trôi qua.
Các phương pháp hay nhất cho ứng dụng nhắn tin
Hãy cân nhắc các phương pháp hay nhất được liệt kê ở đây khi tạo thông báo cho ứng dụng nhắn tin và trò chuyện.
Sử dụng MessagingStyle
Kể từ Android 7.0 (cấp độ API 24), Android cung cấp một mẫu kiểu thông báo dành riêng cho nội dung nhắn tin. Khi sử dụng lớp
NotificationCompat.MessagingStyle, bạn có thể thay đổi một số nhãn
hiển thị trên thông báo, bao gồm cả tiêu đề cuộc trò chuyện, các tin nhắn bổ sung
và khung hiển thị nội dung cho thông báo.
Đoạn mã sau đây minh hoạ cách tuỳ chỉnh kiểu của thông báo bằng cách sử dụng lớp MessagingStyle.
val message1 = NotificationCompat.MessagingStyle.Message( messages[0].text, messages[0].time, messages[0].sender ) val message2 = NotificationCompat.MessagingStyle.Message( messages[1].text, messages[1].time, messages[1].sender ) notification = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setStyle( NotificationCompat.MessagingStyle(Person.Builder().setName("Me").build()) .addMessage(message1) .addMessage(message2) ) .build()
Kể từ Android 9.0 (cấp độ API 28), bạn cũng phải sử dụng lớp
Person để hiển thị tối ưu thông báo
và hình đại diện của thông báo.
Khi sử dụng NotificationCompat.MessagingStyle, hãy làm như sau:
- Gọi
MessagingStyle.setConversationTitle()để đặt tiêu đề cho cuộc trò chuyện nhóm có từ 2 người trở lên. Tiêu đề cuộc trò chuyện phù hợp có thể là tên của cuộc trò chuyện nhóm hoặc nếu không có tên, thì đó là danh sách những người tham gia cuộc trò chuyện. Nếu không có thông tin này, tin nhắn có thể bị nhầm lẫn là thuộc về cuộc trò chuyện riêng tư với người gửi tin nhắn gần đây nhất trong cuộc trò chuyện. - Sử dụng phương thức
MessagingStyle.setData()để thêm các tin nhắn đa phương tiện chẳng hạn như hình ảnh. Các loại MIME của hình ảnh mẫu/* được hỗ trợ.
Sử dụng tính năng Trả lời trực tiếp
Tính năng Trả lời trực tiếp giúp người dùng trả lời từng dòng tin nhắn.
- Sau khi người dùng trả lời bằng thao tác trả lời trực tiếp, hãy dùng
MessagingStyle.addMessage()để cập nhậtMessagingStylethông báo và không rút lại hoặc huỷ thông báo. Việc không huỷ thông báo cho phép người dùng gửi nhiều câu trả lời từ thông báo. - Để làm cho thao tác trả lời trực tiếp tương thích với Wear OS, hãy gọi
Action.WearableExtender.setHintDisplayInlineAction(true). - Sử dụng phương thức
addHistoricMessage()để cung cấp bối cảnh cho cuộc trò chuyện có tính năng trả lời trực tiếp bằng cách thêm các tin nhắn trước đây vào thông báo.
Bật tính năng Trả lời thông minh
- Để bật tính năng Trả lời thông minh, hãy gọi
setAllowGeneratedResponses(true)trên thao tác trả lời. Thao tác này khiến các câu trả lời của tính năng Trả lời thông minh có sẵn cho người dùng khi thông báo được kết nối với thiết bị Wear OS. Các câu trả lời của tính năng Trả lời thông minh được tạo bởi một mô hình học máy được tích hợp hoàn toàn trên đồng hồ. Mô hình này sử dụng ngữ cảnh từ thông báoNotificationCompat.MessagingStylevà không có dữ liệu nào được tải lên Internet trong quá trình tạo câu trả lời.
Thêm siêu dữ liệu thông báo
- Chỉ định siêu dữ liệu thông báo để cho hệ thống biết cách xử lý thông báo của ứng dụng
khi thiết bị ở chế độ Không làm phiền. Ví
dụ: hãy sử dụng phương thức
addPerson()hoặcsetCategory(Notification.CATEGORY_MESSAGE)để ghi đè chế độ Không làm phiền.