android - Android 推送通知中的优惠和交易实现
问题描述
我已经使用 fcm 实现了推送通知,但我希望通知类似于 Flipkart,如果我向用户发布一些优惠和交易,如果用户单击推送通知,则必须重定向到该页面。我该如何实施?
解决方案
所以首先你需要一个独特的标签,例如。在通知中接收到的有效负载中的 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
根据您的要求修改以重定向到所需的活动或视图
推荐阅读
- android - Cannot control Progressbar visibility from onActivityResult in Fragment
- azure - 为 Azure Active Directory 打开所需的端口
- c# - 为什么我的 C# 代码不能按预期工作(数组转换,新手)
- typescript - 捆绑时在我的文件中导入模块包
- javascript - 下拉列表中所选值的不同显示
- jquery - 使用 ajaxrequest 调用 PHP 函数的 WP 插件
- html - Bootstrap 4 Toggler Dropdown 没有背景
- java - 存储自定义对象的理想方式是什么
- java - 删除文件以使其不可恢复的正确方法是什么?
- git - GIT API 来传输一个 Repo