Thông báo (Notification) trong android với Firebase Cloud Messaging – Phần 1

Xin chào mọi người, đã lâu rồi chúng ta không gặp nhau. Chắc hẳn các bạn đã quá quen thuộc với các thông báo (Notification) trên các ứng dụng di động như Messenger, Shopee,… Gần đây, mình đã tìm hiểu về Android và cách gửi và nhận thông báo như vậy bằng cách sử dụng Firebase Cloud Messaging. Mình muốn chia sẻ kiến thức này với các bạn, đặc biệt là những bạn mới làm quen với Android.

Firebase Cloud Messaging (FCM) là một dịch vụ gửi thông báo, tin nhắn đa nền tảng được cung cấp bởi Google. Nó cho phép bạn gửi tin nhắn và thông báo tới các thiết bị đã đăng ký với FCM một cách đáng tin cậy và hoàn toàn miễn phí.

Nguyên tắc hoạt động của FCM như sau: các thiết bị client sẽ đăng ký một device_token lên FCM. Các thông báo và tin nhắn được gửi từ website hoặc từ công cụ Notifications composer của Firebase. FCM sẽ nhận các thông báo này và gửi tới các thiết bị đã đăng ký với FCM từ trước. Khi các thiết bị có kết nối mạng, thông báo sẽ được gửi thành công tới ứng dụng.

FCM hỗ trợ hai loại thông báo và tin nhắn:

  • Notification messages: Đôi khi được gọi là “thông báo (tin nhắn) hiển thị”. Chúng được xử lý tự động bởi FCM SDK. Notification messages chứa các key dữ liệu đã được định nghĩa trước. Được sử dụng khi bạn chỉ muốn hiển thị thông báo đến các ứng dụng clients.
  • Data messages: Là thông báo (tin nhắn) sẽ được xử lý bởi các ứng dụng client. Data message chứa các cặp key – value do người dùng định nghĩa. Được sử dụng khi bạn muốn xử lý thông báo trên chính ứng dụng của bạn.
Có Thể Bạn Quan Tâm :  

Thông báo Firebase hoạt động khác nhau tùy thuộc vào trạng thái của ứng dụng (Background/Foreground). Để nhận thông báo Firebase, bạn cần tạo một service và kế thừa từ FirebaseMessagingService. Để xử lý các thông báo nhận được, bạn cần ghi đè phương thức onMessageReceived. Phương thức này có thể xử lý hầu hết các loại tin nhắn, trừ một số trường hợp sau:

  • Nhận Notification messages khi ứng dụng đang ở trạng thái background. Trong trường hợp này, thông báo sẽ được gửi đến khay hệ thống của thiết bị và khi người dùng chạm vào thông báo, ứng dụng sẽ mở trang chủ ứng dụng mặc định.
  • Nhận cả Notification messages và Data messages khi ứng dụng đang ở trạng thái background. Trong trường hợp này, phần Notification được gửi đến khay hệ thống, còn phần Data sẽ được sử dụng để xử lý các Activity khi chạm vào thông báo.

Dưới đây là cấu trúc của một Notification messages:

{ "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification":{ "title":"Portugal vs. Denmark", "body":"great match!" } } }

Các key notification, title, body là các key dữ liệu được định nghĩa sẵn trong Notification messages.

