I am using XMPP (smack) to create a messaging application and I am sending notifications whenever I receive a new message. The problem is that if I receive messages from two different users I can only see the last notification. How can I change it? Here is my code.
Intent thisIntent = new Intent(mApplicationContext, ChatActivity.class);
thisIntent.putExtra("EXTRA_CONTACT_JID",contactJid);
PendingIntent contentIntent = PendingIntent.getActivity(mApplicationContext, 0, thisIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b = new NotificationCompat.Builder(mApplicationContext);
b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.fab_bg_mini)
.setTicker("Hearty365")
.setContentTitle("New message")
.setContentText(" You received a new message from " + contactJid)
.setContentIntent(contentIntent)
.setContentInfo("Info");
if(!ChatActivity.active){
b.setDefaults(Notification.DEFAULT_LIGHTS| Notification.DEFAULT_SOUND);
}
NotificationManager notificationManager = (NotificationManager) mApplicationContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, b.build());
And as you can see I put an extra contactJid which is important to me. I need to set it in such a way that if a user clicks one notification its contactJid will be this and if another its contactJid will be another.
notificationManager.notify(1, b.build()); is your problem - you need to supply a unique identifier for this notification, as per the documentation:
If a notification with the same id has already been posted by your application and has not yet been canceled, it will be replaced by the updated information.
You are supplying the constant 1 for each notification, instead of a unique ID. I'd suggest using a hash of the contact JID (which I assume is a string):
notificationManager.notify(contactJid.hashCode(), b.build());
Related
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)
I am simultaneously developing two Android applications that are communicating with each other, and I am using notifications to show received messages. This is the code I am using to show a notification:
private void showNotification(String title, String content) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("default",
"NOTIF_CHANNEL",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("CHANNEL FOR INFORMING ABOUT MESSAGE RECEIVED");
mNotificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), "default")
.setSmallIcon(R.mipmap.ic_launcher) // notification icon
.setContentTitle(title) // title for notification
.setContentText(content)// message for notification
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI) // set alarm sound for notification
.setAutoCancel(true); // clear notification after click
Intent intent = getPackageManager()
.getLaunchIntentForPackage(getPackageName())
.setPackage(null)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
mBuilder.setContentIntent(pi);
mNotificationManager.notify(0, mBuilder.build());
}
In one of my applications, this works flawlessly every time, but in the other it never works. I am using the exact same code and running the applications on the same device.
I am curious as to if someone is able to identify or make a guess on factors that would make a difference here. I have tried using the same icon, title, content, and sound, but to no avail. Any help or suggestions would be greatly appreciated!
If your code is working in one app but not in the other, and the code is exactly the same, surely you are using distinct versions of support library and/or distinct targetSdkVersion. Set the same of the app which works in the other that doesn't works.
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.
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);
}
After reading multiple posts I have tried everything to generate a new notification for every alert using unique id. However this is not working. Following is my code:-
//Generate random id for notification
Random r=new Random();
int id=r.nextInt(9999);
PendingIntent intent =PendingIntent.getActivity(getApplicationContext(), id, notificationIntent, 0);
Builder notice2=new Notification.Builder(getApplicationContext())
.setContentTitle(call.getName())
.setAutoCancel(true)
.setContentIntent(intent)
.setContentText("Context")
.setSmallIcon(com.project.calltracker.R.drawable.ic_alert)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), com.project.calltracker.R.drawable.ic_logo));
startForeground(id, notice2.getNotification());
As you can see I am using a random integer as Id each time I generate a notification. But still I only get a single notification no matter how many times I startForeground is called??
Please help!
Thanks!
That's because there's always just ONE foreground service running. Services are singletons by nature, there can't be 2 instances of the same service running.
If you want to just send multiple notifications you should use the notification manager, notify() method
You dont have to generate a random id, using a sequence of ids will be more safe and ensure that all the ids are unique
PendingIntent intent = null;
Builder notice2=null;
int N = 1000; //set this value
for(int id=1;id<N; id++){
intent =PendingIntent.getActivity(getApplicationContext(), id, notificationIntent, 0);
notice2=new Notification.Builder(getApplicationContext())
.setContentTitle(call.getName())
.setAutoCancel(true)
.setContentIntent(intent)
.setContentText("Context")
.setSmallIcon(com.project.calltracker.R.drawable.ic_alert)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), com.project.calltracker.R.drawable.ic_logo));
startForeground(id, notice2.getNotification());
}
I hope it helps