Android nâng cao trong Kotlin 01.2: Giải pháp gửi thông báo qua đám mây của Android cho Firebase

Lớp học lập trình này nằm trong khóa học Nâng cao về Android trong Kotlin. Bạn sẽ nhận được nhiều giá trị nhất từ khóa học này nếu bạn làm việc qua các lớp học lập trình theo trình tự, nhưng bạn không bắt buộc phải làm vậy. Tất cả các lớp học lập trình đều có trên trang đích của các lớp học lập trình Android nâng cao trong Kotlin.

Giới thiệu

Trong lớp học lập trình trước đây, bạn đã thêm các thông báo vào đồng hồ hẹn giờ trứng được tạo và kích hoạt trong ứng dụng của mình. Một trường hợp sử dụng thông báo quan trọng khác là gửi thông báo đẩy từ xa mà có thể nhận được 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à các thông báo mà máy chủ "pushes" chuyển đến thiết bị di động. Các ứng dụng này có thể được phân phối tới 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 tuyệt vời để cho người dùng biết về thông tin cập nhật hoặc nhắc họ về một việc cần làm hay một tính năng. Hãy tưởng tượng bạn đang chờ sản phẩm còn hàng. Thông báo đẩy, ứng dụng mua sắm có thể cho bạn biết về thông tin cập nhật cổ phiếu thay vì bạn phải kiểm tra trạng thái cổ phiếu mỗi ngày.

Thông báo đẩy sử dụng mẫu xuất bản/đăng ký, cho phép ứng dụng phụ trợ đẩy nội dung có liên quan đến các khách hàng có 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 phải kiểm tra định kỳ các bản cập nhật trong ứng dụng của bạn. Đây là một quá trình nhàm chán và không đáng tin cậy đối với người dùng. Hơn nữa, khi số lượng máy khách tăng lên, các bước kiểm tra định kỳ này sẽ tạo ra một khối lượng lớn 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 kịp thời cho người dùng, họ có thể dễ dàng tắt tất cả các thông báo từ ứng dụng của bạn.

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 dành cho việc phát triển thiết bị di động. Thông thường, bạn cần phải 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 cho tất cả người dùng đã cài đặt hoặc một số ít người dùng ứng 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 đưa ra khuyến mãi đặc biệt, chẳng hạn như quà tặng miễn phí.Bạn có thể đẩy thông báo từ xa đến một thiết bị hoặc nhiều thiết bị.

Bạn cũng có thể sử dụng Firebase Cloud Messages để chuyển dữ liệu từ ứng dụng phụ trợ hoặc từ dự án Firebase sang người dùng của mình.

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 phải bất kỳ vấn đề nào (lỗi mã, lỗi ngữ pháp, từ ngữ không rõ ràng, v.v.) khi bạn làm việc qua lớp học lập trình này, vui lòng báo cáo vấn đề qua liên kết Báo cáo lỗi ở góc dưới bên trái của 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 các ứng dụng Android trong Kotlin. Cụ thể, bạn nên sử dụng SDK Android.
  • Cách thiết kế ứng dụng của bạn bằng các thành phần cấu trúc và liên kết dữ liệu.
  • Hiểu biết cơ bản về bộ thu phát sóng.
  • Thông tin cơ bản về AlarmManager.
  • Cách tạo và gửi thông báo bằng Trình quản lý thông báo.

Kiến thức bạn sẽ học được

  • Cách đẩy thông báo cho người dùng qua Firebase Cloud Messaging.
  • Cách gửi dữ liệu từ phần phụ trợ đến ứng dụng của bạn bằng thông báo dữ liệu. Đây là một phần trong tính năng Nhắn tin 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 dành cho người mới bắt đầu.
  • 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ẽ tìm hiểu về mã trong lớp học lập trình 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 đây, bạn đã xây dựng một ứng dụng hẹn giờ trứng gửi thông báo khi hết giờ hẹn giờ nấu. Trong lớp học lập trình này, bạn sẽ thêm tính năng Nhắn tin qua đám mây của Firebase để gửi thông báo đẩy cho người dùng ứng dụng của bạn để nhắc họ ăn trứng.

Để tải ứng dụng mẫu, bạn có thể:

Sao chép kho lưu trữ từ GitHub và chuyển sang nhánh start:

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications-fcm


Hoặc bạn có thể tải tệp lưu trữ xuống dưới dạng tệp Zip, giải nén và mở tệp đó trong Android Studio.

Tải tệp zip xuống

Bước 1: Tạo một dự án Firebase

