Handle FCM in Background

Chandra Abdul Fattah
2 min readMay 8, 2018

--

Para android developer, pernahkah anda mengalami atau memikirkan bagaimana cara aplikasi android yang anda kembangkan dapat secara otomatis membuka aplikasi ketika ada sebuah trigger? Seperti LINE Call, Whatsapp Call, dan aplikasi social media yang memberikan fasilitas call. Ketika ada teman anda yang menelpon melalui fasilitas call tersebut meskipun aplikasi berada dalam mode background / kill app namun secara otomatis smartphone anda akan langsung menjalankan aplikasi yang dimaksud dan menampilkan halaman Receive Call.

Pada beberapa minggu kemarin saya mendapatkan kasus hampir serupa, masalah yang saya alami yaitu bagaimana caranya aplikasi langsung di jalankan ketika aplikasi yang saya kembangkan menerima trigger berupa push notification dari FCM meskipun aplikasi kita dalam mode background atau kill app. Pada dokumentasi FCM terdapat penjelasan bagaimana notifikasi dikirim pada aplikasi kita di bagian Receive and handle topic messages. Kita perlu memahami bagian kolom Notification dan kolom Data ada dua kata kunci yang menarik yang perlu kita pahami yaitu System Tray dan onMesageReceived.

Dari 2 kata kunci tersebut, kita harus memahami bagaimana System Tray bekerja dan di handle pada onMessageReceived. Untuk mengirimkan notifikasi pada FCM terdapat beberapa komponen JSON yang biasanya digunakan oleh para developer, contoh seperti berikut :

{
"to": "fcm_token_usernya/topic",
"notification": {
"title": "Notif Title",
"body": "Your Message",
"sound": "default"
},
"data": {}
}

Berdasarkan referensi yang saya temukan pada stackoverflow dan memahami beberapa penjelasan yang ada pada FCM, supaya kita bisa handle onMessageReceived ketika ada notifikasi masuk maka hapus atribut “notification” pada JSON yang dikirim. Namun ketika JSON yang dikirim tanpa menggunakan atribut “notification” dan menyimpan seluruh data yang akan dikirim pada atribut “data”, maka ketika aplikasi dalam keadaan foreground dan background developer harus membuat handling pada method onMessageReceive. Berbeda jika terdapat atribut “notification” maka developer hanya harus membuat handling ketika aplikasi dalam keadaan foreground saja. Kemudian developer harus membuat sendiri notifikasi yang mengacu pada dokumentasi pada android supaya aplikasi dapat menerima notifikasi ketika service mengirimkan request ke FCM.

{
"to": "fcm_token_usernya/topic",
"data": {
"title": "Notif Title",
"body": "Your Message",
"sound": "default",
"type": 1
}
}

Dengan dihilangkannya atribut notification pada JSON yang dikirimkan ke FCM, maka developer harus membuat handlingnya secara manual pada onMessageReceived contoh sebagai berikut :

public class MessagingService extends FirebaseMessagingService {@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
NotificationUtils.createNotification(1, remoteMessage.getNotification().getTitle(),
remoteMessage.getNotification().getBody(), this);
if (remoteMessage.getData() != null){
sendBroadcast(remoteMessage.getData().get("id"), remoteMessage.getData().get("type"));
}
}
private void sendBroadcast(String id, String type){
Intent intent = new Intent();
intent.setAction(AppConstans.NOTIFICATION);
intent.putExtra(AppConstans.ID, id);
intent.putExtra(AppConstans.TYPE, type);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}

Untuk dapat melakukan test sederhana apakah notifikasi berhasil di handle ketika foreground dan background, dapat dengan menggunakan Toast saja terlebih dahulu pada method onMessageReceived. Sedangkan untuk melakukan test dengan mengirim notifikasi ke FCM dapat dilakukan dengan menggunakan aplikasi postman dengan method POST :
API =
https://fcm.googleapis.com/fcm/send
Headers = Content-type: application/json, Authorization: key=your_key
Body = JSON yang telah dijelaskan di atas.

Demikian salah satu cara yang bisa digunakan untuk menghandle notifikasi ketika aplikasi pada mode background. Apabila masih ada yang belum dimengerti atau terdapat kekeliruan pada penjelasan saya bisa disampaikan melalui kolom komentar. Semoga bermanfaat, Terima Kasih.

--

--