Tạo ứng dụng Android để xử lý nhận Notification messages

  1. Tạo một ứng dụng bằng Android Studio (phiên bản hiện tại là 3.2.1).
  2. Kết nối với Firebase:
    • Đầu tiên, đăng nhập vào Firebase console và tạo một project.
    • Mở ứng dụng được tạo trên Android Studio và kết nối với Firebase của bạn: đăng nhập vào tài khoản Google mà bạn đã sử dụng để tạo project và sau đó click vào Tools -> Firebase, chọn Cloud Messaging, click nút Setup và tiếp tục click nút Connect to Firebase để kết nối với project Firebase đã tạo từ trước: 😄 😄
    • Thêm Firebase Cloud Messaging (FCM) vào trong ứng dụng: thêm các dependency của FCM vào file build.gradle(app):
      dependencies {
        ....
        implementation 'com.google.firebase:firebase-core:16.0.6'
        implementation 'com.google.firebase:firebase-messaging:17.3.4'
      }
      apply plugin: 'com.google.gms.google-services'
      

      Sau khi thêm, hãy nhấn Sync Now ở góc trên bên phải của Android Studio để đồng bộ lại.

  3. Xử lý nhận thông báo và hiển thị thông báo nổi trên màn hình:

    Bạn cần tạo một service có tên là MyFirebaseService và kế thừa từ FirebaseMessagingService:

    public class MyFirebaseService extends FirebaseMessagingService {
        private static final String TAG = "MyFirebaseService";
        
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            if (remoteMessage.getNotification() != null) {
                Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
                sendNotification(remoteMessage.getNotification().getBody());
            }
        }
        
        @Override
        public void onNewToken(String token) {
            Log.d(TAG, "Refreshed token: " + token);
            sendRegistrationToServer(token);
        }
        
        private void sendRegistrationToServer(String token) {
            //TODO: Implement this method to send token to your app server.
        }
        
        private void sendNotification(String messageBody) {
            Intent intent = new Intent(this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
            
            String channelId = getString(R.string.project_id);
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_launcher_background)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_background))
                    .setContentTitle(getString(R.string.project_id))
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setPriority(NotificationManager.IMPORTANCE_HIGH)
                    .addAction(new NotificationCompat.Action(android.R.drawable.sym_call_missed, "Cancel", PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)))
                    .addAction(new NotificationCompat.Action(android.R.drawable.sym_call_outgoing, "OK", PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)));
            
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(channelId, "Channel human readable title", NotificationManager.IMPORTANCE_DEFAULT);
                notificationManager.createNotificationChannel(channel);
            }
            
            notificationManager.notify(0, notificationBuilder.build());
        }
    }

    Ở trên là giải thích sơ qua về các method được lập trình ở trên:

    • Mời bạn đọc thêm phần tiếng Anh để tìm hiểu chi tiết.

    Đăng ký service này bằng cách copy và paste đoạn code sau vào file AndroidManifest.xml:

    <service android:name=".Services.MyFirebaseService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    Build ứng dụng lên máy ảo hoặc thiết bị thật (mình dùng máy thật luôn). Vậy là bạn đã hoàn thành xong một ứng dụng nhỏ nhỏ để nhận thông báo. Bây giờ cùng chúng ta gửi thông báo để kiểm tra.

Có Thể Bạn Quan Tâm :   Interlaced là gì? Tính ứng dụng của Interlace trong Photoshop

Gửi Notification messages

Bạn có thể gửi Notification messages qua một ứng dụng web hoặc từ Notification Composer của Firebase. Trong bài tiếp theo về xử lý Data messages, mình sẽ hướng dẫn bạn gửi thông báo từ một ứng dụng web. Trong bài này, mình sẽ dùng Notification Composer cho đơn giản.

Có Thể Bạn Quan Tâm :   Hiện tượng học chay, học vẹt trong học sinh hiện nay

Đăng nhập vào Firebase console và chọn project đã được tạo từ trước. Trên thanh sidebar bên trái, chọn mục Cloud Messaging và click vào Send your first message. Tiếp theo, nhập nội dung thông báo, chọn ứng dụng Android bạn đã kết nối với Firebase và nhấn Publish để gửi thông báo:

Thông báo (Notification) trong android với Firebase Cloud Messaging - Phần 1

Đoạn minh họa

Mình sẽ thực hiện gửi Notification messages và ứng dụng sẽ nhận thông báo ở cả hai trạng thái Foreground và Background:

1. Ứng dụng ở trạng thái Foreground:

  • Màn hình thiết bị trước khi gửi Thông báo (Notification) trong android với Firebase Cloud Messaging - Phần 1
  • Nội dung thông báo
  • Kết quả Thông báo (Notification) trong android với Firebase Cloud Messaging - Phần 1 Thông báo (Notification) trong android với Firebase Cloud Messaging - Phần 1

2. Ứng dụng ở trạng thái Background:

  • Màn hình thiết bị trước khi gửi Thông báo (Notification) trong android với Firebase Cloud Messaging - Phần 1
  • Nội dung thông báo
  • Kết quả Thông báo (Notification) trong android với Firebase Cloud Messaging - Phần 1

Bạn có thể thấy rõ ràng, khi ứng dụng đang ở trạng thái Foreground, thông báo sẽ hiển thị nổi lên màn hình và có 2 button OK và Cancel. Ngược lại, khi ứng dụng đang ở trạng thái Background, thông báo chỉ có tiêu đề và nội dung mà không có 2 button được thêm. Đây là đặc điểm của loại thông báo Notification messages trong Firebase Cloud Messaging.

Qua bài viết này, mình đã giới thiệu với các bạn về thông báo (Notification) trong Android với Firebase Cloud Messaging. Và hướng dẫn các bạn gửi và nhận thông báo dạng Notification messages qua một ứng dụng đơn giản. Mình là newbie Android nên hy vọng bài viết này sẽ hữu ích cho các bạn, đặc biệt là những người mới làm quen với Android và Notification.

Ở phần 2, mình sẽ trình bày về loại thông báo Firebase khác là Data messages. Hãy giữ liên hệ để cùng khám phá trong bài viết tiếp theo (Phần 2 đã có).

Back to top button