Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Menerima pesan di aplikasi Android

Firebase notifications berperilaku berbeda tergantung letak aplikasi penerima berada di latar depan/latar belakang. Jika Anda ingin aplikasi yang berada di latar depan menerima pesan notifikasi atau pesan data, Anda harus menulis kode untuk menangani callback onMessageReceived. Penjelasan mengenai perbedaan antara pesan notifikasi dan pesan data dapat dibaca di bagian Jenis pesan.

Menangani pesan

Untuk menerima pesan, gunakan layanan yang memperluas FirebaseMessagingService. Layanan Anda harus mengganti callback onMessageReceived dan onDeletedMessages. Layanan Anda harus memproses pesan dalam waktu 20 detik sejak penerimaan (10 detik di Android Marshmallow). Rentang waktu mungkin lebih singkat bergantung pada penundaan OS yang terjadi sebelum panggilan onMessageReceived. Jika lebih dari rentang waktu itu, berbagai perilaku OS seperti batas eksekusi latar belakang Android O dapat mengganggu kemampuan Anda untuk menyelesaikan pekerjaan. Untuk mengetahui informasi lebih lanjut, lihat ringkasan kami mengenai prioritas pesan.

onMessageReceived disediakan untuk sebagian besar jenis pesan, dengan pengecualian berikut:

  • Pesan notifikasi yang dikirim saat aplikasi berada di latar belakang. Dalam hal ini, notifikasi dikirimkan ke baki sistem perangkat. Ketukan pada notifikasi oleh pengguna akan membuka peluncur aplikasi secara default.

  • Pesan dengan notifikasi dan payload data, saat diterima di latar belakang. Dalam hal ini, notifikasi dikirimkan ke baki sistem perangkat, dan payload data dikirimkan di bagian tambahan dari intent Aktivitas peluncur.

Rangkuman:

Status aplikasi Notifikasi Data Keduanya
Latar depan onMessageReceived onMessageReceived onMessageReceived
Latar belakang Baki sistem onMessageReceived Notifikasi: baki sistem
Data: di bagian tambahan dari intent.
Untuk informasi lebih lanjut tentang jenis pesan, lihat Notifikasi dan pesan data.

Mengedit manifes aplikasi

Untuk menggunakan FirebaseMessagingService, Anda perlu menambahkan hal berikut di manifes aplikasi:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Anda sebaiknya juga mengatur nilai default untuk menyesuaikan tampilan notifikasi. Anda dapat menentukan ikon dan warna default kustom yang diterapkan setiap kali nilai setara tidak ditetapkan dalam payload notifikasi.

Tambahkan baris berikut di dalam tag application untuk menetapkan ikon default kustom dan warna kustom:

<!-- 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/ic_stat_ic_notification" />
<!-- 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" />

Android menampilkan ikon default kustom untuk

  • Semua pesan notifikasi yang dikirim dari Notifications Composer.
  • Pesan notifikasi yang tidak secara eksplisit menetapkan ikon dalam payload notifikasi.

Android menggunakan warna default kustom untuk

  • Semua pesan notifikasi yang dikirim dari Notifications Composer.
  • Pesan notifikasi yang tidak secara eksplisit menetapkan warna dalam payload notifikasi.

Jika tidak ada ikon default kustom yang ditetapkan dan tidak ada ikon yang ditetapkan dalam payload notifikasi, Android akan menampilkan ikon aplikasi dengan warna putih.

Mengganti onMessageReceived

Dengan mengganti metode FirebaseMessagingService.onMessageReceived, Anda dapat melakukan tindakan berdasarkan objek RemoteMessage yang diterima dan mendapatkan data pesan:

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Kotlin+KTX

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Mengganti onDeletedMessages

Dalam beberapa situasi, FCM mungkin tidak mengirimkan pesan. Hal ini terjadi jika ada terlalu banyak pesan (>100) yang tertunda untuk aplikasi Anda pada perangkat tertentu saat terhubung atau jika perangkat belum terhubung ke FCM lebih dari satu bulan. Dalam hal ini, Anda mungkin akan menerima callback ke FirebaseMessagingService.onDeletedMessages(). Saat menerima callback ini, instance aplikasi harus melakukan sinkronisasi penuh dengan server aplikasi. Jika Anda belum mengirim pesan ke aplikasi pada perangkat tersebut dalam 4 minggu terakhir, FCM tidak akan memanggil onDeletedMessages().

Menangani pesan notifikasi dalam aplikasi latar belakang

Ketika aplikasi Anda berada di latar belakang, Android akan mengarahkan pesan notifikasi ke baki sistem. Ketukan pada notifikasi oleh pengguna akan membuka peluncur aplikasi secara default.

