我已经使用 fcm 实现了推送通知,但我希望通知类似于 Flipkart,如果我向用户发布一些优惠和交易,如果用户单击推送通知,则必须重定向到该页面。我该如何实施?
问问题
83 次
2 回答
0
所以首先你需要一个独特的标签,例如。在通知中接收到的有效负载中的 notification_type 或类型等,此类型用于将 PendingIntent 定向到应重定向的位置。因此,假设您熟悉 FirebaseMessagingService,您正在管理类中的通知,该类FirebaseMessagingService
现在在该类中扩展定义这里的对象PendingIntent
是步骤
private PendingIntent pendingIntent = null;
像这样处理通知
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");
}
}
在这里,我创建了setNotification(data);
在收到通知时执行事件的方法
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());
}
如果您的通知包含可以显示在通知栏上的图像,这里我还为您提供管理丰富通知的解决方案
现在,如果您可以看到代码很平静
case "today_diss":
navigetToTodaysDisFragment(data);
break;
case "questionnaire":
navigetToQuestionaire(data);
break;
default:
navigateToHome();
break;
这是您需要的主要解决方案,此方法也会将您重定向到您要重定向的屏幕,所以在这里我给您举个例子navigateToHome();
此方法会将您重定向到主屏幕
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);
}
这样,您可以pendingIntent
根据您的要求修改以重定向到所需的活动或视图
于 2018-05-25T04:46:18.753 回答
0
您好@Tirumalesh kallepalli,您可以通过使用 FirebaseMessagingService 类中的 PendingIntent 来实现这一点
例子
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());
}
只需在待定意图中给出活动的名称即可,我希望这会对您有所帮助。
于 2018-05-25T04:24:17.553 回答