Để 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.

  1. Đăng nhập vào bảng điều khiển của Firebase.
  2. Nhấp vào Thêm dự án, sau đó chọn hoặc nhập Tên dự án. Đặt tên cho dự án là fcm-codelab.
  3. Nhấp vào Tiếp tục.
  4. 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.
  5. Nhấp vào Tạo dự án để hoàn tất quá trình thiết lập dự án Firebase.

Bước 2: Đăng ký ứng dụng của bạn với Firebase

Bây giờ, bạn đã có một dự án Firebase và có thể thêm ứng dụng Android đó vào dự án đó.

  1. Ở giữa trang Tổng quan về dự án trên bảng điều khiển của Firebase, hãy nhấp vào biểu tượng Android để chạy quy trình thiết lập.

  1. Trong trường Tên gói Android, hãy nhập com.example.android.eggtimernotifications.
  2. Nhấp vào Đăng ký ứng dụng.

Quan trọng: Đả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

Thêm tệp cấu hình Android trên Firebase vào ứng dụng của bạn.

  1. Nhấp vào Tải google-services.json xuống để tải tệp cấu hình Android trên Firebase của bạn (google-services.json). Đảm bảo tệp cấu hình không được nối với ký tự bổ sung và được đặt tên chính xác là google-services.json.
  2. 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 sản phẩm Firebase trong ứng dụng của mình, bạn phải thêm trình bổ trợ google-services vào các tệp trong Gradle.

  1. Trong tệp Gradle cấp gốc (cấp dự án) (build.gradle), hãy kiểm tra để đảm bảo rằng bạn có kho lưu trữ Maven của Google.
  2. Sau đó, hãy thêm các quy tắc để đưa trình bổ trợ Dịch vụ của 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
    // ...
  }
}
  1. Trong tệp Gradle 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ợ đó ở 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 tính năng Nhắn tin qua đám mây của Firebase (FCM) vào dự án của mình để sử dụng thông báo đẩy.

Mã dịch vụ Android dành cho FCM của lớp học lập trình này được cung cấp bằng MyFirebaseMessagingService.kt. Trong các bước sau đây, 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 tra việc triển khai của mình. Trình soạn thông báo là 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.

  1. Mở MyFirebaseMessagingService.kt
  2. Kiểm tra tệp và cụ thể là các chức năng 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. Chức năng này được gọi khi bạn chạy ứng dụng của mình lần đầu tiên và mỗi lần Firebase cấp một mã thông báo mới cho ứng dụng của bạn. Mã thông báo là khóa truy cập vào dự án phụ trợ Firebase của bạn. Mã đượ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 sẽ biết ứng dụng phụ trợ cần gửi thông báo đến ứng dụng nào. Firebase cũng biết xem ứng dụng này có hợp lệ không 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 được một đối tượng RemoteMessage có thể tải thông báo hoặc tải trọng tin nhắn dữ liệu. Bạn sẽ tìm hiểu thêm về sự khác biệt giữa tải trọng thông báo và tải dữ liệu dữ liệu sau này trong 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ị duy nhất

Bảng điều khiển Thông báo cho phép bạn thử nghiệm 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ã đăng ký của thiết bị đó.

Khi phần phụ trợ của Firebase tạo một mã thông báo mới hoặc được làm mới, hàm onNewToken() sẽ được gọi, với mã thông báo mới được chuyển vào làm đối số. Nếu bạn muốn nhắm mục tiêu đến một thiết bị hoặc tạo một nhóm thiết bị mà bạn muốn gửi tin nhắn quảng bá, 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().

  1. Mở AndroidManifest.xml và bỏ nhận xét mã sau để bật MyFirebaseMessagingService cho ứng dụng hẹn giờ trứng. Siêu dữ liệu dịch vụ trong tệp kê khai Android đăng ký MyFirebaseMessagingService dưới dạng dịch vụ và thêm bộ lọc ý định để dịch vụ này sẽ nhận thông báo được gửi từ FCM. Phần cuối cùng của siêu dữ liệu khai báo breakfast_notification_channel_iddefault_notification_channel_id cho Firebase. Bạn sẽ dùng mã 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ủa bạn có thể muốn bật/tắt bộ tính giờ trứng hoặc thông báo đẩy FCM riêng biệt.

  1. Mở ui/EggTimerFragment.kt . Trong onCreateView(), hãy thêm mã tạo kênh sau.
