Lớp học lập trình này nằm trong khoá học Kotlin nâng cao cho Android. Bạn sẽ nhận được nhiều giá trị nhất qua khoá học này nếu thực hiện các lớp học lập trình theo trình tự, nhưng đó không phải là yêu cầu bắt buộc. Tất cả các lớp học lập trình của khoá học đều được liệt kê trên trang đích của lớp học lập trình Kiến thức nâng cao về cách tạo ứng dụng Android bằng Kotlin.
Giới thiệu
Trong lớp học lập trình trước, bạn đã thêm thông báo vào đồng hồ hẹn giờ. Các thông báo này được tạo và kích hoạt trong ứng dụng của bạn. Một trường hợp sử dụng quan trọng khác của thông báo là gửi thông báo đẩy từ xa. Người dùng có thể nhận được thông báo đẩy ngay cả khi ứng dụng của bạn không chạy.
Thông báo đẩy là gì?
Thông báo đẩy là những thông báo mà máy chủ "đẩy" đến thiết bị di động. Chúng có thể được gửi đến một thiết bị bất kể ứng dụng của bạn có đang chạy hay không.
Thông báo đẩy là một cách hiệu quả để cho người dùng biết về một bản cập nhật hoặc nhắc họ về một việc cần làm hoặc tính năng. Hãy tưởng tượng bạn đang chờ một sản phẩm có hàng trở lại. Thông qua thông báo đẩy, ứng dụng mua sắm có thể cho bạn biết thông tin cập nhật về kho hàng thay vì bạn phải kiểm tra trạng thái kho hàng mỗi ngày.
Thông báo đẩy sử dụng mẫu xuất bản/đăng ký, cho phép các ứng dụng phụ trợ đẩy nội dung có liên quan đến những ứng dụng khách quan tâm. Nếu không có mô hình xuất bản/đăng ký, người dùng ứng dụng của bạn sẽ cần định kỳ kiểm tra các bản cập nhật trong ứng dụng. Đây là một quy trình tẻ nhạt và không đáng tin cậy đối với người dùng. Hơn nữa, khi số lượng ứng dụng tăng lên, những lần kiểm tra định kỳ này sẽ gây ra quá nhiều tải cho các tài nguyên xử lý và kết nối mạng, cả cho máy chủ của ứng dụng và cho thiết bị của người dùng.
Giống như tất cả các loại thông báo khác, hãy đảm bảo rằng bạn tôn trọng người dùng bằng thông báo đẩy. Nếu nội dung thông báo không thú vị hoặc không kịp thời đối với người dùng, họ có thể dễ dàng tắt tất cả thông báo của ứng dụng.
Giải pháp gửi thông báo qua đám mây của Firebase là gì?
Giải pháp gửi thông báo qua đám mây của Firebase là một phần của nền tảng Firebase để phát triển ứng dụng di động. Thông thường, bạn sẽ cần thiết lập một máy chủ từ đầu có thể giao tiếp với thiết bị di động để kích hoạt thông báo. Với Giải pháp gửi thông báo qua đám mây của Firebase, bạn có thể gửi thông báo đến tất cả người dùng đã cài đặt ứng dụng của bạn hoặc một nhóm nhỏ người dùng mà không cần thiết lập máy chủ. Ví dụ: bạn có thể gửi cho người dùng lời nhắc hoặc tặng họ một chương trình khuyến mãi đặc biệt, chẳng hạn như quà tặng miễn phí.Bạn có thể gửi thông báo từ xa đến một hoặc nhiều thiết bị.
Bạn cũng có thể sử dụng Giải pháp gửi thông báo qua đám mây của Firebase để chuyển dữ liệu từ ứng dụng phụ trợ hoặc từ một dự án Firebase đến người dùng.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng Giải pháp gửi thông báo qua đám mây của Firebase để gửi thông báo đẩy cho ứng dụng Android, cũng như gửi dữ liệu.
Nếu bạn gặp vấn đề (lỗi trong đoạn mã, lỗi ngữ pháp, từ ngữ không rõ ràng, v.v.) khi thực hành theo lớp học lập trình này, vui lòng báo cáo vấn đề thông qua đường liên kết Báo cáo lỗi ở góc dưới bên trái lớp học lập trình.
Kiến thức bạn cần có
Bạn cần thông thạo:
- Cách tạo ứng dụng Android bằng Kotlin. Đặc biệt là làm việc với SDK Android.
- Cách thiết kế ứng dụng bằng cách sử dụng các thành phần cấu trúc và liên kết dữ liệu.
- Có kiến thức cơ bản về broadcast receiver.
- Hiểu biết cơ bản về AlarmManager.
- Cách tạo và gửi thông báo bằng NotificationManager.
Kiến thức bạn sẽ học được
- Cách gửi thông báo đẩy cho người dùng thông qua Giải pháp gửi thông báo qua đám mây của Firebase.
- Cách gửi dữ liệu từ một phần phụ trợ đến ứng dụng của bạn bằng cách sử dụng thông báo dữ liệu, đây là một phần của Giải pháp gửi thông báo qua đám mây của Firebase.
Bạn sẽ thực hiện
- Thêm thông báo đẩy vào ứng dụng khởi động.
- Xử lý Giải pháp gửi thông báo qua đám mây của Firebase trong khi ứng dụng của bạn đang chạy.
- Chuyển dữ liệu bằng Giải pháp gửi thông báo qua đám mây của Firebase.
Trong lớp học lập trình này, bạn sẽ làm việc trên mã từ lớp học lập trình trước đó về cách Sử dụng thông báo trong ứng dụng Android. Trong lớp học lập trình trước, bạn đã tạo một ứng dụng hẹn giờ nấu trứng có thể gửi thông báo khi hết thời gian nấu. Trong lớp học lập trình này, bạn sẽ thêm Giải pháp gửi thông báo qua đám mây của Firebase để gửi thông báo đẩy cho người dùng ứng dụng nhằm nhắc họ ăn trứng.
Để lấy ứng dụng mẫu, bạn có thể:
Sao chép kho lưu trữ trên GitHub và chuyển sang nhánh starter:
$ git clone https://github.com/googlecodelabs/android-kotlin-notifications-fcm
Ngoài ra, bạn có thể tải kho lưu trữ xuống dưới dạng tệp Zip, giải nén rồi mở trong Android Studio.
Bước 1: Tạo dự án Firebase
Trước khi có thể thêm Firebase vào ứng dụng Android, bạn cần tạo một dự án Firebase để kết nối với ứng dụng Android của mình.
- Đăng nhập vào bảng điều khiển của Firebase.
- Nhấp vào Thêm dự án, rồi chọn hoặc nhập Tên dự án. Đặt tên cho dự án là fcm-codelab.
- Nhấp vào Tiếp tục.
- Bạn có thể bỏ qua bước thiết lập Google Analytics bằng cách tắt nút Bật Google Analytics cho dự án này .
- Nhấp vào Tạo dự án để hoàn tất việc thiết lập dự án Firebase.
Bước 2: Đăng ký ứng dụng của bạn với Firebase
Giờ đây, khi đã có một dự án Firebase, bạn có thể thêm ứng dụng Android của mình vào dự án đó.
- Ở giữa trang tổng quan về dự án của bảng điều khiển Firebase, hãy nhấp vào biểu tượng Android để chạy quy trình thiết lập.
- Trong trường Tên gói Android, hãy nhập
com.example.android.eggtimernotifications
. - Nhấp vào Đăng ký ứng dụng.
Lưu ý quan trọng: Hãy đảm bảo bạn nhập đúng mã nhận dạng cho ứng dụng của mình vì bạn không thể thêm hoặc sửa đổi giá trị này sau khi đăng ký ứng dụng với dự án Firebase.
Bước 3: Thêm tệp cấu hình Firebase vào dự án của bạn
Thêm tệp cấu hình Firebase Android vào ứng dụng của bạn.
- Nhấp vào Tải google-services.json xuống để lấy tệp cấu hình Firebase Android (
google-services.json
). Đảm bảo rằng tệp cấu hình không được thêm các ký tự khác và có tên chính xác làgoogle-services.json
. - Di chuyển tệp cấu hình vào thư mục mô-đun (cấp ứng dụng) của ứng dụng.
Bước 4: Định cấu hình dự án Android để bật các sản phẩm của Firebase
Để bật các sản phẩm của Firebase trong ứng dụng, bạn phải thêm trình bổ trợ google-services vào các tệp Gradle.
- Trong tệp Gradle cấp gốc (cấp dự án) (
build.gradle
), hãy kiểm tra để đảm bảo bạn có kho lưu trữ Maven của Google. - Sau đó, hãy thêm các quy tắc để đưa trình bổ trợ Dịch vụ Google vào.
build.gradle
buildscript {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
dependencies {
// ...
// Add the following line:
classpath 'com.google.gms:google-services:4.3.2' // Google Services plugin
}
}
allprojects {
// ...
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
// ...
}
}
- Trong tệp Gradle của mô-đun (cấp ứng dụng) (thường là
app/build.gradle
), hãy thêm một dòng để áp dụng trình bổ trợ vào cuối tệp.
app/build.gradle
apply plugin: 'com.android.application'
android {
// ...
}
// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services' // Google Play services Gradle plugin
Trong nhiệm vụ này, bạn sẽ thêm Giải pháp gửi thông báo qua đám mây của Firebase (FCM) vào dự án để tận dụng thông báo đẩy.
Mã dịch vụ Android cho FCM của lớp học lập trình này được cung cấp trong MyFirebaseMessagingService.kt
. Trong các bước sau, bạn sẽ thêm mã vào ứng dụng Android của mình.
Bạn sẽ sử dụng Trình soạn thông báo để kiểm thử quá trình triển khai. Công cụ soạn thông báo là một công cụ giúp bạn soạn và gửi thông báo từ trang web bảng điều khiển của Firebase.
- Mở
MyFirebaseMessagingService.kt
- Kiểm tra tệp và đặc biệt là các hàm sau:
onNewToken()
– Tự động được gọi nếu dịch vụ của bạn được đăng ký trong tệp kê khai Android. Hàm này được gọi khi bạn chạy ứng dụng lần đầu tiên và mỗi khi Firebase phát hành một mã thông báo mới cho ứng dụng của bạn. Mã thông báo là khoá truy cập vào dự án phụ trợ Firebase của bạn. Khoá này được tạo cho thiết bị khách cụ thể của bạn. Với mã thông báo này, Firebase biết máy khách nào mà phần phụ trợ nên gửi thông báo đến. Firebase cũng biết liệu ứng dụng này có hợp lệ và có quyền truy cập vào dự án Firebase này hay không.onMessageReceived
– Được gọi khi ứng dụng của bạn đang chạy và Firebase gửi một thông báo đến ứng dụng của bạn. Hàm này nhận một đối tượngRemoteMessage
có thể mang tải trọng thông báo hoặc thông báo dữ liệu. Bạn sẽ tìm hiểu thêm về sự khác biệt giữa thông báo và tải trọng thông báo dữ liệu trong phần sau của lớp học lập trình này.
Bước 1: Gửi thông báo FCM đến một thiết bị
Bảng điều khiển Thông báo cho phép bạn kiểm thử việc gửi thông báo. Để gửi thông báo đến một thiết bị cụ thể bằng bảng điều khiển, bạn cần biết mã thông báo đăng ký của thiết bị đó.
Khi phụ trợ Firebase tạo một mã thông báo mới hoặc làm mới mã thông báo, hàm onNewToken()
sẽ được gọi, với mã thông báo mới được truyền vào dưới dạng một đối số. Nếu muốn nhắm đến một thiết bị hoặc tạo một nhóm thiết bị mà bạn muốn gửi thông báo phát sóng, bạn sẽ cần truy cập vào mã thông báo này bằng cách mở rộng FirebaseMessagingService
và ghi đè onNewToken()
.
- Mở
AndroidManifest.xml
và bỏ chú thích đoạn mã sau để bậtMyFirebaseMessagingService
cho ứng dụng hẹn giờ. Siêu dữ liệu dịch vụ trong tệp kê khai Android sẽ đăng kýMyFirebaseMessagingService
làm dịch vụ và thêm một bộ lọc ý định để dịch vụ này nhận được các thông báo do FCM gửi. Phần cuối cùng của siêu dữ liệu khai báobreakfast_notification_channel_id
làdefault_notification_channel_id
cho Firebase. Bạn sẽ sử dụng mã nhận dạng này trong bước tiếp theo.
<!-- AndroidManifest.xml -->
<!-- TODO: Step 3.0 uncomment to start the service -->
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<!-- [START fcm_default_icon] -->
<!--
Set custom default icon. This is used when no icon is set for incoming notification messages.
See README(https://goo.gl/l4GJaQ) for more.
-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/common_google_signin_btn_icon_dark"/>
<!--
Set color used with incoming notification messages. This is used when no color is set for the incoming
notification message. See README(https://goo.gl/6BKBk7) for more.
-->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent"/> <!-- [END fcm_default_icon] -->
<!-- [START fcm_default_channel] -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/breakfast_notification_channel_id" />
<!-- [END fcm_default_channel] -->
Bạn nên tạo một kênh thông báo mới cho FCM vì người dùng có thể muốn bật/tắt riêng thông báo đẩy của FCM hoặc thông báo của bộ hẹn giờ.
- Mở
ui/EggTimerFragment.kt
. TrongonCreateView()
, hãy thêm mã tạo kênh sau đây.
// EggTimerFragment.kt
// TODO: Step 3.1 create a new channel for FCM
createChannel(
getString(R.string.breakfast_notification_channel_id),
getString(R.string.breakfast_notification_channel_name)
)
- Mở
MyFirebaseMessagingService.kt
và bỏ chú thích hàmonNewToken()
. Hàm này sẽ được gọi khi một mã thông báo mới được tạo.
// MyFirebaseMessagingService.kt
// TODO: Step 3.2 log registration token
// [START on_new_token]
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the
* InstanceID token is initially generated so this is where you would retrieve
* the token.
*/
override fun onNewToken(token: String?) {
Log.d(TAG, "Refreshed token: $token")
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(token)
}
// [END on_new_token]
- Chạy ứng dụng hẹn giờ luộc trứng.
- Quan sát logcat (View > Tool Windows > Logcat). Bạn sẽ thấy một dòng nhật ký cho biết mã thông báo của bạn, tương tự như dòng nhật ký bên dưới. Đây là mã thông báo bạn cần để gửi tin nhắn đến thiết bị này. Hàm này chỉ được gọi khi một mã thông báo mới được tạo.
2019-07-23 13:09:15.243 2312-2459/com.example.android.eggtimernotifications D/MyFirebaseMsgService: Refreshed token: f2esflBoQbI:APA91bFMzNNFaIskjr6KIV4zKjnPA4hxekmrtbrtba2aDbh593WQnm11ed54Mv6MZ9Yeerver7pzgwfKx7R9BHFffLBItLEgPvrtF0TtX9ToCrXZ5y7Hd-m
Lưu ý: Nếu không thấy mã thông báo trong thông báo logcat, có thể ứng dụng của bạn đã nhận được mã thông báo này trước đó. Trong trường hợp đó, việc gỡ cài đặt ứng dụng sẽ giúp bạn nhận được mã thông báo mới.
Giờ đây, bạn có thể kiểm thử bằng cách gửi một thông báo. Để gửi thông báo, bạn sẽ sử dụng Trình soạn thông báo.
- Mở Bảng điều khiển của Firebase rồi chọn dự án của bạn.
- Tiếp theo, hãy chọn Cloud Messaging (Nhắn tin qua đám mây) trong trình đơn điều hướng ở bên trái.
- Nhấp vào Gửi tin nhắn đầu tiên.
- Nhập
Time for Breakfast!
làm tiêu đề thông báo vàDon't forget to eat eggs!
làm nội dung thông báo, rồi chọn Gửi thông báo thử nghiệm. Hộp thoại bật lên Test on device (Thử nghiệm trên thiết bị) sẽ xuất hiện, yêu cầu bạn cung cấp mã thông báo đăng ký FCM.
- Sao chép mã thông báo ứng dụng của bạn từ logcat.
- Dán mã thông báo này vào trường Thêm mã thông báo đăng ký FCM trong cửa sổ bật lên, rồi nhấp vào nút Thêm bên cạnh mã thông báo.
- Trong danh sách hộp đánh dấu xuất hiện, hãy chọn mã thông báo. Nút Kiểm thử sẽ được bật.
- Trên thiết bị, hãy chuyển ứng dụng Đồng hồ hẹn giờ sang chế độ nền.
- Trong cửa sổ bật lên, hãy nhấp vào Kiểm thử.
- Sau khi bạn nhấp vào Kiểm thử, thiết bị đích đang chạy ứng dụng của bạn ở chế độ nền sẽ nhận được thông báo trong khay thông báo hệ thống. (Sau này, bạn sẽ thấy thêm thông tin về cách xử lý thông báo FCM khi ứng dụng đang chạy trên nền trước.)
Việc cần làm: Gửi thông báo FCM đến một chủ đề
Tính năng gửi thông báo theo chủ đề của FCM dựa trên mô hình xuất bản/đăng ký.
Ứng dụng nhắn tin có thể là một ví dụ điển hình cho mô hình Publish/Subscribe. Giả sử một ứng dụng kiểm tra thư mới sau mỗi 10 giây. Việc này không chỉ làm hao pin điện thoại mà còn sử dụng tài nguyên mạng không cần thiết và tạo ra tải không cần thiết trên máy chủ của ứng dụng. Thay vào đó, thiết bị của khách hàng có thể đăng ký và nhận thông báo khi có tin nhắn mới được gửi qua ứng dụng của bạn.
Chủ đề cho phép bạn gửi một thông báo đến nhiều thiết bị đã chọn nhận thông báo về chủ đề cụ thể đó. Đối với các ứng dụng, chủ đề là những nguồn dữ liệu cụ thể mà ứng dụng quan tâm. Đối với máy chủ, chủ đề là các nhóm thiết bị đã chọn nhận thông tin cập nhật về một nguồn dữ liệu cụ thể. Bạn có thể dùng các chủ đề để trình bày các danh mục thông báo, chẳng hạn như tin tức, dự báo thời tiết và kết quả thể thao. Trong phần này của lớp học lập trình, bạn sẽ tạo một chủ đề "bữa sáng" để nhắc nhở những người dùng ứng dụng quan tâm ăn trứng vào bữa sáng.
Để đăng ký một chủ đề, ứng dụng khách sẽ gọi hàm subscribeToTopic(
)
của Giải pháp gửi thông báo qua đám mây của Firebase bằng tên chủ đề breakfast
. Lệnh gọi này có thể có 2 kết quả. Nếu người gọi thành công, lệnh gọi lại OnCompleteListener
sẽ được gọi bằng thông báo đã đăng ký. Nếu không đăng ký được, lệnh gọi lại sẽ nhận được một thông báo lỗi.
Trong ứng dụng của bạn, người dùng sẽ tự động đăng ký theo dõi chủ đề bữa sáng. Tuy nhiên, trong hầu hết các ứng dụng phát hành công khai, tốt hơn hết là bạn nên cho phép người dùng kiểm soát những chủ đề mà họ muốn đăng ký nhận thông báo.
- Mở
EggTimerFragment.kt
rồi tìm hàmsubscribeTopic()
trống. - Lấy một thực thể của
FirebaseMessaging
và gọi hàmsubscibeToTopic()
bằng tên chủ đề. - Thêm một
addOnCompleteListener
để nhận thông báo từ FCM về việc đăng ký của bạn có thành công hay không.
// EggTimerFragment.kt
// TODO: Step 3.3 subscribe to breakfast topic
private fun subscribeTopic() {
// [START subscribe_topics]
FirebaseMessaging.getInstance().subscribeToTopic(TOPIC)
.addOnCompleteListener { task ->
var msg = getString(R.string.message_subscribed)
if (!task.isSuccessful) {
msg = getString(R.string.message_subscribe_failed)
}
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
}
// [END subscribe_topics]
}
- Gọi hàm
subscribeTopic()
để đăng ký theo dõi một chủ đề khi ứng dụng khởi động. Di chuyển lênonCreateView()
rồi thêm lệnh gọi đếnsubscribeTopic()
.
// EggTimerFragment.kt
// TODO: Step 3.4 call subscribe topics on start
subscribeTopic()
return binding.root
- Để đăng ký theo dõi chủ đề bữa sáng, hãy chạy lại ứng dụng. Bạn sẽ thấy một thông báo dạng nổi có nội dung "Đã đăng ký theo dõi chủ đề".
Giờ đây, bạn có thể kiểm thử việc gửi thông báo đến một chủ đề:
- Mở Trình soạn thông báo rồi chọn Soạn thông báo.
- Đặt Tiêu đề thông báo và Văn bản thông báo như trước.
- Lần này, thay vì gửi thông báo đến một thiết bị, hãy nhấp vào Topic (Chủ đề) trong mục Target (Mục tiêu) rồi nhập
breakfast
làm chủ đề thông báo.
- Chọn Ngay bây giờ để lên lịch.
- Đảm bảo ứng dụng của bạn đang chạy ở chế độ nền trên thiết bị kiểm thử.
- Nhấp vào Xem lại, rồi nhấp vào Xuất bản. Nếu có thể chạy ứng dụng trên nhiều thiết bị, bạn có thể kiểm thử và quan sát thấy thông báo được nhận trên tất cả các thiết bị đã đăng ký theo dõi chủ đề này.
Hiện tại, ứng dụng có các kênh sau đây để gửi thông báo: Egg và Breakfast. Trên thiết bị của khách hàng, hãy nhấp và giữ biểu tượng ứng dụng, chọn Thông tin rồi nhấp vào Thông báo. Bạn sẽ thấy các kênh thông báo Egg (Trứng) và Breakfast (Bữa sáng) như trong ảnh chụp màn hình sau. Nếu bạn bỏ chọn kênh Breakfast (Bữa sáng), ứng dụng của bạn sẽ không nhận được bất kỳ thông báo nào được gửi qua kênh này.
Khi sử dụng thông báo, hãy luôn nhớ rằng người dùng có thể tắt bất kỳ kênh thông báo nào bất cứ lúc nào.
Bước 1: Thông báo dữ liệu
Thông báo FCM cũng có thể chứa tải trọng dữ liệu xử lý thông báo trong ứng dụng khách, sử dụng thông báo dữ liệu thay vì thông báo.
Để xử lý thông báo dữ liệu, bạn cần xử lý tải trọng dữ liệu trong hàm onMessageReceived()
của MyFirebaseMessagingService
. Tải trọng được lưu trữ trong thuộc tính data
của đối tượng remoteMessage
. Cả đối tượng remoteMessage
và thuộc tính data
đều có thể là null
.
- Mở
MyFirebaseMessagingService.
- Kiểm tra xem thuộc tính
data
của đối tượngremoteMessage
có giá trị nào không và in dữ liệu vào nhật ký.
// MyFirebaseMessagingService.kt
// [START receive_message]
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
Log.d(TAG, "From: ${remoteMessage?.from}")
// TODO: Step 3.5 check messages for data
// Check if the message contains a data payload.
remoteMessage?.data?.let {
Log.d(TAG, "Message data payload: " + remoteMessage.data)
}
}
// [END receive_message]
Để kiểm thử mã, bạn có thể sử dụng lại Trình soạn thông báo.
- Mở Trình soạn thông báo, tạo một thông báo mới và đặt Mục tiêu của thông báo đó thành chủ đề "bữa sáng".
- Lần này, khi bạn chuyển đến Bước 4, Lựa chọn bổ sung, hãy đặt các thuộc tính khoá và giá trị Dữ liệu tuỳ chỉnh như sau:
- Khoá:
eggs
- Giá trị:
3
- Đảm bảo ứng dụng của bạn đang chạy ở nền trước. Nếu ứng dụng của bạn đang chạy trong nền, thông báo FCM sẽ kích hoạt một thông báo tự động và hàm
onMessageReceived()
sẽ chỉ nhận được đối tượngremoteMessage
khi người dùng nhấp vào thông báo. - Gửi thông báo từ trình soạn thông báo và quan sát nhật ký thông báo dữ liệu xuất hiện trong logcat.
Bước 2: Xử lý thông báo ở nền trước và nền sau
Khi một thiết bị khách đang chạy ứng dụng của bạn nhận được một thông báo bao gồm cả tải trọng thông báo và dữ liệu, hành vi của ứng dụng sẽ phụ thuộc vào việc ứng dụng của bạn đang ở chế độ nền hay nền trước trên thiết bị đó:
- Nếu ứng dụng đang chạy ở chế độ nền, nếu thông báo có tải trọng thông báo, thì thông báo sẽ tự động xuất hiện trong khay thông báo. Nếu thông báo cũng có tải trọng dữ liệu, thì tải trọng dữ liệu sẽ được ứng dụng xử lý khi người dùng nhấn vào thông báo.
- Nếu ứng dụng đang chạy ở nền trước, nếu thông báo tin nhắn có tải trọng thông báo, thì thông báo sẽ không tự động xuất hiện. Ứng dụng cần quyết định cách xử lý thông báo trong hàm
onMessageReceived()
. Nếu thông báo cũng có tải trọng dữ liệu, thì cả hai tải trọng sẽ được ứng dụng xử lý.
Để phục vụ cho mục đích của lớp học lập trình này, bạn muốn nhắc người dùng ứng dụng ăn trứng vào bữa sáng. Bạn không có ý định gửi bất kỳ dữ liệu nào, nhưng bạn cũng muốn đảm bảo thông báo nhắc nhở luôn xuất hiện, bất kể ứng dụng ở nền trước hay nền sau.
Khi bạn gửi một thông báo FCM đến các thiết bị đã cài đặt ứng dụng hẹn giờ, thông báo sẽ tự động xuất hiện nếu ứng dụng không chạy hoặc đang chạy trong nền. Tuy nhiên, nếu ứng dụng đang chạy ở nền trước, thì thông báo sẽ không tự động xuất hiện; thay vào đó, mã của ứng dụng sẽ quyết định việc cần làm với thông báo. Nếu ứng dụng đang ở chế độ nền trước khi nhận được một thông báo FCM, thì hàm onMessageReceived()
sẽ tự động được kích hoạt cùng với thông báo FCM. Đây là nơi ứng dụng của bạn có thể âm thầm xử lý thông báo và tải trọng dữ liệu hoặc kích hoạt một thông báo.
Đối với ứng dụng của bạn, bạn cần đảm bảo người dùng nhận được lời nhắc khi ứng dụng ở nền trước. Vì vậy, hãy triển khai một số mã để kích hoạt thông báo:
- Mở lại hàm
onMessageReceived()
trongMyFirebaseMessagingService
. - Ngay sau đoạn mã mà bạn vừa thêm để kiểm tra thông báo dữ liệu, hãy thêm đoạn mã sau để gửi thông báo bằng khung thông báo.
// MyFirebaseMessagingService.kt
// TODO: Step 3.6 check messages for notification and call sendNotification
// Check if the message contains a notification payload.
remoteMessage.notification?.let {
Log.d(TAG, "Message Notification Body: ${it.body}")
sendNotification(it.body as String)
}
- Nếu chạy lại ứng dụng và gửi thông báo bằng Notifications composer, bạn sẽ thấy một thông báo giống như thông báo bạn từng thấy trong phần đầu tiên của lớp học lập trình, bất kể ứng dụng đang ở nền trước hay nền sau.
Đoạn mã giải pháp nằm trong nhánh chính của mã đã tải xuống.
- Triển khai FCM BroadcastReceiver bằng cách mở rộng
FirebaseMessagingService
. - Thiết lập một dự án Giải pháp gửi thông báo qua đám mây của Firebase (FCM) và thêm FCM vào ứng dụng Android của bạn.
- Kiểm thử ứng dụng của bạn bằng cách gửi thông báo đẩy từ Trình soạn thông báo.
- Đăng ký nhận topic của FCM bằng cách gọi hàm
subscribeToTopic()
của lớpFirebaseMessaging
. - Gửi một tải trọng dữ liệu bằng cách sử dụng đối tượng
RemoteMessage
. - Xử lý dữ liệu trong hàm
onMessageReceived()
. - Thêm logic để xử lý FCM khi ứng dụng đang chạy ở nền trước và khi ứng dụng đang chạy ở nền sau.
Khoá học của Udacity:
Tài liệu về Firebase:
Để biết đường liên kết đến các lớp học lập trình khác trong khoá học này, hãy xem trang đích của các lớp học lập trình trong khoá học Kiến thức nâng cao về cách tạo ứng dụng Android bằng Kotlin.