Article About this is available here.

This is demo app to implement FCM On Device Push Notification Scheduling using AlarmManager and WorkManager.

Show some :heart: and star the repo to support the project

GitHub stars GitHub forks GitHub watchers GitHub followers Twitter Follow Medium Article License

Introduction

  • We can use Cloud Pub/Sub with Firebase Cloud Functions to send FCM Push Notifications. But this solution is costly to implement.
  • Here, We are using regular FCM Push Notifications and scheduling it on device.

In this demo app, We are subscribing to a FCM Channel discount-offers. We'll receive Data payload from FCM to this subscribed channel and we will process and schedule it.

Dependencies

  • Firebase Messaging - Firebase Cloud Messaging Library.
  • Firebase IID - Firebase Instance ID Library.
  • WorkManager - Used for Background Work Processing.

Setup

  • Setup project in Firebase Console.
  • Download and paste google-services.json configuration file in /app directory.
  • Keep legacy API key for FCM Push Notification REST.

Implementation Structure

src
│
└───fcm
│   │   MyFirebaseMessagingService.kt
│   │   NotificationBroadcastReceiver.kt
│   │   ScheduledWorker.kt
│   
└───util
|   │   NotificationUtil.kt
|   │   SettingUtil.kt
|
└───ui
|   │   MainActivity.kt
|   
  • MyFirebaseMessagingService: FCM Receiver Service Implementation. Process of Notification Scheduling using AlarmManager is implemented here.
  • NotificationBroadcastReceiver: BroadcastReceiver Implementation. Executed when AlarmManager is triggered. WorkManager is initiated and executed for background processing.
  • ScheduledWorker: WorkManager Implementation. Notification is displayed in the system tray and other background processed are executed.

  • NotificationUtil: Implementation to display Notification on the system tray.

  • SettingUtil: Function implementation to check whether Automatic Date & Time setting is ON/OFF.

  • MainActivity: UI Implementation to subscribe to FCM Channel.

What's Happening? 🤔

  • Subscribe to discount-offers FCM Channel from Android Device.
  • Data Payload will be as follows
    { 
      "to": "/topics/discount-offers", 
      "priority": "high",
      "data" : {
        "title" : "TITLE_HERE",
        "message" : "MESSAGE_HERE",
        "isScheduled" : "true",
        "scheduledTime" : "2019-12-13 09:41:00"
      }
    }
    
    Format of scheduledTime: YYYY-MM-DD HH:MM:SS
  • Receive FCM on device and onMessageReceived() in MyFirebaseMessagingService will be invoked. In this, following operations will be done-
    • If isScheduled parameter received is false then notifications is displayed in system tray instantly.
    • If isScheduled is true then scheduledTime is parsed from payload and AlarmManager is used to set one-time alarm at that time and NotificationBroadcastReceiver implementation will be executed on that time.
    • In onReceive(), we have scheduled a WorkManager ScheduledWorker for background work processing. There in doWork(), we're finally we're displaying Notification on system tray. Do any background proessing and return status from WorkManager.

Hurrah!😍 we have successfully implemented On-Device Scheduling of FCM Push Notification👍.

Let's Test It

I have sent below payload with to the FCM Channel (discount-offers).

{ 
 "to": "/topics/discount-offers", 
 "priority": "high",
 "data" : {
  "title" : "🎅 Christmas Offer 🎄",
  "message" : "Grab 90% Discount 😍 on Mobile Phones",
  "isScheduled" : "true",
  "scheduledTime" : "2019-12-13 14:12:00"
 }
}

🚀See output below and notice that Internet/Wi-Fi is OFF still at exactly 02:12 pm I'm getting a notification on the system tray 😃.

Yippie 😍! It's working as expected. Hope you liked that. If you find it helpful please share this. Maybe it'll help someone needy!

:heart: Found this project useful?

If you found this project useful, then please consider giving it a :star: on Github and sharing it with your friends via social media.

Sharing is Caring!

Connect With Me

If you want to contact me, feel free to reach me… Visit My Profile.