Android - push notifications: purpose of FirebaseMessagingService class? - android

I've seen two tutorials about sending push messages from server with PHP to android devices through firebase cloud messaging and it works fine. But both tutorials have the FirebaseMessagingService class and I don't understand what's the purpose of it?? They don't explain a bit about it.
This is it:
class FirebaseMessagingService : com.google.firebase.messaging.FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
showNotification(remoteMessage!!.data["message"]!!)
}
private fun showNotification(message: String) {
val i = Intent(this, MainActivity::class.java)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent = PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT)
val builder = NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentTitle("FCM Test")
.setContentText(message)
.setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)
.setContentIntent(pendingIntent)
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.notify(0, builder.build())
}
}
Can I send push notifications from android with it? I just need to send push messages from PHP so can I delete it? The overview of my project is already messy and hard to follow and I don't want any useless stuff in there. Thanks in advance

This class is responsible for handling income message. The function onMessageReceived will be invoked when there is incoming data message no matter your app is in foreground or background. More specifically, this method is for you to customize the handling of key:value pair in data payload
You can leave it there if you are not going to do any special handling.
Please read here for more information.

Related

FCM Push Notifications are only displayed when app is in background

I am using the following code to receive and display push notifications:
override fun onMessageReceived(remoteMessage: RemoteMessage) {
if (remoteMessage.getNotification() != null) {
var title : String = remoteMessage.notification!!.title!!
var message : String = remoteMessage.notification!!.body!!
val intent = Intent(this, LoginCommonActivity::class.java)
intent.addflags(intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
var builder: NotificationCompat.Builder;
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//val notificationManager = NotificationManagerCompat.from(applicationContext)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel =
NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH)
notificationManager.createNotificationChannels(notificationChannel)
builder = NotificationCompat.Builder(applicationContext, notificationChannel.id)
} else {
builder = NotificationCompat.Builder(applicationContext)
}
builder = builder.setSmallIcon(R.drawable.ic_app_logo_black)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setDefaults(Notification.DEFAULT_ALL)
.setVibrate(longArrayOf(1000, 1000, 1000, 1000))
.setOnlyAlertOnce(true)
.setContentIntent(pendingIntent)
notificationManager.notify(System.currentTimeMillis().toInt(), builder.build())
}
}
But PNs' are only displayed when app is in background or closed. Debugging the FCMMessagingService, I can see that PNs' are being sent by the server and received in onMessageReceive(). It appears that the notify() method is not working, or something else in the code is failing.
As per this article, FCM notifications are handled by the internal Firebase service when the app is in background, else they are received in onMessageReceived() of FirebaseMessagingService when the app is in the foreground, and we have to manually display them with notify(). But this isn't working.
We've already seen this problem before here, here, here and here. But that was maybe when the old GCM features were still present in FCM. By this time FCM must have been completely overhauled.
My questions are:
What is the default protocol for handling push notifications if they arrive when the app is in the foreground?
Looking at other popular apps - WhatsApp, Google Pay, Zomato - I do not ever recall seeing a push notification when the app is in the foreground. Does this mean that push notifications never appear in the tray when the app is in the foreground?
If so, then what is the reason for having the NotificationManager.notify() function in the first place? If push notifications only appear when the app is in the background, and they are auto-handled by the Firebase service, then why is this method there at all? Is this just a relic of the old GCM library?
Can someone please point out where the problem is?
I will try to answer all your questions
First notification are of two types
1): Notification Payload ( Your's case)
2): Data Payload
1): Notification Payload
In notification payload
-If App in Background ( FCM will handle push notifications it self )
-If App in Foreground ( payload will receive in onMessageReceived we have to write our own logic to weather show notification or not )
2): Data Payload
In data payload
-If App in Background ( payload will receive in onMessageReceived we have to write our own logic to weather show notification or not )
-If App in Foreground ( payload will receive in onMessageReceived we have to write our own logic to weather show notification or not )
For Notification Please try using updated code from android guide using Compat library
https://developer.android.com/training/notify-user/build-notification#groovy
Just remove "notification" key from payload and provide only "data" key.
Application handles notification messages only if the app is in foreground but it handles data messages even if the application is in background or closed.
more info: https://stackoverflow.com/a/38850030/19892188

Push notification android basic questions