Pesan ini termasuk pesan yang berisi payload notifikasi dan payload data (dan semua pesan yang dikirim dari Notifications console). Dalam hal ini, notifikasi dikirim ke baki sistem perangkat dan payload data dikirim di bagian tambahan dari intent Aktivitas peluncur.

Untuk insight tentang pengiriman pesan ke aplikasi Anda, lihat dasbor pelaporan FCM, yang mencatat jumlah pesan yang dikirim dan dibuka di perangkat iOS dan Android, beserta data untuk "tayangan" (notifikasi yang dilihat oleh pengguna) untuk aplikasi Android.

Aplikasi yang Dibatasi Latar Belakang (Android P atau yang lebih baru)

FCM mungkin tidak akan mengirim pesan ke aplikasi yang dimasukkan ke pembatasan latar belakang oleh pengguna (seperti melalui: Setelan -> Aplikasi dan Notifikasi -> [nama aplikasi] -> Baterai). Setelah aplikasi Anda dihapus dari pembatasan latar belakang, pesan baru ke aplikasi akan dikirimkan seperti sebelumnya. Untuk mencegah pesan yang hilang dan dampak pembatasan latar belakang lainnya, pastikan untuk menghindari perilaku buruk yang dicantumkan dalam Android vitals. Perilaku ini dapat menyebabkan perangkat Android merekomendasikan kepada pengguna untuk menerapkan pembatasan latar belakang pada aplikasi. Aplikasi Anda dapat memeriksa apakah ada pembatasan latar belakang atau tidak menggunakan: isBackgroundRestricted().

Menerima pesan FCM dalam mode boot langsung

Developer yang ingin mengirim pesan FCM ke aplikasi bahkan sebelum perangkat yang dibuka kuncinya dapat mengaktifkan aplikasi Android untuk menerima pesan saat perangkat dalam mode boot langsung. Misalnya, Anda mungkin ingin agar pengguna aplikasi Anda menerima notifikasi alarm meskipun pada perangkat yang terkunci.

Saat mem-build kasus penggunaan ini, amati praktik terbaik dan pembatasan umum untuk mode boot langsung. Sangat penting untuk mempertimbangkan visibilitas pesan langsung yang diaktifkan dengan booting; setiap pengguna yang memiliki akses ke perangkat dapat melihat pesan ini tanpa memasukkan kredensial pengguna.

Prasyarat

  • Perangkat harus disiapkan untuk mode boot langsung.
  • Perangkat harus menginstal layanan Google Play versi terbaru (19.0.54 atau yang lebih baru).
  • Aplikasi harus menggunakan FCM SDK (com.google.firebase:firebase-messaging) untuk menerima pesan FCM.

Mengaktifkan penanganan pesan mode boot langsung di aplikasi Anda

  1. Di file Gradle level aplikasi, tambahkan dependensi pada support library boot langsung FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Buat boot langsung FirebaseMessagingService aplikasi menyadarinya dengan menambahkan atribut android:directBootAware="true" dalam manifes aplikasi:

    <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false"
        android:directBootAware="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    

Penting untuk memastikan bahwa FirebaseMessagingService ini dapat dijalankan dalam mode boot langsung. Periksa persyaratan berikut:

  • Layanan tidak boleh mengakses penyimpanan yang dilindungi kredensial saat dijalankan dalam mode boot langsung.
  • Layanan tidak boleh mencoba menggunakan komponen, seperti Activities, BroadcastReceivers, atau Services lain yang tidak ditandai sebagai sadar boot langsung saat dijalankan dalam mode boot langsung.
  • Library apa pun yang digunakan oleh layanan ini juga tidak boleh mengakses penyimpanan yang dilindungi kredensial atau memanggil komponen non-directBootAware saat dijalankan dalam mode boot langsung. Artinya, library apa pun yang digunakan oleh aplikasi yang dipanggil dari layanan harus ditandai sebagai sadar boot langsung, atau aplikasi harus memeriksa apakah library tersebut dijalankan dalam mode boot langsung dan tidak memanggilnya dalam mode tersebut. Misalnya, Firebase SDK berfungsi dengan boot langsung (dapat disertakan dalam aplikasi tanpa mengalami error dalam mode booting langsung), tetapi banyak Firebase API tidak didukung untuk dipanggil dalam mode boot langsung.
  • Jika aplikasi menggunakan Application kustom, Application juga harus ditandai sebagai sadar boot langsung (tidak ada akses ke penyimpanan yang dilindungi kredensial dalam mode boot langsung).

Untuk mendapatkan panduan tentang cara mengirim pesan ke perangkat dalam mode boot langsung, lihat Mengirim pesan langsung yang diaktifkan dengan booting.