// 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)
    )
  1. Mở MyFirebaseMessagingService.kt và bỏ nhận xét hàm onNewToken(). 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]
  1. Chạy ứng dụng hẹn giờ trứng.
  2. Quan sát logcat (Xem > Công cụ Windows và gt; Logcat). Bạn sẽ thấy một dòng nhật ký hiển thị mã thông báo của mình tương tự như mã bên dưới. Đây là mã thông báo bạn cần để gửi tin nhắn tới 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 bạn không thấy mã thông báo trong thông báo logcat, thì có thể ứng dụng của bạn đã nhận được mã thông báo này trước đây. Trong trường hợp đó, việc gỡ cài đặt ứng dụng sẽ giúp bạn nhận được một mã thông báo mới.

Giờ đây, bạn có thể thử nghiệm bằng cách gửi thông báo. Để gửi thông báo, bạn sẽ dùng Trình soạn thông báo.

  1. Mở Bảng điều khiển của Firebase và chọn dự án của bạn.
  2. Tiếp theo, chọn Nhắn tin qua đám mây từ trình đơn bên trái.
  3. Nhấp vào Gửi tin nhắn đầu tiên.

  1. 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 và chọn Gửi tin nhắn thử nghiệm. Hộp thoại bật lên Thử nghiệm trên thiết bị xuất hiện, yêu cầu bạn cung cấp mã đăng ký FCM.

  1. Sao chép mã thông báo ứng dụng của bạn từ logcat.

  1. Dán mã thông báo này vào trường Thêm mã đăng ký FCM trong cửa sổ bật lên, sau đó nhấp vào nút Thêm bên cạnh mã thông báo.
  2. 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 tra sẽ được bật.

  1. Trên thiết bị của bạn, hãy đặt ứng dụng Hẹn giờ trứng vào nền.
  2. Trong cửa sổ bật lên, hãy nhấp vào Kiểm tra.
  1. Sau khi bạn nhấp vào Thử nghiệm, thiết bị khách được nhắm mục tiêu chạy ứng dụng trong nền sẽ nhận được thông báo trong khay thông báo của hệ thống. (Bạn sẽ thấy thêm thông tin về cách xử lý thông báo FCM khi ứng dụng của bạn chạy ở nền trước.)

Việc cần làm: Gửi thông báo FCM đến một chủ đề

Thông điệp theo chủ đề 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 Xuất bản/Đăng ký. Hãy tưởng tượng rằng ứng dụng kiểm tra tin nhắn mới 10 giây một lần. Việc này không chỉ làm tiêu hao pin của điện thoại mà còn sử dụng các tài nguyên mạng không cần thiết và sẽ 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ị khách 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 tin nhắn đến nhiều thiết bị đã chọn tham gia chủ đề cụ thể đó. Đối với khách hàng, chủ đề là các nguồn dữ liệu cụ thể mà họ 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. Đối với 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; bữa sáng&chủ đề để nhắc những người dùng ứng dụng quan tâm ăn trứng với bữa sáng.

Để đăng ký một chủ đề, ứng dụng ứng dụng sẽ gọi hàm Firebase Cloud Messaging subscribeToTopic() có tên chủ đề breakfast. Cuộc gọi này có thể có hai 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 tin nhắn đã đăng ký. Nếu ứng dụng không đăng ký được, lệnh gọi lại sẽ nhận được thông báo lỗi.

Trong ứng dụng của mình, bạn sẽ tự động đăng ký người dùng cho chủ đề bữa sáng. Tuy nhiên, trong hầu hết các ứng dụng sản xuất, người dùng nên kiểm soát chủ đề mà họ muốn đăng ký.

  1. Mở EggTimerFragment.kt rồi tìm hàm subscribeTopic() trống.
  2. Nhận bản sao của FirebaseMessaging và gọi hàm subscibeToTopic() có tên chủ đề.
  3. Thêm addOnCompleteListener để nhận thông báo lại từ FCM về việc gói thuê bao 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]
    }
  1. Gọi hàm subscribeTopic() để đăng ký một chủ đề khi ứng dụng khởi động. Cuộn đến onCreateView() và thêm cuộc gọi vào subscribeTopic().
// EggTimerFragment.kt

   // TODO: Step 3.4 call subscribe topics on start
    subscribeTopic()

    return binding.root
  1. Để đăng ký chủ đề bữa sáng, hãy chạy lại ứng dụng. Bạn sẽ thấy thông báo ngắn chúc mừng bạn đã đăng ký chủ đề &đã đăng ký.

Giờ đây, bạn có thể thử gửi tin nhắn đến một chủ đề:

  1. Mở Trình soạn thông báo rồi chọn Soạn thông báo.
  2. Đặt Tiêu đề thông báoVăn bản thông báo như trước đây.
  3. Lần này, thay vì gửi tin nhắn đến một thiết bị, hãy nhấp vào Chủ đề trong mục Nhắm mục tiêu và nhập breakfast làm chủ đề tin nhắn.

  1. Chọn Ngay bây giờ để lên lịch.

  1. Đảm bảo ứng dụng của bạn đang chạy ở chế độ nền trên thiết bị thử nghiệm.
  1. Nhấp vào Xem lại, sau đó 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 tra và quan sát thấy rằng thông báo được nhận trên tất cả các thiết bị đã đăng ký chủ đề này.

