I have implemented push notification using fcm, but I want the notification to be similar like Flipkart, If I post some any offers and deals to the user, the user must redirect to that page if he click on the push notification. How can I implement that?
2 Answers
Hello @Tirumalesh kallepalli you can achieve this by using PendingIntent from your FirebaseMessagingService class
Example
public class FcmListenerService extends FirebaseMessagingService {
private String msg;
NotificationHelper notificationHelper;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
JSONObject object = null;
try {
Map<String, String> params = remoteMessage.getData();
object = new JSONObject(params);
} catch (Exception e) {
}
sendNotification(object);
}
private void sendNotification(JSONObject object) {
//Here You can give your screen name whatever you want to open
//Instead of HomeActivity.class you can replace your activity
Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
try {
msg = object.getString("message");
} catch (JSONException e) {
e.printStackTrace();
}
Uri defaultSoundUri =
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new
NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_action_notification)
.setContentTitle("Firebase Push Notification")
.setContentText(msg)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
Just give the name of the activity in the Pending Intent nothing else i hope this will help you.

- 1,059
- 1
- 10
- 24
-
Hello @Tirumalesh kallepalli whenever you implement this and if you have faced any problem then please contact me and If your issue is solved than please accept the answer. Thanks :) – Nilesh Panchal May 25 '18 at 04:27
-
Thanks for the solution will let you know if it works – Tirumalesh kallepalli May 27 '18 at 15:58
So first of all you need an unique tag eg. notification_type or type etc inside the payload that is received in notification this type used to direct the PendingIntent to where it should be redirected.So assuming that you are familiar with FirebaseMessagingService you are managing the notification inside the class which extends FirebaseMessagingService
now inside that class define the object of PendingIntent
here is the step
private PendingIntent pendingIntent = null;
Handle notification like this
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// If the application is in the foreground handle both data and notification messages here.
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See showChatNotification method below.
//Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
// Log.d(TAG, "From: " + remoteMessage.getFrom());
//Logger.d(TAG + " getData: " + remoteMessage.getData().toString());
//Logger.d(TAG + " getData: " + remoteMessage.getNotification().getBody());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
Map<String, String> data = remoteMessage.getData();
setNotification(data);
} else {
Log.e(TAG, "Notificaiton");
}
}
Here i created method setNotification(data);
to perfrom event on notification received
private void showOtherNotification(Map<String, String> data) {
Date now = new Date();
uniqueId = now.getTime();
if (data.containsKey("type")) {
switch (data.get("type")) {
case "today_diss":
navigetToTodaysDisFragment(data);
break;
case "questionnaire":
navigetToQuestionaire(data);
break;
default:
navigateToHome();
break;
}
} else {
navigateToHome();
}
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder;
//Large Icon
Bitmap remote_picture = null;
try {
if (data.containsKey("image")) {
if (!data.get("image").isEmpty()) {
remote_picture = BitmapFactory.decodeStream(
(InputStream) new URL(data.get("image")).getContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
// this is a my insertion looking for a solution
int icon = getNotificationIcon();
if (data.containsKey("image") && remote_picture != null) {
notificationBuilder = new NotificationCompat.Builder(this,"default")
.setSmallIcon(icon)
.setContentTitle(getResources().getString(R.string.app_name))
.setStyle(new NotificationCompat.BigTextStyle().bigText(StringEscapeUtils.unescapeJava(data.get("message"))))
.setContentText(StringEscapeUtils.unescapeJava(data.get("message")))
.setAutoCancel(true)
.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary))
.setContentIntent(pendingIntent)
.setPriority(Notification.PRIORITY_MAX)
.setLargeIcon(remote_picture)
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(remote_picture)
.setBigContentTitle(getString(R.string.app_name))
.setSummaryText(StringEscapeUtils.unescapeJava(data.get("message"))));
} else {
notificationBuilder = new NotificationCompat.Builder(this,"default")
.setSmallIcon(icon)
.setContentTitle(getResources().getString(R.string.app_name))
.setStyle(new NotificationCompat.BigTextStyle().bigText(StringEscapeUtils.unescapeJava(data.get("message"))))
.setContentText(StringEscapeUtils.unescapeJava(data.get("message")))
.setAutoCancel(true)
.setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary))
.setContentIntent(pendingIntent)
.setPriority(Notification.PRIORITY_MAX);
}
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify((int) uniqueId, notificationBuilder.build());
}
Here i also provide you the solution to manage rich notification if your notification contains image you can display on the notification bar
Now if you can see there is peace of code
case "today_diss":
navigetToTodaysDisFragment(data);
break;
case "questionnaire":
navigetToQuestionaire(data);
break;
default:
navigateToHome();
break;
This is the main solution you need this methods will redirect you too the screen where you want to redirect so here I am giving you the example of navigateToHome();
This method will redirect you to the HomeScreen
private void navigateToHome() {
Intent intentToEventPage = new Intent(MyFirebaseMessagingService.this, DashActivity.class);
intentToEventPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intentToEventPage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
pendingIntent = PendingIntent.getActivity(this, (int) uniqueId /* Request code */, intentToEventPage, PendingIntent.FLAG_ONE_SHOT);
}
such way you can modify the pendingIntent
as per your requirement to redirect to the desired activity or view

- 2,281
- 1
- 14
- 22