I want to open application automatically when notification is received, is this possible with Firebase and new FCM notifications?
I know I can set click_action but that's only for customizing which activity will start on notification click, I need something that will start automatically when notification is received.
I tried the quick start messaging firebase sample and there is a onMessageReceived() method but it only works if the app is in foreground. Is there something that will execute while app is in background as well? GCM could do something like what I want here by directly starting activity intent from broadcast receiver which is called when notification is received.
Quick answer:
To automatically open an application via FCM you need to use a
data-message
, which guarantees to always invoke theFirebaseMessagingService.onMessageReceived()
method.Then you can add your logic in the
.onMessageReceived()
method to start the preferred activity.WARNING: launching a UI without any user interaction is a very very bad practice for most of the applications! Please read the MarkG answer here: How to start an Activity from a Service?
Full explaination:
FCM works similarly to GCM and can receive two types of messages:
payload
{"notification" : { "body" : "hello world"}}
These messages are automatically displayed when the app is in background and they call
FirebaseMessagingService.onMessageReceived()
if the app is already in foreground.payload
{"data" : { "key1" : "value1"}}
These messages always invoke
FirebaseMessagingService.onMessageReceived()
,even if the app is closed or in background.
click_action
is a parameter of the notification payload, thus it applies to the display-messages.https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
I summarize the steps here, hopefully it helpful
STEP 1
Following FCM user guide. Make sure everything work properly by pushing a message from Firebase console.
STEP 2
Change your custom FirebaseMessagingService class as following:
Now using Firebase console push messages again, you will found that
onMessageReceived
only fires when your app is in the foreground. Because Firebase console is able to sendNotification message
only. In order to sendData message
, we need step 3.STEP 3
Install Google Advanced REST client
Input below params:
YOUR_SERVER_KEY is available in the Firebase console > Settings pane > the Cloud Messaging tab
YOUR_DEVICE_FCM_TOKEN is
FirebaseInstanceId.getInstance().getToken()
ononTokenRefresh()
NOTE
Starting UI without user interaction is bad UX, you might need to replace start activity with start service or something in the background. I just use activity for testing purpose, so it will be more visual than service. Thanks @2ndgab for introducing to the Google Advanced REST client tool.
It looks like this section of the guide is the key to the puzzle of backgrounded apps:
Essentially, when the app is backgrounded, it's not truly responsive or running at this point. So instead, the message is delivered to the system tray. However, just below, the solution is explained.
[Android] If you are using Firebase Notifications (not Firebase Cloud Messaging) all you have to do is include Firebase Messaging in your build.gradle, and then link your app to a project on Firebase Console.
If your app is in the background, any message sent from the console will give you a system notifiction, which, if touched, will activate your app.
Take a look here: https://youtu.be/KpTSpVh9SfY?t=10m22s