Hiện tại, ứng dụng có các kênh sau để nhận thông báo: EggBữa sáng. Trên thiết bị khách, 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 EggBữa sáng, như minh họa trong ảnh chụp màn hình sau đây. Nếu bạn bỏ chọn kênh 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, 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 kỳ lúc nào.

Bước 1: Thông báo dữ liệu

Tin nhắn FCM cũng có thể chứa phần dữ liệu xử lý tin nhắn trong ứng dụng khách, sử dụng tin nhắn dữ liệu thay vì tin nhắn thông báo.

Để xử lý thông báo dữ liệu, bạn cần xử lý phần tải dữ liệu trong hàm onMessageReceived() của MyFirebaseMessagingService. Phần dữ liệu thực tế đượ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.

  1. Mở MyFirebaseMessagingService.
  2. Kiểm tra xem thuộc tính data của đối tượng remoteMessage 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 tra mã của mình, bạn có thể sử dụng lại Trình soạn thông báo.

  1. Mở trình soạn thư Thông báo, tạo tin nhắn mới, đặt Mục tiêu thành chủ đề "breakfast".
  2. Lần này, khi bạn chuyển đến Bước 4, Tùy chọn bổ sung, hãy đặt khóa và thuộc tính giá trị Dữ liệu tùy chỉnh như sau:
  1. Khóa: eggs
  2. Giá trị: 3

  1. Hãy đả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 chạy ở chế độ nền, thì thông báo FCM sẽ kích hoạt thông báo tự động và hàm onMessageReceived() sẽ chỉ nhận đối tượng remoteMessage khi người dùng nhấp vào thông báo.
  2. Gửi tin nhắn từ trình soạn Thông báo và quan sát nhật ký tin nhắn 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 chạy ứng dụng của bạn nhận được thông báo chứa cả tải trọng thông báo và dữ liệu, hành vi của ứng dụng phụ thuộc vào việc ứng dụng của bạn chạy ở 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 tin nhắn có nội dung thông báo, thì thông báo sẽ tự động hiển thị trong khay thông báo. Nếu tin nhắn cũng có phần dữ liệu tải trọng, thì ứng dụng sẽ xử lý tải trọng dữ liệu khi người dùng nhấn vào thông báo.
  • Nếu ứng dụng đang chạy trên nền trước, nếu thông báo tin nhắn có nội dung thông báo, thì thông báo sẽ không tự động xuất hiện. Ứng dụng này cần quyết định cách xử lý thông báo trong hàm onMessageReceived(). Nếu ứng dụng cũng có phần dữ liệu tải xuống, cả hai tải trọng sẽ được ứng dụng xử lý.

Để phục vụ cho lớp học lập trình này, bạn cần nhắc người dùng ứng dụng ăn một số quả trứng vào bữa sáng. Bạn không dự định gửi bất kỳ dữ liệu nào nhưng cũng muốn đảm bảo rằng thông báo lời nhắc luôn xuất hiện, bất kể ứng dụng đó chạy ở nền trước hay nền.

Khi bạn gửi tin nhắn FCM đến các thiết bị đã cài đặt ứng dụng hẹn giờ trứng, thông báo thông báo sẽ tự động hiển thị nếu ứng dụng không chạy hoặc chạy ở chế độ 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 hiển thị; 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 chạy ở nền trước khi nhận được thông báo FCM, 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ể xử lý thông báo và tải dữ liệu một cách im lặng hoặc kích hoạ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 chạy trên nền trước, do đó, hãy triển khai một số mã để kích hoạt thông báo:

  1. Mở lại hàm onMessageReceived() trong MyFirebaseMessagingService.
  2. Ngay sau khi mã mà bạn thêm gần đây để kiểm tra thông báo dữ liệu, hãy thêm 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)
    }
  1. Nếu bạn chạy lại ứng dụng và gửi thông báo bằng trình soạn thảo Thông báo, bạn sẽ thấy một thông báo giống như 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 ở nền trước hay nền sau.

Mã giải pháp nằm trong nhánh chính của mã được tải xuống.

Khóa học từ Udacity:

Tài liệu Firebase:

Để biết đường liên kết đến các lớp học lập trình khác trong khóa học này, hãy xem trang đích của Lớp học nâng cao cho Android trong Kotlin.