I am about it implement push notification from a node.js-server into my Android/kotlin-app.
Therefore i have used pusher.com which was very easy to implement for basic notifications
But: I want to create more costumizable notification, like a large image etc.
All the samples I find is about how to create a notification in Android.
e.g. this works great:
notificationManager = NotificationManagerCompat.from(this);
val largeIcon = BitmapFactory.decodeResource(resources, R.drawable.large)
val activityIntent = Intent(this, MainActivity::class.java)
val contentIntent = PendingIntent.getActivity(this, 0, activityIntent, 0)
val notification: Notification = NotificationCompat.Builder(this, App.CHANNEL_1_ID)
.setContentText("test")
.setContentTitle("test")
.setSmallIcon(R.drawable.heizungan)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setLargeIcon(largeIcon)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setStyle(NotificationCompat.BigTextStyle()
.bigText("test")
.setBigContentTitle("test")
.setSummaryText("Heizung"))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setColor(Color.RED)
.setContentIntent(contentIntent)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.build()
notificationManager!!.notify(1, notification)
Using this in my app, i can create and show this notification.
But how do I push this?
How can I push some values to my device and then show this notification?
Thanks
You would need a cloud service to actually send the notification to your device.
An example would be Firebase Cloud Messaging
As milhamj has already said you can use Firebase Cloud Messaging
How to do this... (click)
Find my answer for android service
On this link you have php code on backend that you can rewrite in javascript or check this link for nodejs
and java code for Android app (MyFirebaseMessagingService)

Force Grouping of Notifications?

According to the Notification Design Guidelines documentation:
If the same app sends four or more notifications and does not specify a grouping, the system automatically groups them together.
So I tested this out:
However, it only works when you have 4 or more notifications. I notice Messenger does this when you only have two notifications:
So my question is, can I tell the Android to always group my notifications like Messenger does? Or does Messenger use the setGroup() method that I would prefer not to use...
It's doable.
The concept is to make a group notification builder for grouping up notifications and apply same groupKey to other notification builder. And call NotificationManagerCompat.notify() to build group notification beforehand. So these notifications with same groupKey will group together.
You can add group notification builder with NotificationCompat.Builder.setGroup("GROUP_KEY") and NotificationCompat.Builder.setGroupSummary(true).
And add NotificationCompat.Builder.setGroup("GROUP_KEY") to other notifications.
val groupKey = "GROUP_KEY"
val groupBuilder = NotificationCompat.Builder(context, "CHANNEL_ID")
groupBuilder.apply {
setAutoCancel(true)
...
setGroupSummary(true)
setGroup(groupKey)
}
val builder = NotificationCompat.Builder(context, "CHANNEL_ID")
groupBuilder.apply {
setAutoCancel(true)
...
setGroup(groupKey)
}
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(NOTIFICATION_ID, groupBuilder.build())
notificationManager.notify(NOTIFICATION_TAG, NOTIFICATION_ID, builder.build())

real time notification by JSON format in android

i have an application about football/soccer , i'm using API for get information about the matches, i need a way to make a real time notification when a goal is added in this API which have a JSON format .
If you have access to your back end web service code, look into Google cloud messaging(gcm) service, it is made precisely for this purpose. If it is not feasible to use gcm, you need to set a repeating alarm, but it will not be as accurate as gcm. But I highly recommend going for gcm. Here's a link for your reference. GCM dev docs
Another work around for the case where you don't have access to source code for back end is to develop a middle layer sort of web service that keeps polling your back end and uses gcm to alert the clients. This way atleast you won't be wasting user's system resources.
This is how you pop a notification:
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.logo_notification)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setVibrate(new long[] { 200, 200, 200})
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, notificationBuilder.build()); //id is the notification id, if you use the same id, the notification will override the previous
In order to achieve the functionality,
Use a service to frequently(maybe once in 5 minutes) check information about the match.
If you have any Updates, show a notification to the user.
To show Notification:
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0);
Notification notification = new NotificationCompat.Builder(getApplicationContext()).setTicker("Ticker Text").setSmallIcon("Icon").setContentTitle("Title").setContentText("Content Text").setContentIntent(pi).setAutoCancel(true).build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0, notification);
For more info use this link
here
What you really want to do is have a Receiver that will run and check for updates. For real time updates, I would use a Socket.
It pretty much depends on your server.

How to make push notification without internet

me and my colleague are trying to show "push notification" message in mobile device. Colleague is telling that it canĀ“t be done without Google Cloud Messaging but I think - why use any server for that?
We want something like this:
How our application will work is:
- user has app on background
- ajax request is made (request to our server)
- server response is: You have 1 new message
- message is showed in top strip on mobile.
Of course, the message can be showed without internet.. My GF had mobile app "Pou"... when he pooped notification was displayed... Just I dont get it why to use any Google service for that?
Can somebody direct me pls?
You should use Notification to show "push notification".
private void showNotification() {
Intent notificationIntent = new Intent(this, MainActivity.class);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setAutoCancel(true)
.setTicker(getString(R.string.notification_ticker_text))
.setContentText(getString(R.string.notification_content_text))
.setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, 0))
.setWhen(System.currentTimeMillis())
.setContentTitle(getString(R.string.app_name))
.setDefaults(Notification.DEFAULT_ALL);
Notification notification = builder.build();
((NotificationManager) this.getSystemService(NOTIFICATION_SERVICE)).notify(0, notification);
}

Categories

Resources